Tema:
Docker Compose (Aplicaciones MultiContenedor)
Introducción
En la actualidad, las aplicaciones modernas rara vez funcionan como una sola unidad; suelen estar compuestas por múltiples servicios que trabajan en conjunto, como bases de datos, servidores web y colas de mensajes. Docker Compose es una herramienta poderosa que permite definir, configurar y gestionar aplicaciones multicontenedor mediante un archivo YAML. Esta herramienta simplifica la creación y orquestación de entornos de desarrollo y producción, proporcionando una manera eficiente de manejar las complejidades de las aplicaciones distribuidas.
Con Docker Compose, los desarrolladores pueden describir la infraestructura necesaria para sus aplicaciones, incluyendo configuraciones específicas, dependencias y redes. Además, Compose permite ejecutar, detener y escalar fácilmente aplicaciones multicontenedor, proporcionando un entorno controlado y replicable que fomenta la colaboración y la agilidad en los flujos de trabajo.
Objetivo
Objetivo General:
- Introducir a los participantes en el uso de Docker Compose para crear, configurar y administrar aplicaciones multicontenedor. Este módulo busca proporcionar las habilidades necesarias para definir la infraestructura de aplicaciones distribuidas utilizando archivos YAML, gestionar dependencias entre servicios y orquestar la ejecución de múltiples contenedores de manera sencilla y eficiente.
Ejemplo Docker Compose: Java application with Spring framework and a Postgres database
- Clonar el siguiente repositio de ejemplos de Docker Compose con el siguiente comando:
git clone https://github.com/docker/awesome-compose.git - Ingresar al directorio
awesome-compose/spring-postgresy luego inspeccionar el archivo llamado compose.yamlcd ~/awesome-compose/spring-postgres/cat compose.yamlEl archivo define una aplicación con dos servicios: backend y db. Al desplegar la aplicación, Docker Compose mapea el puerto 8080 del contenedor del servicio backend al puerto 8080 del host, según lo especificado en el archivo. Asegúrate de que el puerto 8080 del host no esté siendo utilizado previamente.services: backend: build: backend ports: - 8080:8080 environment: - POSTGRES_DB=example networks: - spring-postgres db: image: postgres restart: always secrets: - db-password volumes: - db-data:/var/lib/postgresql/data networks: - spring-postgres environment: - POSTGRES_DB=example - POSTGRES_PASSWORD_FILE=/run/secrets/db-password expose: - 5432 volumes: db-data: secrets: db-password: file: db/password.txt networks: spring-postgres: - Ejecutar el siguiente comando para asegurarse que el ambiente se encuentra limpio:
docker rm -f $(docker ps -aq) ; docker image prune -a -f - Desplegar el servicio de ejemplo con docker compose
La salida del comando anterior debe ser similar a la siguiente:
docker compose up -d=> => exporting layers 0.0s => => writing image sha256:12d140c105b9491aa808210ce78beb7ea78cd2638f23e5fcf192a74b124167ca 0.0s => => naming to docker.io/library/spring-postgres-backend 0.0s [+] Running 3/3 ✔ Network spring-postgres_spring-postgres Created 0.1s ✔ Container spring-postgres-db-1 Started 0.1s ✔ Container spring-postgres-backend-1 Started - Verifica los Contenedores creados:
La salida del comando anterior debe ser similar a la siguiente:
docker psLa primera vez que inicie la base de datos, puede que tarde mas que el contenedor de la aplicación, por lo que la aplicación puede generar problemas de conexión a la base de datos, por lo que deberías de probar detener y volver a subir delCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES efd5f1bf70b7 postgres "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 5432/tcp spring-postgres-db-1 d579461e0ea6 spring-postgres-backend "java -cp app:app/li…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp spring-postgres-backend-1Docker Compose.docker compose downdocker compose up -d - Realizar la prueba del servicio accediendo a la siguiente URL:
La salida del comando anterior debe ser similar a la siguiente:
curl http://localhost:8080<!DOCTYPE HTML> <html> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p>Hello from Docker!</p> </body> - Para detener y remover los contenedores creados anteriormente, ejecuta el siguiente comando:
La salida del comando anterior debe ser similar a la siguiente:
docker compose down[+] Running 3/3 ✔ Container spring-postgres-backend-1 Removed 0.6s ✔ Container spring-postgres-db-1 Removed 0.4s ✔ Network spring-postgres_spring-postgres Removed 0.1s - Asegurarse de dejar limpio el ambiente de laboratorio con el siguiente comando:
docker rm -f $(docker ps -aq) ; docker image prune -a -f
Ejemplo Docker Compose: Compose sample application: ASP.NET with MS SQL server database
-
Ejecutar este nuevo ejemplo que se encuentra en el directorio ~/awesome-compose/aspnet-mssql, como se ejecuto el anterior.
cd ~/awesome-compose/aspnet-mssqlcat compose.yamlservices: web: build: app/aspnetapp ports: - 80:80 db: environment: ACCEPT_EULA: "Y" SA_PASSWORD: example_123 # mssql server image isn't available for arm64 architecture, so we use azure-sql instead image: mcr.microsoft.com/azure-sql-edge:1.0.4 # If you really want to use MS SQL Server, uncomment the following line #image: mcr.microsoft.com/mssql/server restart: always healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P example_123 -Q 'SELECT 1' || exit 1"] interval: 10s retries: 10 start_period: 10s timeout: 3sdocker compose up -ddocker ps -
Puede utilizar el FQDN para validar el funcionamiento del aplicativo, por ejemplo: student-0-aio.35-227-133-255.nip.io
-
Para detener y remover los contenedores creados anteriormente, ejecuta el siguiente comando:
La salida del comando anterior debe ser similar a la siguiente:docker compose down[+] Running 3/2 ✔ Container aspnet-mssql-db-1 Removed 10.5s ✔ Container aspnet-mssql-web-1 Removed 0.3s ✔ Network aspnet-mssql_default Removed 0.1s -
Asegurarse de dejar limpio el ambiente de laboratorio con el siguiente comando:
docker rm -f $(docker ps -aq) ; docker image prune -a -fcd ~/ ; rm -fR awesome-compose