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 Próxima revisión Ambos lados, revisión siguiente | ||
clase:daw:daw:2eval:tema08 [2024/02/03 22:52] admin [Docker Compose] |
clase:daw:daw:2eval:tema08 [2024/02/04 13:08] admin [Ejercicios] |
||
---|---|---|---|
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> | ||
+ | FROM eclipse-temurin: | ||
+ | RUN mkdir /opt/app | ||
+ | COPY / | ||
+ | CMD [" | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Docker Compose ===== | ||
+ | Docker Compose es una herramienta que permite definir y administrar aplicaciones Docker de múltiples contenedores. Utiliza un archivo [[https:// | ||
+ | |||
+ | ==== Estructura Básica de un archivo docker-compose.yml ==== | ||
+ | |||
+ | Un archivo '' | ||
+ | |||
+ | <sxh> | ||
+ | version: ' | ||
+ | |||
+ | services: | ||
+ | servicio1: | ||
+ | image: imagen_servicio1 | ||
+ | restart: opciones si se reinicia el servidor | ||
+ | hostname: nombre del host | ||
+ | volumes: | ||
+ | - / | ||
+ | ports: | ||
+ | - " | ||
+ | environment: | ||
+ | - VARIABLE=valor | ||
+ | |||
+ | servicio2: | ||
+ | # Configuración del segundo servicio | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Comandos Básicos de Docker Compose ==== | ||
+ | |||
+ | - Iniciar la aplicación basada en la configuración de '' | ||
+ | |||
+ | <sxh bash> | ||
+ | docker-compose up | ||
+ | </ | ||
+ | |||
+ | - Detener y eliminar los contenedores definidos en el archivo '' | ||
+ | |||
+ | <sxh bash> | ||
+ | docker-compose down | ||
+ | </ | ||
+ | |||
+ | - Muestra el estado de los contenedores definidos en el archivo '' | ||
+ | |||
+ | <sxh bash> | ||
+ | docker-compose ps | ||
+ | </ | ||
+ | |||
+ | ==== Ejemplo de Uso ==== | ||
+ | |||
+ | Supongamos un archivo '' | ||
+ | |||
+ | <sxh> | ||
+ | version: ' | ||
+ | |||
+ | services: | ||
+ | peliculas_java: | ||
+ | image: temurin_peliculas | ||
+ | restart: always | ||
+ | hostname: peliculas_java | ||
+ | volumes: | ||
+ | - / | ||
+ | ports: | ||
+ | - " | ||
+ | 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 | ||
+ | </ | ||
+ | |||
+ | Para iniciar esta aplicación, | ||
+ | |||
+ | <sxh> | ||
+ | docker-compose up | ||
+ | </ | ||
+ | |||
+ | 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: | ||
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: ' | ||
- | services: | + | ===== Ejercicios ===== |
- | servicio1: | + | |
- | image: imagen_servicio1 | + | |
- | ports: | + | |
- | - " | + | |
- | volumes: | + | |
- | - / | + | |
- | environment: | + | |
- | - VARIABLE=valor | + | |
- | servicio2: | + | ==== Ejercicio 1:Crear la imagen ==== |
- | # Configuración del segundo servicio | + | Crea una imagen de docker basada en '' |
- | </sxh> | + | * Con '' |
+ | * Con '' | ||
- | ==== Principales Componentes de Docker Compose ==== | + | La imagen se llamará '' |
- | **services: | + | Crea un contenedor |
- | **networks: | ||
- | **volumes:** Define volúmenes persistentes que pueden ser compartidos entre los servicios. Útil para almacenar datos fuera del ciclo de vida del contenedor. | + | ==== Ejercicio 2:Sin crear imagen ==== |
+ | En la imagen '' | ||
- | ==== Comandos Básicos | + | Así que ejecuta un '' |
- | - **docker-compose up:** Inicia la aplicación basada en la configuración de `docker-compose.yml`. | + | <sxh base> |
+ | sudo docker | ||
+ | -v / | ||
+ | eclipse-temurin:17.0.10_7-jdk \ | ||
+ | java -jar /tmp/mi.jar | ||
+ | </ | ||
- | - **docker-compose down:** Detiene y elimina los contenedores, | + | <note important> |
+ | En la orden '' | ||
+ | </ | ||
- | - **docker-compose ps:** Muestra | + | ==== Ejercicio 3:Maven ==== |
+ | Ahora vamos a generar | ||
- | ==== Ejemplo | + | Para hacerlo hay que poner el código fuente en ''/ |
- | Supongamos un archivo `docker-compose.yml` para una aplicación web con un servicio de frontend y otro de base de datos: | + | < |
- | + | sudo docker run \ | |
- | < | + | -v / |
- | version: ' | + | -w / |
- | + | maven:3.9.6-eclipse-temurin-17 \ | |
- | services: | + | mvn clean package |
- | web: | + | |
- | image: nginx: | + | |
- | ports: | + | |
- | | + | |
- | db: | + | |
- | image: mysql: | + | |
- | environment: | + | |
- | - MYSQL_ROOT_PASSWORD=secreto | + | |
</ | </ | ||
- | |||
- | Para iniciar esta aplicación, | ||
- | |||
- | <sxh> | ||
- | docker-compose up | ||
- | </ | ||
- | |||
- | 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 '' | ||
+ | </ | ||
- | <note tip>Para pasar un script de docker al formato de docker compose se puede usar la herramienta: | + | <note tip> |
- | + | ¿Que opciones usarás? | |
- | + | * '' | |
- | + | * '' | |
- | + | * '' | |
- | + | * ???? | |
- | + | </ | |
- | + | ||
- | + | ||
- | ===== Ejercicios ===== | + | |
- | + | ||
- | + | ||
- | <note important> | + | |
- | + | ||
- | + | ||
- | <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 " | + | |
- | + | ||
- | \\ | + | |
- | + | ||
- | Crea un contenedor llamado " | + | |
- | * Crea la table " | + | |
- | * Su puerto externo es el 2020 | + | |
- | * Conectado a la red " | + | |
- | * Que el nombre del host sea " | + | |
- | + | ||
- | ==== Ejercicio 2 ==== | + | |
- | 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 "Soy el servidor Web A" | + | |
- | * 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: | + | |
- | + | ||
- | \\ | + | |
- | + | ||
- | 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. | + | |
- | + | ||
- | ==== Ejercicio 5 ==== | + | |
- | Modifica únicamente el fichero '' | + | |
- | + | ||
- | 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 | + | |
- | * Crear un contenedor " | ||
- | * Indicando que la variable de entorno '' | ||
- | * Indicando que la variable de entorno '' | ||
- | * Deberás incluir el proyecto de PHP que permitía acceder a la base de datos | ||
- | * Que la carpeta compartida esté en ''/ | ||
- | * El código fuente de PHP lo copias en ''/ | ||
- | * 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 | + | ==== 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 | + | ==== Ejercicio |
- | Crea un proyecto | + | Compila y desplega el proyecto |
- | * Código PHP | + | |
- | * Código SASS | + | |
- | * Muestre desde PHP información | + | |
- | El proyecto es similar al anterior solo que ahora también hay código | + | ==== Ejercicio 6: MySQL compañero ==== |
+ | Prueba | ||
- | Incluye en el proyecto un script de bash llamado '' | ||
- | * Copiar el código de '' | ||
- | * 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 " | ||
+ | ==== Ejercicio 7:Red ==== | ||
+ | Crea ahora una red llamada '' | ||
- | En la máquina real ves a la carpeta ''/ | + | Modifica |
+ | Prueba que todo sigue funcionando. | ||
+ | ==== Ejercicio 8: 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: | ||
- | cd / | ||
- | git fetch --prune --force | ||
- | git checkout master | ||
- | git merge --ff-only origin/ | ||
- | npm run deploy | ||
- | Prueba a navegar a < | ||