Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:daw:daw:2eval:tema08 [2024/02/03 23:10] admin [Proxy con Nginx] |
clase:daw:daw:2eval:tema08 [2024/02/16 10:24] (actual) admin [Gestión de Redes] |
||
---|---|---|---|
Línea 14: | Línea 14: | ||
El comando '' | El comando '' | ||
- | <shx> | + | <sxh> |
docker build -t nombre_imagen: | docker build -t nombre_imagen: | ||
- | </shx> | + | </sxh> |
Donde: | Donde: | ||
Línea 23: | Línea 23: | ||
* Ejemplo de uso: Crea la imagen llamada '' | * Ejemplo de uso: Crea la imagen llamada '' | ||
- | <shx> | + | <sxh> |
docker build -t mi_aplicacion_web: | docker build -t mi_aplicacion_web: | ||
- | </shx> | + | </sxh> |
- | ===== Estructura Básica del Dockerfile | + | ==== Estructura Básica del Dockerfile ==== |
Un Dockerfile contiene instrucciones para la construcción de una imagen. Aquí se muestra una estructura básica: | Un Dockerfile contiene instrucciones para la construcción de una imagen. Aquí se muestra una estructura básica: | ||
Línea 44: | Línea 44: | ||
# Expone un puerto en el contenedor | # Expone un puerto en el contenedor | ||
EXPOSE puerto | EXPOSE puerto | ||
+ | |||
+ | #El directorio de trabajo | ||
+ | WORKDIR /directorio | ||
# Define variables de entorno | # Define variables de entorno | ||
Línea 58: | Línea 61: | ||
<sxh> | <sxh> | ||
- | # Comentario: Descripción del propósito de la imagen | + | FROM eclipse-temurin:17.0.10_7-jdk |
- | FROM imagen_base:version | + | |
</ | </ | ||
Línea 67: | Línea 69: | ||
<sxh> | <sxh> | ||
- | RUN comando1 | + | RUN mkdir /opt/app |
- | RUN comando2 | + | |
</ | </ | ||
Línea 75: | Línea 76: | ||
- **COPY**: Copia archivos desde la ruta de origen en la máquina host hacia el contenedor en la ruta de destino. | - **COPY**: Copia archivos desde la ruta de origen en la máquina host hacia el contenedor en la ruta de destino. | ||
<sxh> | <sxh> | ||
- | COPY origen destino | + | COPY / |
</ | </ | ||
Línea 84: | Línea 85: | ||
<sxh> | <sxh> | ||
- | EXPOSE | + | EXPOSE |
</ | </ | ||
+ | - **WORKDIR**: | ||
+ | <sxh> | ||
+ | WORKDIR /opt/app | ||
+ | </ | ||
- **ENV**: Define variables de entorno dentro del contenedor. | - **ENV**: Define variables de entorno dentro del contenedor. | ||
<sxh> | <sxh> | ||
- | ENV variable=valor | + | ENV ENTORNO=produccion |
</ | </ | ||
Línea 100: | Línea 105: | ||
<sxh> | <sxh> | ||
- | CMD ["comando", "argumento"] | + | CMD ["java", "-jar","/ |
</ | </ | ||
Línea 108: | Línea 113: | ||
</ | </ | ||
+ | ==== Ejemplo: Ejecutar app java ==== | ||
+ | * Una imagen basada en el JDK 17 | ||
+ | * Copia el fichero de la máquina real que está en ''/ | ||
+ | * Ejecuta el japp.jar | ||
- | + | <sxh base> | |
- | ===== Gestión de Redes ===== | + | FROM eclipse-temurin:17.0.10_7-jdk |
- | Docker permite crear redes aisladas entre los distintos contenedores. De esa forma , si un contenedor es atacado, no se tendrá acceso por red al resto de los contenedores sino únicamente a los de su propia red. | + | RUN mkdir /opt/app |
- | + | COPY /opt/peliculas/target/japp.jar /opt/app | |
- | ^ Orden ^ Explicación | + | CMD [" |
- | | [[https://docs.docker.com/ | + | </ |
- | | [[https://docs.docker.com/ | + | |
- | | [[https://docs.docker.com/engine/reference/ | + | |
- | | [[https:// | + | |
- | | [[https:// | + | |
- | + | ||
- | + | ||
- | Para trabajar con redes, lo que debemos hacer es | + | |
- | + | ||
- | * Primero crear la red: | + | |
- | + | ||
- | docker network create nombreDeLaRed | + | |
- | + | ||
- | * Conectar un contenedor a esa red | + | |
- | + | ||
- | docker network connect nombreDeLaRed nombreDelContenedor | + | |
- | + | ||
- | * También podemos conectar la red al contenedor al usar '' | + | |
- | + | ||
- | docker container run \ | + | |
- | -dit \ | + | |
- | | + | |
- | -e MYSQL_ROOT_PASSWORD=root | + | |
- | -p 4000: | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | \\ | + | |
- | \\ | + | |
- | \\ | + | |
===== Docker Compose ===== | ===== Docker Compose ===== | ||
- | Docker Compose es una herramienta que permite definir y administrar aplicaciones Docker de múltiples contenedores. Utiliza un archivo YAML para configurar los servicios, las redes y los volúmenes, facilitando la definición y el despliegue de aplicaciones complejas. | + | Docker Compose es una herramienta que permite definir y administrar aplicaciones Docker de múltiples contenedores. Utiliza un archivo |
==== Estructura Básica de un archivo docker-compose.yml ==== | ==== Estructura Básica de un archivo docker-compose.yml ==== | ||
- | Un archivo | + | Un archivo |
<sxh> | <sxh> | ||
Línea 176: | Línea 155: | ||
==== Comandos Básicos de Docker Compose ==== | ==== Comandos Básicos de Docker Compose ==== | ||
- | - Iniciar la aplicación basada en la configuración de `docker-compose.yml`. | + | - Iniciar la aplicación basada en la configuración de '' |
<sxh bash> | <sxh bash> | ||
Línea 182: | Línea 161: | ||
</ | </ | ||
- | - Detener y eliminar los contenedores definidos en el archivo | + | - Detener y eliminar los contenedores definidos en el archivo |
<sxh bash> | <sxh bash> | ||
Línea 188: | Línea 167: | ||
</ | </ | ||
- | - Muestra el estado de los contenedores definidos en el archivo | + | - Muestra el estado de los contenedores definidos en el archivo |
<sxh bash> | <sxh bash> | ||
Línea 196: | Línea 175: | ||
==== Ejemplo de Uso ==== | ==== Ejemplo de Uso ==== | ||
- | Supongamos un archivo | + | Supongamos un archivo |
<sxh> | <sxh> | ||
Línea 236: | Línea 215: | ||
+ | ===== Gestión de Redes ===== | ||
+ | Docker permite crear redes aisladas entre los distintos contenedores. De esa forma , si un contenedor es atacado, no se tendrá acceso por red al resto de los contenedores sino únicamente a los de su propia red. | ||
+ | ^ Orden ^ Explicación | ||
+ | | [[https:// | ||
+ | | [[https:// | ||
+ | | [[https:// | ||
+ | | [[https:// | ||
+ | | [[https:// | ||
+ | Para trabajar con redes, lo que debemos hacer es | ||
+ | * Primero crear la red: | ||
+ | docker network create nombreDeLaRed | ||
- | ===== Ejercicios ===== | + | * Conectar un contenedor a esa red |
+ | docker network connect nombreDeLaRed nombreDelContenedor | ||
- | <note important> | + | * También podemos conectar |
+ | docker container run \ | ||
+ | -dit \ | ||
+ | -v / | ||
+ | -e MYSQL_ROOT_PASSWORD=root | ||
+ | -p 4000: | ||
+ | | ||
+ | | ||
+ | | ||
- | <note important> | + | \\ |
+ | \\ | ||
+ | \\ | ||
- | ==== Ejercicio 1 ==== | ||
- | Crea un contenedor llamado " | ||
- | * Crea la table " | ||
- | * Su puerto externo es el 2010 | ||
- | * Conectado a la red " | ||
- | * Que el nombre del host sea " | ||
- | \\ | + | ===== Proxy con Nginx ===== |
+ | ¿Recuerdas la cabecera '' | ||
- | Crea un contenedor llamado " | + | Pues vamos ahora a configurar Docker para que todos los servidores compartan |
- | * Crea la table " | + | |
- | * Su puerto | + | |
- | * Conectado | + | |
- | * Que el nombre del host sea " | + | |
- | ==== Ejercicio 2 ==== | + | Para arrancar |
- | Crea un contenedores llamado " | + | |
- | * Crea una página llamada index.php que | + | |
- | * Se conecte a la base de datos llamada " | + | |
- | * Incluya un título llamado " | + | |
- | * Su puerto externo es el 3010 | + | |
- | * Utiliza el fichero '' | + | |
- | * Conectado a la red " | + | |
- | <note tip>En vez de crear tu el código PHP puedes usar el siguiente:{{ :clase:daw:daw: | + | sudo docker container run \ |
+ | -dit \ | ||
+ | -p 80:80 \ | ||
+ | --restart always \ | ||
+ | -v / | ||
+ | --name nginx-proxy \ | ||
+ | nginxproxy/ | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | Como vemos no tiene nada de especial excepto la línea '' | ||
+ | |||
+ | Y ahora , ¿Como arrancamos nuestro servidores web? Pues simplemente hay que añadir dos parámetros y quitar uno. | ||
+ | * Y hay que quitar el parámetro de '' | ||
+ | * Hay que añadir: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Veamos el siguiente ejemplo: | ||
+ | |||
+ | sudo docker container run \ | ||
+ | -dit \ | ||
+ | -v / | ||
+ | -e VIRTUAL_PORT=80 | ||
+ | -e VIRTUAL_HOST=lorenzo.daw2.pve3.fpmislata.com | ||
+ | --name lorenzo_apache \ | ||
+ | php: | ||
+ | |||
+ | Vemos que el servidor está escuchando en el puerto 80 y va a gestionar las peticiones del dominio // | ||
+ | |||
+ | |||
+ | <note tip>Los servidores de Base de datos u otros contenedores que no son el servidor web no tienen que hacer nada especial por usar Nginx ya que no se accede a ellos a través del proxy sino directamente a ellos o únicamente de forma interna.</ | ||
+ | |||
+ | |||
+ | Mas información: | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | ==== El fichero hosts ==== | ||
+ | Ahora para que funcione el proxy con nginx ya no podemos acceder a la máquina real con la IP sino que habrá que usar el nombre de dominio. Si no tenemos acceso a un nombre de dominio real, podemos simular nosotros uno modificando el fichero '' | ||
+ | |||
+ | El fichero hosts simplemente contiene IPs y nombre e dominio que usará nuestro ordenador. De esa forma simularemos tener un dominio. | ||
+ | |||
+ | En los siguientes artículos se explica como modificar el fichero hosts | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | \\ | ||
+ | \\ | ||
\\ | \\ | ||
- | Crea un contenedores llamado " | ||
- | * Crea una página llamada index.php que | ||
- | * Se conecte a una de las bases de datos " | ||
- | * Incluya un título llamado "Soy el servidor Web B" | ||
- | * Su puerto externo es el 3020 | ||
- | * Utiliza el fichero '' | ||
- | * Conectado a la red " | ||
- | <note tip>En vez de crear tu el código PHP puedes usar el siguiente: | ||
- | ==== Ejercicio 3 ==== | ||
- | Modifica únicamente el fichero '' | ||
- | Vuelve a dejar las conexiones como estaban antes del ejercicio. | ||
- | ==== Ejercicio 4 ==== | ||
- | Crea ahora dos redes llamadas: | ||
- | * red_a | ||
- | * red_b | ||
- | Vuelve a crear los 4 contenedores de antes pero de forma que cada uno esté asociado a una red distinta. | ||
- | ^ Contenedor ^ Red ^ | ||
- | | apache_a | red_a | | ||
- | | maria_a | red_a | | ||
- | | apache_b | red_b | | ||
- | | maria_b | red_b | | ||
- | Prueba que los 2 servidores web siguen funcionando y accediendo a sus bases de datos correspondientes. | + | ===== Ejercicios ===== |
- | ==== Ejercicio | + | ==== Ejercicio |
- | Modifica únicamente el fichero | + | Crea una imagen de docker basada en '' |
+ | | ||
+ | | ||
- | Vuelve a dejar las conexiones como estaban antes del ejercicio, es decir todas conectadas a " | ||
- | ==== Ejercicio 6 ==== | ||
- | Hasta ahora para acceder a cada servidor web usabas los puertos '' | ||
- | En esa máquina haz lo siguiente | + | La imagen se llamará '' |
- | * Crear un contenedor | + | Crea un contenedor |
- | * Indicando que la variable | + | |
- | * Indicando | + | |
- | * Deberás incluir | + | |
- | * Que la carpeta compartida esté en '' | + | |
- | * El código fuente de PHP lo copias | + | |
- | * Crear un contenedor " | + | |
- | * En la base de datos crea la tabla y los datos que necesites. | + | |
- | * Que la carpeta compartida esté en ''/ | + | |
- | Prueba a navegar la siguientes url (y deberá funcionar): | ||
- | * < | ||
+ | ==== Ejercicio 2:Sin crear imagen ==== | ||
+ | En la imagen '' | ||
+ | |||
+ | Así que ejecuta un '' | ||
+ | |||
+ | <sxh base> | ||
+ | sudo docker container run \ | ||
+ | -v / | ||
+ | eclipse-temurin: | ||
+ | java -jar /tmp/mi.jar | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | En la orden '' | ||
+ | </ | ||
+ | |||
+ | ==== Ejercicio 3:Maven ==== | ||
+ | Ahora vamos a generar el '' | ||
+ | |||
+ | |||
+ | Para hacerlo hay que poner el código fuente en ''/ | ||
+ | |||
+ | <sxh base> | ||
+ | sudo docker container run \ | ||
+ | -v / | ||
+ | -w / | ||
+ | maven: | ||
+ | mvn clean package | ||
+ | </ | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | En la orden '' | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | ¿Que opciones usarás? | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * ???? | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Ejercicio 4:Deploy ==== | ||
+ | Has un script en la máquina real llamado '' | ||
+ | * Se baje el código fuente de git | ||
+ | * Genere el '' | ||
+ | * Ejecute el '' | ||
+ | |||
+ | ==== Ejercicio 5:MySQL ==== | ||
+ | Crea ahora una base de datos MySQL en un contenedor docker de forma que sea la que estás usando en el módulo de servidor. | ||
+ | Rellena la base de datos con los datos. | ||
+ | |||
+ | ==== Ejercicio 6:Deploy proyecto ==== | ||
+ | Compila y desplega el proyecto que usas en el módulo de servidor de forma que se genere el '' | ||
+ | |||
+ | |||
+ | ==== Ejercicio 7:Deploy proyecto ==== | ||
+ | Modifica el proyecto de Maven de forma que tambien se haga lo necesario para " | ||
+ | |||
+ | |||
+ | |||
+ | <note tip> | ||
+ | Hasta aquí han sido los ejercicios para el despliegue automático, | ||
+ | </ | ||
- | ==== Ejercicio | + | ==== Ejercicio |
- | Crea un proyecto Web en GitHub llamado " | + | Prueba ahora a modificaar el código de forma que te conectes al MySQL de tu compañero. Deberá dejarte. |
- | * Código PHP | + | |
- | * Código SASS | + | |
- | * Muestre desde PHP información de la base de datos. | + | |
- | El proyecto es similar al anterior solo que ahora también hay código SASS. | ||
- | Incluye en el proyecto un script de bash llamado | + | ==== Ejercicio 9:Red ==== |
- | * Copiar el código de '' | + | Crea ahora una red llamada |
- | * Compilar en '' | + | |
- | * Borrar los contenedores de Docker que vaya a crear (por si ya existen), que son " | + | |
- | * Copiar el contenido de la carpeta '' | + | |
- | * Crear el contenedor de Docker del servidor Web " | + | |
- | * Crear el contenedor de Docker de la base de datos " | + | |
+ | Modifica la creación de los contenedores para que estén asociados a la red que acabas de crear. | ||
- | En la máquina real ves a la carpeta ''/ | + | Prueba |
+ | ==== Ejercicio 10: MySQL compañero ==== | ||
+ | Prueba ahora a modificaar el código de forma que te conectes al MySQL de tu compañero. No debería dejarte ya que estáis en redes distintas. | ||
- | Para probar | + | ==== Ejercicio 11: Docker compose ==== |
+ | Modifica el script '' | ||
- | cd / | + | Para ello deberás crear un fichero llamado '' |
- | git fetch --prune --force | + | |
- | git checkout master | + | |
- | git merge --ff-only origin/ | + | |
- | npm run deploy | + | |
- | Prueba a navegar a < | ||