Compartir comentarios
Las respuestas se generan en base a la documentación.

¿Qué es Docker Compose?

Explicación

Si has estado siguiendo las guías hasta ahora, has estado trabajando con aplicaciones de un solo contenedor. Pero ahora deseas hacer algo más complicado: ejecutar bases de datos, colas de mensajes, cachés o una variedad de otros servicios. ¿Instalas todo en un solo contenedor? ¿Ejecutas varios contenedores? Si ejecutas varios, ¿cómo los conectas todos entre sí?

Una de las mejores prácticas para los contenedores es que cada contenedor debe hacer una sola cosa y hacerla bien. Aunque existen excepciones a esta regla, evita la tendencia de hacer que un contenedor realice múltiples tareas.

Puedes usar múltiples comandos docker run para iniciar varios contenedores. Pero pronto te darás cuenta de que necesitarás administrar redes, todas las banderas necesarias para conectar contenedores a esas redes y más. Y cuando hayas terminado, la limpieza será un poco más complicada.

Con Docker Compose, puedes definir todos tus contenedores y sus configuraciones en un solo archivo YAML. Si incluyes este archivo en tu repositorio de código, cualquiera que clone tu repositorio podrá ponerse en marcha con un solo comando.

Es importante comprender que Compose es una herramienta declarativa: simplemente defines la configuración y listo. No siempre necesitas recrear todo desde cero. Si realizas un cambio, vuelve a ejecutar docker compose up y Compose conciliará los cambios en tu archivo y los aplicará de manera inteligente.

Dockerfile frente a archivo de Compose

Un Dockerfile proporciona instrucciones para compilar una imagen de contenedor, mientras que un archivo de Compose define tus contenedores en ejecución. Con bastante frecuencia, un archivo de Compose hace referencia a un Dockerfile para compilar una imagen que se utilizará para un servicio en particular.

Pruébalo

En esta práctica, aprenderás a usar Docker Compose para ejecutar una aplicación multicontenedor. Utilizarás una aplicación simple de lista de tareas pendientes creada con Node.js y MySQL como servidor de base de datos.

Iniciar la aplicación

Sigue las instrucciones para ejecutar la aplicación de lista de tareas en tu sistema.

  1. Descarga e instala Docker Desktop.

  2. Abre una terminal y clona esta aplicación de muestra.

    git clone https://github.com/dockersamples/todo-list-app
    
  3. Navega al directorio todo-list-app:

    cd todo-list-app
    

    Dentro de este directorio, encontrarás un archivo llamado compose.yaml. ¡Este archivo YAML es donde ocurre toda la magia! Define todos los servicios que componen tu aplicación, junto con sus configuraciones. Cada servicio especifica su imagen, puertos, volúmenes, redes y cualquier otra configuración necesaria para su funcionamiento. Tómate un tiempo para explorar el archivo YAML y familiarizarte con su estructura.

  4. Utiliza el comando docker compose up para iniciar la aplicación:

    docker compose up -d --build
    

    Cuando ejecutes este comando, deberías ver una salida como esta:

    [+] Running 5/5
    ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled          7.1s
      ✔ e6f4e57cc59e Download complete                          0.9s
      ✔ df998480d81d Download complete                          1.0s
      ✔ 31e174fedd23 Download complete                          2.5s
      ✔ 43c47a581c29 Download complete                          2.0s
    [+] Running 4/4
      ⠸ Network todo-list-app_default           Created         0.3s
      ⠸ Volume "todo-list-app_todo-mysql-data"  Created         0.3s
      ✔ Container todo-list-app-app-1           Started         0.3s
      ✔ Container todo-list-app-mysql-1         Started         0.3s
    

    ¡Pasaron muchas cosas aquí! Un par de cosas a destacar:

    • Se descargaron dos imágenes de contenedor desde Docker Hub: Node y MySQL.
    • Se creó una red para tu aplicación.
    • Se creó un volumen para persistir los archivos de la base de datos entre los reinicios de los contenedores.
    • Se iniciaron dos contenedores con toda su configuración necesaria.

    Si esto te parece abrumador, ¡no te preocupes! ¡Lo lograrás!

  5. Con todo listo y en funcionamiento, puedes abrir http://localhost:3000 en tu navegador para ver el sitio. Ten en cuenta que la aplicación puede tardar entre 10 y 15 segundos en iniciarse por completo. Si la página no se carga de inmediato, espera un momento y actualiza. Siéntete libre de agregar elementos a la lista, marcarlos y eliminarlos.

    A screenshot of a webpage showing the todo-list application running on port 3000
  6. Si miras la GUI de Docker Desktop, podrás ver los contenedores y profundizar en su configuración.

    A screenshot of Docker Desktop dashboard showing the list of containers running todo-list app

Eliminar la aplicación

Dado que esta aplicación se inició utilizando Docker Compose, es fácil eliminarla por completo cuando hayas terminado.

  1. En la CLI, utiliza el comando docker compose down para eliminar todo:

    docker compose down
    

    Verás una salida similar a la siguiente:

    [+] Running 3/3
    ✔ Container todo-list-app-mysql-1  Removed        2.9s
    ✔ Container todo-list-app-app-1    Removed        0.1s
    ✔ Network todo-list-app_default    Removed        0.1s
    

    Persistencia de volúmenes

    Por defecto, los volúmenes no se eliminan automáticamente cuando eliminas una pila (stack) de Compose. La idea es que es posible que desees recuperar los datos si vuelves a iniciar la pila.

    Si deseas eliminar los volúmenes, añade la bandera --volumes al ejecutar el comando docker compose down:

    docker compose down --volumes
    [+] Running 1/0
    ✔ Volume todo-list-app_todo-mysql-data  Removed
    
  2. Alternativamente, puedes usar la GUI de Docker Desktop para eliminar los contenedores seleccionando la pila de aplicaciones y haciendo clic en el botón Delete (Eliminar).

    A screenshot of the Docker Desktop GUI showing the containers view with an arrow pointing to the "Delete" button

    Usar la interfaz gráfica (GUI) para pilas de Compose

    Ten en cuenta que si eliminas los contenedores de una aplicación de Compose en la GUI, solo se eliminarán los contenedores. Tendrás que eliminar manualmente la red y los volúmenes si así lo deseas.

En esta práctica, aprendiste a usar Docker Compose para iniciar y detener una aplicación multicontenedor.

Recursos adicionales

Esta página fue una breve introducción a Compose. En los siguientes recursos, puedes profundizar en Compose y en cómo escribir archivos de Compose.