3.1 Archivo compose.yaml
El archivo compose.yaml
(o alguna de estas otras opciones: docker-compose.yaml
, docker-compose.yml
, compose.yml
) es el archivo principal de configuración que usa Docker Compose para definir y gestionar aplicaciones multicontenedor. Describe qué contenedores (servicios) deben ejecutarse, cómo interactúan entre sí y qué recursos necesitan.
Para mantener consistencia en esta lección, usaremos la opción compose.yaml
, ya que se recomienda para las versiones modernas de Docker Compose.
Estructura del archivo compose.yaml
El archivo compose.yaml
está compuesto de varias secciones, cada una describiendo diferentes aspectos de la configuración de la aplicación. Las secciones principales incluyen:
- version: especifica la versión del archivo Compose (por ejemplo,
'3.9'
). - services: describe los contenedores (servicios), sus configuraciones y dependencias.
- volumes: define volúmenes para almacenar datos entre los contenedores y el host.
- networks: configura las redes a través de las cuales los servicios se comunican entre sí.
3.2 Directivas principales
1. version
La directiva version define la versión de sintaxis de Docker Compose que se usa en el archivo compose.yaml
. En el momento de escribir este artículo, la versión más actual es la 3, en particular sus actualizaciones como 3.8 y 3.9.
version: '3.9'
2. services
La sección services define los contenedores que Compose debe crear y ejecutar. Cada servicio representa un contenedor independiente con una configuración específica.
Ejemplo:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
En este ejemplo se definen dos servicios: web
y db
. El servicio web
utiliza la imagen nginx:latest
y abre el puerto 80. El servicio db
utiliza la imagen mongo:latest
y conecta un volumen para almacenar datos.
3. volumes
La sección volumes se utiliza para definir volúmenes que pueden ser conectados a contenedores para almacenar datos. Esto es útil para conservar datos al reiniciar contenedores.
Ejemplo:
volumes:
mongo-data:
4. networks
La sección networks permite definir redes personalizadas en las que trabajarán los contenedores. Esto garantiza aislamiento y configuración de las conexiones de red. Si no se especifican redes, Docker Compose creará una red predeterminada y todos los servicios se conectarán a ella.
Ejemplo:
networks:
front-end:
back-end:
3.3 Directivas para configurar servicios
Directivas principales para configurar servicios:
1. image
La directiva image indica la imagen que será utilizada para crear el contenedor.
Ejemplo:
services:
web:
image: nginx:latest
2. build
La directiva build se usa para indicar la ruta al Dockerfile que debe ser utilizado para construir la imagen.
Ejemplo:
services:
app:
build: ./app
3. ports
La directiva ports define los puertos que deben ser abiertos y redirigidos desde la máquina host al contenedor.
Ejemplo:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
La directiva volumes monta volúmenes en los contenedores, lo que permite guardar los datos entre reinicios de los contenedores.
Ejemplo:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
La directiva environment establece variables de entorno para el contenedor.
Ejemplo:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
La directiva depends_on indica que este servicio depende de otros servicios y debe ser ejecutado después de ellos.
¡Importante!
Cuando se ejecuta tu servicio, no hay una garantía del 100% de que todos los servicios necesarios para su funcionamiento estén completamente listos. Estarán ejecutados —sí—, pero no se garantiza que funcionen correctamente. Este problema se soluciona con health-check, pero hablaremos de eso más tarde.
Ejemplo:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
La directiva command permite sobrescribir el comando que será ejecutado al iniciar el contenedor.
Ejemplo:
services:
app:
image: myapp:latest
command: python app.py
8. networks
La directiva networks conecta el servicio a una o más redes.
Ejemplo:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Ejemplo completo
Ejemplo de archivo completo compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
En este ejemplo:
- Se definieron tres servicios:
web
,app
ydb
. -
web
usa una imagen Nginx, monta un archivo de configuración y depende del servicioapp
. -
app
se construye desde un Dockerfile local, monta el código fuente de la aplicación y usa variables de entorno. -
db
usa una imagen de MongoDB y monta un volumen para almacenar los datos. - Se crean dos volúmenes y dos redes para aislar y manejar la interacción entre los servicios.
Nota: un volumen es mongo-data
y el otro es un directorio montado desde la máquina host (por ejemplo, ./app
).
GO TO FULL VERSION