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:10]
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 =====
-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 [[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 ==== ==== Estructura Básica de un archivo docker-compose.yml ====
  
-Un archivo `docker-compose.ymldefine la configuración de una aplicación multi-contenedor. Aquí se presentan las secciones principales:+Un archivo ''docker-compose.yml'' define la configuración de una aplicación multi-contenedor. Aquí se presentan las secciones principales:
  
 <sxh> <sxh>
Línea 140: 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 ''docker-compose.yml''.
  
 <sxh bash> <sxh bash>
Línea 146: Línea 161:
 </sxh> </sxh>
  
-  - Detener y eliminar los contenedores definidos en el archivo `docker-compose.yml`.+  - Detener y eliminar los contenedores definidos en el archivo ''docker-compose.yml''.
  
 <sxh bash> <sxh bash>
Línea 152: Línea 167:
 </sxh> </sxh>
  
-- Muestra el estado de los contenedores definidos en el archivo `docker-compose.yml`.+- Muestra el estado de los contenedores definidos en el archivo ''docker-compose.yml''.
  
 <sxh bash> <sxh bash>
Línea 160: Línea 175:
 ==== Ejemplo de Uso ==== ==== Ejemplo de Uso ====
  
-Supongamos un archivo `docker-compose.ymlpara una aplicación web con un servicio de frontend y otro de base de datos:+Supongamos un archivo ''docker-compose.yml'' para una aplicación web con un servicio de frontend y otro de base de datos:
  
 <sxh> <sxh>
Línea 228: 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 313: Línea 328:
 ===== Ejercicios ===== ===== Ejercicios =====
  
 +==== Ejercicio 1:Crear la imagen ====
 +Crea una imagen de docker basada en ''eclipse-temurin:17.0.10_7-jdk'' que haga lo siguiente:
 +  * Con ''RUN'':Crear el directorio ''/opt/app''
 +  * Con ''CMD'':Que ejecute un jara llamado ''japp.jar''
  
-<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>+La imagen se llamará ''tu-nombre-java-app''.
  
-==== Ejercicio 1 ==== +Crea un contenedor con esa imagen de forma que con ''-v'' esté el ''japp.jar'' en ''/opt/app''
-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+==== Ejercicio 2:Sin crear imagen ==== 
-  * Crea la table "info" con una columna llamada "nombre" añade una fila con el valor "soy la base de datos B" +En la imagen ''eclipse-temurin:17.0.10_7-jdk'' ya existe la carpeta ''/tmp'' en ''docker container run'' se puede poner al final de la línea la orden ejecutar.
-  * Su puerto externo es el 2020 +
-  * Conectado la red "prueba_red" +
-  * Que el nombre del host sea "maria_b"+
  
-==== Ejercicio 2 ==== +Así que ejecuta un ''jar'' de la siguiente manera:
-Crea un contenedores llamado "apache_a" que sean del servidor web Apache con PHP: +
-  * Crea una página llamada index.php que +
-    * Se conecte a 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>+<sxh base> 
 +sudo docker container run \ 
 + -v /mi-proyecto/target:/tmp \ 
 + eclipse-temurin:17.0.10_7-jdk \ 
 + java -jar /tmp/mi.jar 
 +</sxh>
  
-\\+<note important> 
 +En la orden ''docker container run'' faltan más parámetros que hay que añadir. 
 +</note>
  
-Crea un contenedores llamado "apache_b" que sean del servidor web Apache con PHP+==== Ejercicio 3:Maven ==== 
-  * Crea una página llamada index.php que +Ahora vamos 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''.
-    * Se conecte a una de las bases de datos "maria_b" que hemos creado antes 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 ==== +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.
-Modifica únicamente el fichero ''.env'' de cada servidor para que ahora se conecten a la otra base de datosDeberá funcionar todo sin problemas.+
  
-Vuelve a dejar las conexiones como estaban antes del ejercicio.+<sxh base> 
 +sudo docker container run \ 
 + -v /mi-proyecto:/usr/src/mymaven \ 
 + -w /usr/src/mymaven \ 
 + maven:3.9.6-eclipse-temurin-17 \ 
 + mvn clean package 
 +</sxh>
  
-==== 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.+<note important> 
 +En la orden ''docker container run'' faltan más parámetros que hay que añadir. 
 +</note>
  
-^ Contenedor ^ Red ^ +<note tip> 
-| apache_a | red_a | +¿Que opciones usarás? 
-| maria_a | red_a | +  * ''-d'' 
-| apache_b | red_b | +  * ''-i'' 
-| maria_b | red_b |+  * ''-t'' 
 +  * ???? 
 +</note>
  
  
-Prueba que los 2 servidores web siguen funcionando y accediendo a sus bases de datos correspondientes.+==== 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 ==== +==== Ejercicio 5:MySQL ==== 
-Modifica únicamente el fichero ''.env'' de cada servidor para que ahora se conecten a la otra base de datos. **No deberán poder conectarse**+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.
  
-Vuelve a dejar las conexiones como estaban antes del ejercicio, es decir todas conectadas a "prueba_red".+==== 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 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+==== 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]]
  
-  * 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> 
  
 +<note tip>
 +Hasta aquí han sido los ejercicios para el despliegue automático, ahora vamos a mejorar cuestiones relacionadas con Docker.
 +</note>
  
-==== Ejercicio ==== +==== Ejercicio 8: MySQL compañero ==== 
-Crea un proyecto Web en GitHub llamado "ejemplodaw" en los que haya lo siguiente: +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 ''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.1706998239.txt.gz · Última modificación: 2024/02/03 23:10 por admin