Skip to content

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

  1. Clonar el siguiente repositio de ejemplos de Docker Compose con el siguiente comando:
    git clone https://github.com/docker/awesome-compose.git
    
  2. Ingresar al directorio awesome-compose/spring-postgres y luego inspeccionar el archivo llamado compose.yaml
    cd ~/awesome-compose/spring-postgres/
    
    cat compose.yaml
    
    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:
    
    El 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.
  3. Ejecutar el siguiente comando para asegurarse que el ambiente se encuentra limpio:
    docker rm -f $(docker ps -aq) ; docker image prune -a -f
    
  4. Desplegar el servicio de ejemplo con docker compose
    docker compose up -d
    
    La salida del comando anterior debe ser similar a la siguiente:
     => => 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
    
  5. Verifica los Contenedores creados:
    docker ps 
    
    La salida del comando anterior debe ser similar a la siguiente:
    CONTAINER 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-1
    
    La 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 del Docker Compose.
    docker compose down
    
    docker compose up -d
    
  6. Realizar la prueba del servicio accediendo a la siguiente URL:
    curl http://localhost:8080
    
    La salida del comando anterior debe ser similar a la siguiente:
    <!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>
    
  7. Para detener y remover los contenedores creados anteriormente, ejecuta el siguiente comando:
    docker compose down
    
    La salida del comando anterior debe ser similar a la siguiente:
    [+] 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
    
  8. 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

  1. Ejecutar este nuevo ejemplo que se encuentra en el directorio ~/awesome-compose/aspnet-mssql, como se ejecuto el anterior.

    cd ~/awesome-compose/aspnet-mssql
    
    cat compose.yaml
    
    services:
      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: 3s 
    
    docker compose up -d
    
    docker ps 
    

  2. Puede utilizar el FQDN para validar el funcionamiento del aplicativo, por ejemplo: student-0-aio.35-227-133-255.nip.io

  3. Para detener y remover los contenedores creados anteriormente, ejecuta el siguiente comando:

    docker compose down
    
    La salida del comando anterior debe ser similar a la siguiente:
    [+] 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
    

  4. Asegurarse de dejar limpio el ambiente de laboratorio con el siguiente comando:

    docker rm -f $(docker ps -aq) ; docker image prune -a -f
    
    cd ~/ ; rm -fR awesome-compose