7.1 Montaje de volúmenes
Montar volúmenes y redes en Docker Compose permite crear aplicaciones multicontenedor flexibles y eficientes. Los volúmenes (volumes) se usan para almacenar datos que deben conservarse fuera de los contenedores, mientras que las redes (networks) aseguran la interacción entre contenedores. En esta lección vamos a analizar en detalle cómo usar volúmenes y redes en Docker Compose.
Los volúmenes en Docker permiten guardar datos fuera de los contenedores, asegurando su disponibilidad incluso después de detener o eliminar los contenedores. Esto es especialmente útil para guardar datos de bases de datos, logs y otros datos que deben ser persistentes.
Tipos de volúmenes:
- Volúmenes nombrados (Named Volumes): gestionados por Docker y guardados en un directorio especial en el host.
- Montajes vinculados (Bind Mounts): montados en el contenedor desde un directorio específico en el host.
Definición de volúmenes en Docker Compose
Ejemplo de volúmenes nombrados
En este ejemplo se crea un volumen nombrado postgres-data
, que se monta en el directorio /var/lib/postgresql/data
dentro del contenedor db
.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Ejemplo de montajes vinculados
En este ejemplo, los directorios y archivos locales nginx.conf
y html
se montan en el contenedor web
como montajes vinculados.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Montaje de redes
Las redes en Docker Compose permiten que los contenedores interactúen entre sí. Cada contenedor puede estar conectado a una o más redes, lo que garantiza el aislamiento y la gestión del tráfico.
Tipos de redes:
- Redes de puente (Bridge): por defecto, los contenedores se conectan a una red de puente, que proporciona su interacción dentro de un mismo host.
- Redes superpuestas (Overlay): se utilizan para la interacción de contenedores ejecutados en diferentes hosts dentro de un clúster Docker Swarm.
- Plugins de red (Network Plugins): permiten utilizar controladores de red externos para configuraciones más complejas.
Ejemplo de creación y uso de redes personalizadas
En este ejemplo, se crean dos redes personalizadas front-end y back-end. El servicio app está conectado a ambas redes, el servicio web solo a front-end, y el servicio db solo a back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Consejos prácticos:
- Uso de volúmenes con nombre: los volúmenes con nombre son gestionados por Docker y proporcionan facilidad de uso y gestión de datos. Los volúmenes con nombre se pueden conectar a varios servicios al mismo tiempo. Por ejemplo, un servicio de backend registra logs, mientras que un servicio de monitoreo los analiza y notifica si se detectan errores de nivel
error
. - Separación de redes: el uso de múltiples redes permite aislar diferentes partes de la aplicación y controlar su interacción.
- Almacenamiento de archivos de configuración: utiliza volúmenes vinculados para montar archivos de configuración, lo que permite cambiar la configuración fácilmente sin necesidad de reconstruir las imágenes.
- Seguridad de redes: limita el acceso a las redes para que solo los contenedores necesarios puedan interactuar, aumentando así la seguridad de la aplicación.
7.3 Ejemplos de uso de volúmenes y redes
Ejemplos de uso de volúmenes y redes en Docker Compose:
Ejemplo 1: Aplicación con servidor web y base de datos
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
En este ejemplo:
- El servidor web nginx y la base de datos PostgreSQL están conectados a una red llamada webnet, lo cual les permite interactuar. Si solo hay una red, no es necesario especificarla: se creará una red por defecto.
- Los datos de la base de datos se almacenan en un volumen llamado db-data, lo que asegura su persistencia tras reiniciar los contenedores.
Ejemplo 2: Aplicación con múltiples capas
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
En este ejemplo:
- Se crean dos redes: front-tier y back-tier.
- El servicio frontend está conectado a ambas redes, lo cual le permite interactuar tanto con backend como con clientes externos.
- Los servicios backend y database están conectados solo a la red back-tier para garantizar su aislamiento e interacción.
- Los datos de los servicios backend y database se almacenan en volúmenes separados llamados backend-data y db-data.
GO TO FULL VERSION