Si te preguntas cómo crear contenedores Docker reproducibles con Docker Compose, estás en el lugar correcto. En este tutorial paso a paso de Docker Compose, aprenderás cómo crear contenedores simples, mapear puertos con Docker Compose hasta llegar a escenarios complejos con múltiples contenedores.
¿Estás listo? ¡Vamos a profundizar!
Prerrequisitos
Si deseas seguir paso a paso este tutorial, asegúrate de tener lo siguiente:
- A fresh install of Ubuntu Server LTS with SSH Enabled. This guide will use Ubuntu Server LTS 20.04.1 as the Docker host machine.
- A computer with VS Code installed (optional). This guide will use Visual Studio Code 1.52.1 to SSH to the Docker host and run commands.
- La extensión oficial de SSH de VS Code instalada y conectada al host de Docker. (opcional)
¿Qué es Docker Compose?
Los comandos individuales pueden volverse largos, realmente largos en Docker. Toma el siguiente ejemplo. Este ejemplo crea un contenedor para una aplicación de software llamada bookstack.
A medida que aumenta la complejidad de un entorno de Docker, también lo hace la cantidad de banderas y condiciones necesarias para una configuración de contenedor funcional. La línea de comandos de Docker comienza a volverse engorrosa y difícil de solucionar; especialmente una vez que las configuraciones de varios contenedores comienzan a entrar en juego.
Docker Compose es una forma de crear contenedores de Docker reproducibles utilizando un archivo de configuración en lugar de comandos de Docker extremadamente largos. Al utilizar un archivo de configuración estructurado, los errores son más fáciles de detectar y las interacciones entre contenedores son más fáciles de definir.
Docker Compose se vuelve rápidamente invaluable cuando se trata de dependencias entre contenedores o entornos de varios contenedores.
Docker Compose es una forma fantástica de adentrarse en la Infraestructura como Código sin la complejidad de sistemas distribuidos como Kubernetes.
Docker Compose utiliza una estructura de archivo de configuración llamada YAML. YAML es similar a JSON o HTML en el sentido de que YAML es un lenguaje estructurado y legible por máquina. YAML se centra específicamente en ser lo más legible posible para los humanos mientras mantiene ese poder estructurado.
YAML tiene un inconveniente en el que los espacios en blanco, como las tabulaciones, son significativos y deben formatearse correctamente. VS Code hace mucho de este trabajo duro por ti, y es también por eso que verás muchos de los ejemplos realizados en VS Code.
Instalación de Docker Compose
Ahora vamos a empezar a ensuciarnos las manos. Suponiendo que estás conectado a tu host de Docker, es hora de instalar Docker Compose.
Docker Compose es un paquete separado de la ejecución de Docker. Pero al instalar Docker Compose también se instalará la ejecución de Docker, ¡así que matarás dos pájaros de un tiro!
Para instalar Docker Compose y la ejecución de Docker, ejecuta los siguientes dos comandos.

Una vez instalado, ahora debes crear una estructura de carpetas para almacenar contenedores.
Creando una Estructura de Carpetas para Docker Compose
Antes de poder crear un contenedor con Docker Compose, primero debes crear una carpeta para almacenar contenedores. No solo debes crear una estructura de carpetas para almacenar contenedores, sino que también descubrirás que varios comandos de Docker son sensibles a la ubicación de varios archivos de configuración; Docker Compose no es una excepción.
El componente más importante de Docker Compose es su archivo de configuración llamado docker-compose.yaml. Este archivo de configuración, como se explicó anteriormente, dicta cómo el tiempo de ejecución de Docker debe construir un contenedor.
Cuando ejecutas Docker Compose, el comando buscará su archivo de configuración en la misma carpeta donde se ejecuta el comando. Debido a este requisito, siempre es mejor crear una carpeta separada al ejecutar Docker Compose.
Solo puede haber un archivo de configuración de Docker Compose por carpeta.
Para demostrar la creación de un contenedor de Docker con Docker Compose, primero crea una estructura de carpetas para almacenar el futuro contenedor y su archivo de configuración utilizando un pequeño servidor de archivos llamado Caddy.
Caddy es un servidor de archivos, similar a apache httpd o nginx, pero escrito en el lenguaje Go. Caddy está diseñado específicamente para facilitar su uso (y generará o servirá automáticamente un archivo index.html) sin necesidad de configuración. Esta combinación hace que Caddy sea una buena opción para principiantes.
Suponiendo que has iniciado sesión en tu host de Docker, crea la estructura de carpetas de la siguiente manera:
- En tu directorio personal, crea una carpeta llamada containers. Esta carpeta será un buen espacio para este y otros contenedores.
- Dentro de la carpeta containers, crea una subcarpeta llamada caddy. Esta carpeta contendrá el archivo de configuración de Docker Compose y el propio contenedor de Caddy.
- Finalmente, dentro de la carpeta del contenedor, caddy, crea un archivo de texto en blanco llamado docker-compose.yaml que se convertirá en el archivo de configuración de Docker Compose.
Con la estructura de carpetas y el archivo de configuración de Docker Compose creados, ahora puedes empezar a completar ese archivo de configuración con una configuración de Docker Compose.
Creando un Archivo de Configuración de Docker Compose
En su forma más básica, un archivo docker-compose.yaml para el contenedor de Caddy se ve así. En tu editor de texto de Linux favorito o con VS Code, copia y pega el código a continuación en el archivo de configuración de Docker Compose creado anteriormente.
Vamos a revisar cada una de las opciones mostradas:
version
especifica la versión del archivo docker-compose. Cada nueva definición de Docker Compose incluye cambios significativos en la especificación. Por lo tanto, la versión es importante para que Docker Compose pueda determinar qué características debe utilizar. La versión 3.7 es la última versión que admite Ubuntu 20.04.1 LTS.
La especificación completa para Docker Compose 3.x puede encontrarse aquí. La documentación vinculada menciona cada opción que puede utilizar dentro de Docker Compose.
services
contienen las especificaciones para los contenedores reales. Puede definir varios contenedores en esta sección.caddy
es el nombre del primer contenedor (esto es puramente para referencia).container_name
define el nombre real dado al contenedor por Docker y debe ser único.image
es el nombre de la imagen. En este caso, caddy del Hub de Docker está definido. El nombre o número después de la etiqueta separado por dos puntos es la versión.
Mapeo de puertos
Esta última opción en particular requiere una mención especial:
En Docker Compose, la directiva ports
te permite configurar uno o más mapeos desde el host al contenedor. Por ejemplo, arriba has mapeado el puerto 80
en el host al puerto 80
en el contenedor. Sin embargo, no es necesario que coincida el número de puerto. El ejemplo a continuación mapea el puerto 8800
en el host al puerto 80
en el contenedor.
También puedes definir múltiples puertos como se muestra a continuación.
Hacerlo así mapearía tanto el puerto 80
como el 443
al host (una configuración común para servidores web, para servir tanto HTTP como HTTPS).
El creador de la imagen Docker define los puertos disponibles en el momento de la creación. Asegúrate de revisar la documentación de la imagen con la que estás trabajando en Docker Hub o en el sitio web del mantenedor para puertos mapeables. ¡No tiene sentido mapear un puerto si el puerto no está en uso!
Con eso en mente, veamos cómo ejecutar realmente el contenedor.
Ejecutando el Contenedor
En este momento deberías tener el archivo docker-compose.yaml dentro de tu carpeta ~\containers\caddy. Ahora es el momento de crear y iniciar el contenedor de Caddy.
En tu terminal, ejecuta el siguiente comando que iniciará los contenedores Docker definidos en el archivo docker-compose.yaml.
Puede notar que no tuvo que especificar la ubicación del archivo docker-compose.yaml al ejecutar
sudo docker-compose up -d
. Docker Compose espera que ejecute todos los comandos dentro de la carpeta que contiene el archivo docker-compose.yaml, ya que muchos comandos son relativos a esa carpeta.
Ahora verifique que el contenedor esté en funcionamiento navegando a http://<su ip>. Esta guía está utilizando http://homelab-docker como referencia.
Puede ver este procesamiento en VS Code mientras está conectado por SSH al host de Docker en la siguiente animación:

¡Éxito! Ahora ha utilizado correctamente Docker Compose para iniciar un contenedor desde un archivo de configuración. Con ese primer paso importante dado, veamos cómo gestionar el estado de su contenedor.
Comandos para gestionar contenedores en segundo plano
En la sección anterior, inició el contenedor caddy usando la bandera -d
. Al hacerlo, ejecutó un contenedor en un estado desconectado. Cuando un contenedor está en un estado desconectado, significa que el contenedor seguirá ejecutándose en segundo plano. Pero, esto plantea un problema: ¿cómo gestionar ese contenedor si ya no tiene control directo?
Para resolver este problema, Docker Compose tiene una serie de comandos que gestionarán los contenedores iniciados con un archivo docker-compose.yaml:
- El comando
docker-compose restart
se utiliza para reiniciar un contenedor que está actualmente en ejecución. Hacer esto es diferente de simplemente volver a ejecutardocker-compose up -d
. El comando de reinicio simplemente reiniciará un contenedor existente, volverá a ejecutar el comandodocker-compose up -d
y recreará el contenedor desde cero (si el archivo de configuración ha sido modificado). - El comando
docker-compose stop
detendrá un contenedor en ejecución sin destruirlo. De manera similar,docker-compose start
volverá a iniciar el contenedor. - El comando
docker-compose down
detendrá los contenedores en ejecución y también los destruirá. Aquí es donde entran en juego los montajes de volúmenes (lee más abajo). - El comando
docker-compose pull
recuperará la versión actual de la imagen de docker (o imágenes) del repositorio. Si estás utilizando la etiquetalatest
, puedes seguir condocker-compose down && sudo docker-compose up -d
para reemplazar el contenedor con la última versión. Usardocker-compose pull
es una forma conveniente de actualizar los contenedores rápidamente con un tiempo de inactividad mínimo. - El comando
docker-compose logs
mostrará los registros del contenedor en ejecución (o detenido). También puedes dirigirte a contenedores individuales (si hay varios contenedores definidos en el archivo de composición) condocker-compose logs <nombre del contenedor>
.
A full list of docker-compose commands can be seen by running
docker-compose
with no additional arguments or referenced here in the documentation.
Ahora que tienes un contenedor en ejecución, veamos cómo usar contenido guardado localmente en tu máquina.
Creando Montajes de Enlace en Docker Compose
Vinculaciones de Montaje son la forma en que Docker mapea datos importantes del usuario al almacenamiento local en su servidor. Para comenzar, genere algún contenido para el contenedor que va a alojar:
- En el host de Docker, dentro de la carpeta ~/contenedores/caddy, cree una nueva carpeta llamada files.
2. Cree un nuevo archivo llamado index.html dentro de la carpeta ~/contenedores/caddy que se ve así. Esta será la página principal que servirá el servidor web Caddy.
3. Modifique su archivo de configuración de Docker Compose para que se vea como el siguiente. El archivo de ejemplo a continuación está agregando la sección volumes
y apuntando un montaje de enlace a la carpeta files recién creada para hacerla disponible para el contenedor.
4. Ejecute docker-compose up -d
nuevamente. Docker Compose ahora reconocerá que el archivo ha sido modificado y recreará su contenedor.
5. Vaya a la página del contenedor con un navegador y ahora debería ver que está sirviendo la página “¡Hola, Mundo!”.
Puede ver lo siguiente en la siguiente animación:

¡Ahora está alojando contenido almacenado localmente en su máquina! Sin embargo, ¿qué pasa si su contenido está en una fuente externa como una compartición de red?
Usando Docker Compose con Volúmenes de Docker
Una vez que creas un contenedor simple con Docker Compose, es probable que necesites que ese contenedor acceda a archivos en otro lugar, quizás en una compartición de red. Si es así, puedes configurar el contenedor para usar volúmenes de Docker directamente en tu archivo de configuración de Docker Compose.
Con fines de demostración, esta guía creará un servidor de Compartición de Archivos en Red (NFS) en el host de Docker. Servir contenido local como una montura NFS no tiene un propósito práctico fuera de la demostración. Si fuera a montar un volumen NFS, generalmente sería desde una fuente externa como un NAS o un servidor remoto.
Configurar una Compartición NFS
Si aún no tienes una compartición NFS configurada, constrúyela ahora en el host de Docker para este tutorial. Para hacerlo:
- Instala el paquete del servidor NFS ejecutando
apt install nfs-kernel-server -y
.
2. Agrega el contenedor como una exportación NFS (similar a una compartición CIFS de Windows) ejecutando lo siguiente.
3. Ahora verifica que el host exponga el recurso NFS ejecutando showmount -e localhost
. Este comando mostrará cualquier recurso NFS actualmente expuesto y quién tiene acceso.
En la captura de pantalla a continuación, puedes ver que /home/homelab/containers está expuesto, pero solo al equipo local (que es el mismo servidor que ejecuta el host Docker).

Si ves la carpeta /home/<nombre de usuario>/containers en la salida, significa que el recurso NFS está configurado.
Definición de un Volumen Nombrado de Docker
Una vez que hayas creado el recurso NFS, ahora necesitas decirle a Docker cómo acceder a ese recurso. Utilizando Docker Compose, puedes hacer eso definiendo un volumen nombrado en el archivo de configuración de Docker Compose.
A named volume is a way for Docker to abstract network-based file shares. Network file sharing comes in all sorts of shapes and sizes these days: CIFS (windows) shares, NFS (Linux) shares, AWS S3 Buckets, and more. By creating a Named Volume, Docker does the hard part of figuring out how to talk to the network share and lets the container just treat the share as if it is local storage.
Para crear un volumen nombrado:
- Abre el archivo de configuración de Docker Compose (docker-compose.yaml). Si estás siguiendo, el archivo debería estar ubicado en la carpeta ~/containers/caddy.
2. Dentro del archivo de configuración de Docker Compose, agrega una sección volumes
después de la sección services
. Tu archivo de configuración debería lucir como se muestra a continuación. La sección volumes
crea un volumen nombrado llamado MyWebsite. Dentro de ese volumen nombrado, se especifican los parámetros necesarios (como la IP, configuraciones NFS y la ruta). El parámetro volumes
dentro de la sección services
también se modifica para apuntar al volumen nombrado en lugar de a una carpeta local.
3. Una vez que hayas definido el volumen nombrado que apunta a la compartición NFS en el archivo de configuración de Docker Compose, ejecuta docker-compose up -d
para crear y iniciar el contenedor. Si todo sale bien, el contenedor y el sitio web deberían volver a estar en funcionamiento.

4. Navega nuevamente a la página del contenedor. El contenido de index.html debería aparecer como si el archivo estuviera siendo montado localmente. Sin embargo, ese archivo está siendo montado a través del servidor NFS configurado en la red.

Dado que ahora puedes montar volúmenes externos de Docker en Docker Compose, ahora puedes llevar todo tipo de almacenamiento de red a tus contenedores. Sin embargo, Docker Compose puede hacer más que simplemente definir contenedores o volúmenes únicos. Profundicemos en escenarios más complejos y multi-contenedor.
Este tutorial ya no utilizará el contenedor caddy, así que puedes eliminar el contenedor usando
docker-compose down
.
Definición de Múltiples Contenedores en Docker Compose
La mayoría de los contenedores de Docker no funcionan en un vacío. Los contenedores de Docker generalmente tienen dependencias de servicios como bases de datos o servicios web separados que se comunican a través de una API.
Usando Docker Compose, puedes agrupar contenedores definidos dentro de un único archivo. Al definir múltiples contenedores en un solo archivo, los contenedores pueden comunicarse entre servicios dependientes y simplificar la organización de diseños de contenedores complejos.
Para demostrar un escenario de este tipo, configuremos una aplicación wiki popular llamada BookStack.
BookStack es un software wiki popular conocido por su facilidad de uso y su diseño jerárquico (en contraste con un diseño plano, como mediawiki).
BookStack, al igual que muchas aplicaciones web, requiere una base de datos separada para funcionar correctamente, así como la información necesaria para comunicarse con la base de datos. Configurar tal situación es donde Docker Compose sobresale.
Crear el Archivo de Configuración de Docker Compose
BookStack no tiene una imagen Docker mantenida internamente; sin embargo, linuxserver.io mantiene una imagen Docker confiable en nombre de BookStack. Aunque la documentación en el sitio de Docker Hub tiene un archivo de configuración recomendado para Docker Compose, este tutorial creará un nuevo archivo de configuración mientras explica los conceptos.
En el host de Docker:
- Primero, crea una carpeta para BookStack. Si seguiste los tutoriales de la sección anterior, deberías tener una carpeta ~/containers. Crea una carpeta llamada bookstack dentro de ella.
2. Luego, crea un archivo de configuración en blanco para Docker Compose llamado docker-compose.yaml dentro de la carpeta bookstack.

3. Ahora abre el archivo de configuración de Docker Compose y define dos contenedores: el contenedor bookstack
y el contenedor bookstack_db
(mariadb).
Hasta ahora, este archivo docker-compose.yaml utiliza principalmente conceptos ya presentados: tienes dos servicios (bookstack
y bookstack_db
), ambos con imágenes y montajes de enlace. El contenedor de bookstack tiene un mapeo de puertos desde el puerto del host 8080 al puerto interno 80.
Dado el sobrecosto extremadamente bajo de los contenedores de Docker, es práctica común definir un contenedor de base de datos separado para cada aplicación web. Hacerlo permite una mayor separación de responsabilidades. Esto es claramente diferente de las configuraciones de bases de datos tradicionales, donde una única instalación de base de datos puede servir a cientos de aplicaciones web.
Una nueva opción que puedes ver en el archivo anterior es el comando depends_on
. Este comando indica a Docker el orden en el que deben iniciarse los contenedores. Al definir el comando depends_on
, le estás diciendo a Docker que el contenedor bookstack_db
debe iniciar primero.
Configuración de comunicación entre contenedores con variables de entorno
Este archivo de configuración creado en la última sección aún no está completo. Aunque has definido dos servicios (contenedores), ¡no están comunicándose entre sí! El contenedor bookstack
no tiene idea de cómo comunicarse con el contenedor bookstack_db
. Resolvamos eso utilizando variables de entorno.
Las variables de entorno son la forma más común de proporcionar variables a los contenedores de Docker. Estas son variables que se proporcionan en tiempo de ejecución (o se definen en el archivo de configuración docker-compose.yaml) para proporcionar información sobre lo que el contenedor necesita hacer.
Las variables de entorno son definidas por la persona que crea la imagen de Docker. Serán diferentes según la imagen de Docker que estés utilizando, y debes consultar la documentación del creador sobre qué variables de entorno usar.
Existen dos métodos para definir variables de entorno; directamente en el archivo docker-compose.yaml o como un archivo separado.
A separate file is, typically, the recommended method, especially if variables contain sensitive data such as passwords. A docker-compose.yaml file is designed to be shared or even uploaded to a public-facing GitHub repo. Having a separate file for sensitive data reduces the chance of an accidental security breach.
En el host de Docker, crea ahora dos variables de entorno; una para el contenedor bookstack y otra para el contenedor bookstack_db.
- Crea un nuevo archivo en la carpeta ~/containers/bookstack llamado bookstack.env con el siguiente contenido:
2. Crea un nuevo archivo en la carpeta ~/containers/bookstack llamado bookstack_db.env e incluye el siguiente contenido:
3. Como buena práctica, asegúrate de que ambos archivos env no sean legibles por otros usuarios.
Debes cambiar el acceso de lectura porque ambos archivos bookstack.env y bookstack_db.env contienen datos sensibles.
4. Actualiza el archivo ~/containers/bookstack/docker-compose.yaml de Docker Compose para hacer referencia a estos dos archivos de entorno que se muestran a continuación.
5. Ahora inicia los contenedores bookstack y bookstack_db utilizando Docker Compose.
Puedes ver cada uno de los pasos mencionados en esta sección realizados en VS Code a continuación.

Monitoreo de los registros de Docker Compose
El motor Docker trabaja con Docker Compose para llevar a cabo muchas tareas diferentes en segundo plano. Ser capaz de monitorear lo que está sucediendo, especialmente cuando se trabaja con múltiples contenedores a la vez, es útil.
Para monitorear el contenedor de bookstack, por ejemplo, utiliza el comando logs
. En este tutorial, una vez que veas que los registros muestran [services.d] done
, puedes ir a la URL de bookstack.


En esta etapa, deberías tener un wiki completamente funcional ejecutándose dentro de su propio contenedor, con su propia base de datos, ¡totalmente dentro de Docker!
Mientras tengas las carpetas de bookstack y bookstack_db, puedes recrear tu entorno de bookstack desde cero.
Docker Compose y Networking
Hasta este punto, no has aprendido mucho sobre la comunicación y el aspecto de networking de cómo funcionan los contenedores juntos. Vamos a cambiar eso.
Cuando creas múltiples contenedores dentro de un único archivo docker-compose.yaml como lo has hecho en las secciones anteriores, todos se asignan a la misma red (generalmente llamada nombre-de-la-carpeta-padre_default).
Puedes ver la red creada para los contenedores cuando ejecutas docker-compose up -d
como se muestra a continuación.

Cuando todos los contenedores se asignan dentro de la misma red, Docker crea entradas DNS para ellos internamente. Es por eso que en el ejemplo anterior, te referiste a tu base de datos como bookstack_db
en las variables de entorno. Ese nombre bookstack_db
es en realidad una entrada DNS que apunta a la dirección IP del contenedor de la base de datos.
Tampoco tienes que depender de Docker Compose para autogenerar redes para ti. Puedes definir manualmente redes internas o externas. La definición manual de redes es genial cuando tienes un contenedor que necesita comunicarse con otro contenedor en un archivo docker-compose.yaml separado. ¡Podrías exponer los puertos, o puedes crear una red a la que ambos puedan unirse!
Ten en cuenta que cuando comiences a definir redes explícitamente, también tendrás que definir explícitamente la red predeterminada. Docker Compose dejará de crear esa red automáticamente una vez que comiences a definir las redes.
Ahora modifica el archivo docker-compose.yaml de bookstack para incluir una red creada externamente.
- Crea la red externa con
docker network create my_external_network
.
2. Define la red externa en docker-compose.yaml:
3. Ejecuta docker-compose up -d
para recrear los contenedores. Ahora tus dos contenedores están unidos a dos redes como se muestra a continuación.

El contenedor de bookstack ahora está también unido a una red definida externamente. Esto te permite crear otro contenedor que convierta el tráfico HTTP de bookstack en HTTPS antes de que salga de Docker (llamado un proxy inverso).
Establecer un Usuario Específico para Ejecutar un Contenedor
Por defecto, todos los contenedores Docker se ejecutan como un usuario raíz en un entorno aislado. Esto es equivalente a ejecutar una máquina virtual con sesión iniciada como el usuario Administrador predeterminado. Si bien esto generalmente no suele ser un problema, existen preocupaciones de seguridad si el entorno aislado se ve comprometido.
Otro problema al ejecutarse como raíz son los permisos de archivo. Puede notar que si intenta eliminar la carpeta db dentro de la carpeta bookstack, en realidad no puede hacerlo; el contenido está en propiedad del usuario raíz.
Aunque la mayoría de las imágenes no tienen problemas al ejecutarse como un usuario no raíz, las imágenes de linuxserver.io en particular ofrecen una variable de entorno para establecer el usuario que se ejecuta dentro del contenedor. Puede hacerlo agregando UID=1000
y GID=1000
en la configuración de bookstack.env.
1000:1000 es el ID de usuario y grupo predeterminado para el primer usuario en Ubuntu (que es posible que no sea usted). Puede obtener más información sobre los ID de usuario y los ID de grupo en Relacionado: Un chico de Windows en un mundo Linux: Usuarios y Permisos de Archivos)
También puede forzar un UID y GID utilizando el parámetro
user
en el archivo docker-compose, pero no se recomienda, ya que la mayoría de los contenedores no se comportan bien cuando se les fuerza a un usuario diferente.
Configuración de la Política de Reinicio
Si desea que los contenedores construidos con Docker Compose se reinicien en caso de fallos, utilice la política restart
añadiendo el parámetro restart: <option>
en la configuración del contenedor en docker-compose.yaml.
Añadir este parámetro hará que los contenedores se reinicien automáticamente en caso de fallos para ayudar a mantener la disponibilidad en caso de problemas de energía inesperados.
Configuración manual de entradas DNS para contenedores
Al igual que en Windows y Linux, Docker también tiene un “archivo hosts”. Utilizando el parámetro extra_hosts en un archivo de configuración, puede forzar a un host a que se resuelva a una IP específica. Esto puede ser útil cuando se tienen restricciones de DNS, como DNS dividido o un servidor de pruebas con el que se desea interactuar temporalmente.
Ejecución de comandos
Una vez que el contenedor se haya iniciado, puede ejecutar comandos dentro del contenedor utilizando docker-compose run
. Por ejemplo, tal vez desee iniciar una terminal Bash dentro de su contenedor bookstack. Para hacerlo, ejecute el siguiente comando.
Conclusión
En esta etapa, debería tener suficiente información para seguir la mayoría de los tutoriales de docker-compose en la web. Tener este conocimiento puede expandir enormemente su capacidad para adentrarse en el mundo de Docker y la creación de aplicaciones web en Infraestructura como Código.
Source:
https://adamtheautomator.com/docker-compose-tutorial/