Herramientas de usuario

Herramientas del sitio


clase:daw:daw:2eval:tema08

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
clase:daw:daw:2eval:tema08 [2024/02/03 23:09]
admin [Docker Compose]
clase:daw:daw:2eval:tema08 [2024/02/16 10:24] (actual)
admin [Gestión de Redes]
Línea 14: Línea 14:
 El comando ''docker build'' se utiliza para construir imágenes de contenedor Docker a partir de un Dockerfile. A continuación se presentan las principales características y uso de este comando. El comando ''docker build'' se utiliza para construir imágenes de contenedor Docker a partir de un Dockerfile. A continuación se presentan las principales características y uso de este comando.
  
-<shx>+<sxh>
   docker build -t nombre_imagen:etiqueta ruta_del_dockerfile   docker build -t nombre_imagen:etiqueta ruta_del_dockerfile
-</shx>+</sxh>
  
 Donde: Donde:
Línea 23: Línea 23:
  
   * Ejemplo de uso: Crea la imagen llamada ''mi_aplicacion_web:1.0'' sabiendo que el fichero ''Dockerfile'' está en la carpeta actual.   * Ejemplo de uso: Crea la imagen llamada ''mi_aplicacion_web:1.0'' sabiendo que el fichero ''Dockerfile'' está en la carpeta actual.
-<shx>+<sxh>
 docker build -t mi_aplicacion_web:1.0 . docker build -t mi_aplicacion_web:1.0 .
-</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  # Especifica la imagen base+
 </sxh> </sxh>
  
Línea 67: Línea 69:
  
 <sxh> <sxh>
-RUN comando1 +RUN mkdir /opt/app
-RUN comando2+
 </sxh> </sxh>
  
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 /opt/peliculas/target/japp.jar /opt/app
 </sxh> </sxh>
  
Línea 84: Línea 85:
  
 <sxh> <sxh>
-EXPOSE puerto+EXPOSE 8080
 </sxh> </sxh>
  
 +- **WORKDIR**: Establece el directorio de trabajo para cualquier instrucción posterior en el Dockerfile.
  
 +<sxh>
 +WORKDIR /opt/app
 +</sxh>
  
 - **ENV**: Define variables de entorno dentro del contenedor. - **ENV**: Define variables de entorno dentro del contenedor.
  
 <sxh> <sxh>
-ENV variable=valor+ENV ENTORNO=produccion
 </sxh> </sxh>
  
Línea 100: Línea 105:
  
 <sxh> <sxh>
-CMD ["comando", "argumento"]+CMD ["java", "-jar","/opt/app/japp.jar"]
 </sxh> </sxh>
  
Línea 108: Línea 113:
 </note> </note>
  
 +==== Ejemplo: Ejecutar app java ====
 +  * Una imagen basada en el JDK 17 
 +  * Copia el fichero de la máquina real que está en ''/opt/peliculas/target/japp.jar'' dentro de loa imagen en la carpeta ''/opt/app''
 +  * Ejecuta el japp.jar
 +
 +<sxh base>
 +FROM eclipse-temurin:17.0.10_7-jdk
 +RUN mkdir /opt/app
 +COPY /opt/peliculas/target/japp.jar /opt/app
 +CMD ["sh", "-c" , "-jar","/opt/app/japp.jar"]
 +</sxh>
 +
 +
 +===== Docker Compose =====
 +Docker Compose es una herramienta que permite definir y administrar aplicaciones Docker de múltiples contenedores. Utiliza un archivo [[https://es.wikipedia.org/wiki/YAML|YAML]] para configurar los servicios, las redes y los volúmenes, facilitando la definición y el despliegue de aplicaciones complejas.
 +
 +==== Estructura Básica de un archivo docker-compose.yml ====
 +
 +Un archivo ''docker-compose.yml'' define la configuración de una aplicación multi-contenedor. Aquí se presentan las secciones principales:
 +
 +<sxh>
 +version: '3' 
 +
 +services: 
 +  servicio1:
 +    image: imagen_servicio1
 +    restart: opciones si se reinicia el servidor
 +    hostname: nombre del host 
 +    volumes:
 +      - /ruta/host:/ruta/contenedor
 +    ports:
 +      - "puerto_host:puerto_contenedor"
 +    environment:
 +      - VARIABLE=valor
 +
 +  servicio2:
 +    # Configuración del segundo servicio
 +</sxh>
 +
 +
 +==== Comandos Básicos de Docker Compose ====
 +
 +  - Iniciar la aplicación basada en la configuración de ''docker-compose.yml''.
 +
 +<sxh bash>
 +docker-compose up
 +</sxh>
 +
 +  - Detener y eliminar los contenedores definidos en el archivo ''docker-compose.yml''.
 +
 +<sxh bash>
 +docker-compose down
 +</sxh>
 +
 +- Muestra el estado de los contenedores definidos en el archivo ''docker-compose.yml''.
 +
 +<sxh bash>
 +docker-compose ps
 +</sxh>
 +
 +==== Ejemplo de Uso ====
 +
 +Supongamos un archivo ''docker-compose.yml'' para una aplicación web con un servicio de frontend y otro de base de datos:
 +
 +<sxh>
 +version: '3'
 +
 +services:
 +  peliculas_java:
 +    image: temurin_peliculas
 +    restart: always
 +    hostname: peliculas_java
 +    volumes:
 +      - /opt/peliculas/target:/opt/app
 +    ports:
 +      - "80:8080"
 +  peliculas_mysql:
 +    image: mysql:8.3.0
 +    restart: always
 +    hostname: peliculas_java
 +    environment:
 +      - MYSQL_ROOT_PASSWORD=peliculas
 +      - MYSQL_DATABASE=peliculas
 +      - MYSQL_USER=peliculas
 +      - MYSQL_PASSWORD=peliculas
 +</sxh>
 +
 +Para iniciar esta aplicación, ejecutamos:
 +
 +<sxh>
 +docker-compose up
 +</sxh>
 +
 +Esto levantará los contenedores de frontend y base de datos con la configuración especificada.
 +
 +Docker Compose simplifica la gestión de aplicaciones Docker complejas, permitiendo definir y coordinar múltiples servicios con facilidad.
 +
 +
 +
 +<note tip>Para pasar un script de docker al formato de docker compose se puede usar la herramienta: [[https://it-tools.tech/docker-run-to-docker-compose-converter]]</note>
  
  
Línea 138: Línea 243:
    -e MYSQL_ROOT_PASSWORD=root  \    -e MYSQL_ROOT_PASSWORD=root  \
    -p 4000:3306  \    -p 4000:3306  \
-   --network=nombreDeLaRed \+   --network nombreDeLaRed \
    --name  prueba_mariadb \    --name  prueba_mariadb \
    mariadb:10.1    mariadb:10.1
Línea 145: Línea 250:
 \\ \\
 \\ \\
 +
  
 ===== Proxy con Nginx ===== ===== Proxy con Nginx =====
Línea 216: Línea 322:
  
  
-===== 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. 
  
-==== Estructura Básica de un archivo docker-compose.yml ==== 
  
-Un archivo `docker-compose.yml` define la configuración de una aplicación multi-contenedor. Aquí se presentan las secciones principales: 
  
-<sxh> 
-version: '3'  
  
-services:  +===== Ejercicios =====
-  servicio1: +
-    image: imagen_servicio1 +
-    restart: opciones si se reinicia el servidor +
-    hostname: nombre del host  +
-    volumes: +
-      - /ruta/host:/ruta/contenedor +
-    ports: +
-      - "puerto_host:puerto_contenedor" +
-    environment: +
-      - VARIABLE=valor+
  
-  servicio2+==== Ejercicio 1:Crear la imagen ==== 
-    # Configuración del segundo servicio +Crea una imagen de docker basada en ''eclipse-temurin:17.0.10_7-jdk'' que haga lo siguiente: 
-</sxh>+  * Con ''RUN'':Crear el directorio ''/opt/app''.  
 +  * Con ''CMD'':Que ejecute un jara llamado ''japp.jar''
  
  
-==== Comandos Básicos de Docker Compose ==== 
  
-  Iniciar la aplicación basada en la configuración de `docker-compose.yml`.+La imagen se llamará ''tu-nombre-java-app''.
  
-<sxh bash> +Crea un contenedor con esa imagen de forma que con ''-v'' esté el ''japp.jar'' en ''/opt/app''
-docker-compose up +
-</sxh>+
  
-  - Detener y eliminar los contenedores definidos en el archivo `docker-compose.yml`. 
  
-<sxh bash> +==== Ejercicio 2:Sin crear imagen ==== 
-docker-compose down +En la imagen ''eclipse-temurin:17.0.10_7-jdk'' ya existe la carpeta ''/tmp'' y en ''docker container run'' se puede poner al final de la línea la orden a ejecutar.
-</sxh>+
  
-- Muestra el estado de los contenedores definidos en el archivo `docker-compose.yml`.+Así que ejecuta un ''jar'' de la siguiente manera:
  
-<sxh bash+<sxh base
-docker-compose ps+sudo docker container run \ 
 + -v /mi-proyecto/target:/tmp \ 
 + eclipse-temurin:17.0.10_7-jdk \ 
 + java -jar /tmp/mi.jar
 </sxh> </sxh>
  
-==== Ejemplo de Uso ====+<note important> 
 +En la orden ''docker container run'' faltan más parámetros que hay que añadir. 
 +</note>
  
-Supongamos un archivo `docker-compose.yml` para una aplicación web con un servicio de frontend otro de base de datos:+==== Ejercicio 3:Maven ==== 
 +Ahora vamos a generar el ''jar'' en base al código fuente, para ello vamos a usar una imagen que ya tiene ''maven'' instalado: [[https://hub.docker.com/_/maven|Docker image maven]] concretamente  ''maven:3.9.6-eclipse-temurin-17''.
  
-<sxh> 
-version: '3' 
  
-services: +Para hacerlo hay que poner el código fuente en ''/usr/src/mymaven'' y especificar que el directorio de trabajo será ese, para ello usaremos el argumento ''-w''Al final del todo indicaremos la orden de maven a ejecutar.
-  peliculas_java: +
-    image: temurin_peliculas +
-    restart: always +
-    hostname: peliculas_java +
-    volumes: +
-      - /opt/peliculas/target:/opt/app +
-    ports: +
-      "80:8080" +
-  peliculas_mysql: +
-    image: mysql:8.3.+
-    restart: always +
-    hostname: peliculas_java +
-    environment: +
-      - MYSQL_ROOT_PASSWORD=peliculas +
-      - MYSQL_DATABASE=peliculas +
-      - MYSQL_USER=peliculas +
-      - MYSQL_PASSWORD=peliculas +
-</sxh>+
  
-Para iniciar esta aplicación, ejecutamos: +<sxh base
- +sudo docker container run \ 
-<sxh> + -v /mi-proyecto:/usr/src/mymaven \ 
-docker-compose up+ -w /usr/src/mymaven \ 
 + maven:3.9.6-eclipse-temurin-17 \ 
 + mvn clean package
 </sxh> </sxh>
  
-Esto levantará los contenedores de frontend y base de datos con la configuración especificada. 
  
-Docker Compose simplifica la gestión de aplicaciones Docker complejas, permitiendo definir y coordinar múltiples servicios con facilidad.+<note important> 
 +En la orden ''docker container run'' faltan más parámetros que hay que añadir. 
 +</note>
  
 +<note tip>
 +¿Que opciones usarás?
 +  * ''-d''
 +  * ''-i''
 +  * ''-t''
 +  * ????
 +</note>
  
  
-<note tip>Para pasar un script de docker al formato de docker compose se puede usar la herramienta[[https://it-tools.tech/docker-run-to-docker-compose-converter]]</note>+==== Ejercicio 4:Deploy ==== 
 +Has un script en la máquina real llamado ''deploy.sh'' que haga lo siguiente: 
 +  * Se baje el código fuente de git 
 +  * Genere el ''jar'' pero se ejecutará maven dentro del contenedor de docker cuya imagen es''maven:3.9.6-eclipse-temurin-17'' 
 +  * Ejecute el ''jar''  dentro del contenedor de docker cuya imagen es: ''eclipse-temurin:17.0.10_7-jdk''
  
 +==== 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 ''jar'' en un contenedor de  docker y se ejecute en un contenedor de  docker. Este último contenedor deberá conectarse al contenedor de MySQL que has creado.
  
  
 +==== Ejercicio 7:Deploy proyecto ====
 +Modifica el proyecto de Maven de forma que tambien se haga lo necesario para "compilar" la parte de Angular. Esa parte la vimos en el tema 3 en el apartado de [[clase:daw:daw:1eval:tema03#maven]]
  
  
  
 +<note tip>
 +Hasta aquí han sido los ejercicios para el despliegue automático, ahora vamos a mejorar cuestiones relacionadas con Docker.
 +</note>
  
-===== Ejercicios ===== +==== Ejercicio 8MySQL compañero ==== 
- +Prueba ahora modificaar el código de forma que te conectes al MySQL de tu compañero. Deberá dejarte.
- +
-<note important>Para hacer estos ejercicios debe crearse antes la red "prueba_red"</note> +
- +
- +
-<note important>Para la página PHP que se conectará la MySQL se puede usar el siguiente código: {{ :clase:daw:daw:2eval:ejemplo_php.zip |ejemplo_php.zip}}</note> +
- +
-==== Ejercicio 1 ==== +
-Crea un contenedor llamado "maria_a" que sean de MariaDB: +
-  * Crea la table "info" con una columna llamada "nombre" y añade una fila con el valor "soy la base de datos A" +
-  * Su puerto externo es el 2010 +
-  * Conectado a la red "prueba_red" +
-  * Que el nombre del host sea "maria_a" +
- +
-\\ +
- +
-Crea un contenedor llamado "maria_b" que sean de MariaDB: +
-  * Crea la table "info" con una columna llamada "nombre" y añade una fila con el valor "soy la base de datos B" +
-  * Su puerto externo es el 2020 +
-  * Conectado a la red "prueba_red" +
-  * Que el nombre del host sea "maria_b" +
- +
-==== Ejercicio 2 ==== +
-Crea un contenedores llamado "apache_a" que sean del servidor web Apache con PHP: +
-  * Crea una página llamada index.php que +
-    * Se conecte la base de datos llamada "maria_a" ,que hemos creado antes y que muestre los datos de alguna fila de la tabla "peliculas" +
-    * Incluya un título llamado "Soy el servidor Web A" +
-    * Su puerto externo es el 3010 +
-    * Utiliza el fichero ''.env'' para guardar los datos de conexión a la base de datos +
-    * Conectado a la red "prueba_red" +
- +
-<note tip>En vez de crear tu el código PHP puedes usar el siguiente:{{ :clase:daw:daw:2eval:ejemplo_php.zip |}}</note> +
- +
-\\ +
- +
-Crea un contenedores llamado "apache_b" que sean del servidor web Apache con PHP: +
-  * Crea una página llamada index.php que +
-    * Se conecte a una de las bases de datos "maria_b" que hemos creado antes y que muestre los datos de alguna fila de la tabla "peliculas" +
-    * Incluya un título llamado "Soy el servidor Web B" +
-    * Su puerto externo es el 3020 +
-    * Utiliza el fichero ''.env'' para guardar los datos de conexión a la base de datos +
-    * Conectado a la red "prueba_red" +
- +
-<note tip>En vez de crear tu el código PHP puedes usar el siguiente:{{ :clase:daw:daw:2eval:ejemplo_php.zip |}}</note> +
- +
-==== Ejercicio 3 ==== +
-Modifica únicamente el fichero ''.env'' de cada servidor para que ahora se conecten a la otra base de datos. Deberá funcionar todo sin problemas. +
- +
-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. +
- +
-==== Ejercicio 5 ==== +
-Modifica únicamente el fichero ''.env'' de cada servidor para que ahora se conecten a la otra base de datos. **No deberán poder conectarse** +
- +
-Vuelve a dejar las conexiones como estaban antes del ejercicio, es decir todas conectadas a "prueba_red"+
- +
-==== Ejercicio 6 ==== +
-Hasta ahora para acceder a cada servidor web usabas los puertos ''3010'' y ''3020''. Vamos ahora a usar el servidor Proxy Nginx para que a ambos se pueda acceder por nombre de dominio y todos por el puerto 80. Para ello ya no vamos a usar nuestra máquina sino que vamos a usar la máquina que nos proporciona el centro, a la que nos tenemos que conectar por VPN.  En esa máquina ya hemos instalado Nginx como proxy. +
- +
-En esa máquina haz lo siguiente +
- +
-  * Crear un contenedor "apache_**tuNombre**"  +
-    * Indicando que la variable de entorno ''VIRTUAL_HOST'' vale "**tuNombre**.daw2.pve2.fpmislata.com" +
-    * Indicando que la variable de entorno ''VIRTUAL_PORT'' vale "80"  +
-    * Deberás incluir el proyecto de PHP que permitía acceder a la base de datos +
-    * Que la carpeta compartida esté en ''/opt/tuNombre/docker/apache'' +
-    * El código fuente de PHP lo copias en ''/opt/tuNombre/docker/apache'' +
-  * Crear un contenedor "mariadb_**tuNombre**" +
-    * En la base de datos crea la tabla y los datos que necesites. +
-    * Que la carpeta compartida esté en ''/opt/tuNombre/docker/mariadb'' +
- +
-Prueba a navegar la siguientes url (y deberá funcionar): +
-  * <nowiki>http://tuNombre.daw2.pve2.fpmislata.com</nowiki> +
- +
- +
-==== Ejercicio 7 ==== +
-Crea un proyecto Web en GitHub llamado "ejemplodaw" en los que haya lo siguiente: +
-  * 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 ''deploy.sh'' para desplegar el proyecto en docker. El script se ejecutará con ''npm run deploy''El script hará lo siguiente: +==== Ejercicio 9:Red ==== 
-  * Copiar el código de ''src'' a ''dist'' +Crea ahora una red llamada ''mi-nombre-mi-proyecto''.
-  * Compilar en ''dist'' el código SASS +
-  * Borrar los contenedores de Docker que vaya a crear (por si ya existen), que son "apache_**tuNombre**" y "mariadb_**tuNombre**" +
-  * Copiar el contenido de la carpeta ''dist'' a ''/opt/tuNombre/docker/apache'' +
-  * Crear el contenedor de Docker del servidor Web "apache_**tuNombre**" +
-  * Crear el contenedor de Docker de la base de datos "mariadb_**tuNombre**"+
  
 +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 ''/opt/tuNombre'' y haz un git clone del proyecto que acabas de crear en GitHub. Se creará la carpeta ''/opt/tuNombre/ejemplodaw''.+Prueba que todo sigue funcionando.
  
 +==== 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 que todo funciona haz cambios en el SASS en master , súbelos a GitHub y ejecuta dentro de la máquina Linux lo siguiente:+==== Ejercicio 11: Docker compose ==== 
 +Modifica el script ''deploy.sh'' de forma que en vez de crear directamente los 2 contenedores de MySQL y Java se use  ''docker compose up''.
  
-  cd /opt/tuNombre/ejemplodaw +Para ello deberás crear un fichero llamado ''docker-compose.yml''
-  git fetch --prune --force +
-  git checkout master +
-  git merge --ff-only origin/master +
-  npm run deploy+
  
  
-Prueba a navegar a <nowiki>http://tuNombre.daw2.pve2.fpmislata.com</nowiki>  y se verán los cambios. 
  
clase/daw/daw/2eval/tema08.1706998167.txt.gz · Última modificación: 2024/02/03 23:09 por admin