Volúmenes y redes en Docker
Volúmenes Docker para persistencia de datos y redes para comunicación entre contenedores
Dos conceptos clave para crear aplicaciones Docker robustas: volúmenes para persistir datos y redes para que los contenedores se comuniquen entre sí por nombre.
Volúmenes
Un volumen es un mecanismo para almacenar datos fuera del contenedor. Sin volúmenes, cuando borras un contenedor, pierdes todos sus datos. Con volúmenes, los datos persisten.
Tipos de volúmenes
1. Named volumes (volúmenes nombrados)
Almacenados en una ubicación gestionada por Docker (típicamente /var/lib/docker/volumes/). Son portátiles y fáciles de gestionar.
docker volume create mi-volumen
docker run -v mi-volumen:/data imagen
El directorio /data dentro del contenedor está vinculado al volumen mi-volumen.
2. Bind mounts (montajes vinculados)
Vinculan una ruta específica del host al contenedor. Útiles en desarrollo.
docker run -v /ruta/del/host:/ruta/contenedor imagen
docker run -v $(pwd):/app imagen # Directorio actual
3. tmpfs mounts
Volúmenes en memoria. Se pierden cuando el contenedor se detiene.
docker run --tmpfs /cache imagen
Comandos de volumen
# Listar volúmenes
docker volume ls
# Crear un volumen
docker volume create mi-volumen
# Inspeccionar un volumen
docker volume inspect mi-volumen
# Eliminar un volumen
docker volume rm mi-volumen
# Eliminar volúmenes sin usar
docker volume prune
Aunque elimines el contenedor, los datos persisten en postgres-data:
Redes
Una red Docker permite que los contenedores se comuniquen entre sí por nombre de contenedor (DNS interno).
Tipos de redes
1. bridge (por defecto)
Red aislada donde los contenedores pueden comunicarse por nombre.
docker network create mi-red
docker run -d --name app1 --network mi-red imagen1
docker run -d --name app2 --network mi-red imagen2
# Dentro de app1, ping app2 funciona:
docker exec app1 ping app2
2. host
El contenedor comparte la red del host (sin aislamiento).
docker run --network host imagen
--network host pierden el aislamiento de red. Usa solo si realmente necesitas rendimiento de red máximo, y ten cuidado con conflictos de puertos.
3. none
Sin red. El contenedor está aislado.
docker run --network none imagen
Comandos de red
# Listar redes
docker network ls
# Crear una red
docker network create mi-red
# Inspeccionar una red
docker network inspect mi-red
# Conectar un contenedor a una red existente
docker network connect mi-red contenedor-existente
# Desconectar
docker network disconnect mi-red contenedor-existente
# Eliminar una red
docker network rm mi-red
Desde dentro de app, puedes conectar a la base de datos usando el hostname db.
Alias DNS
Puedes dar alias a un contenedor en la red:
docker network connect --alias database app-network db
Ahora dentro de app, puedes usar database como hostname.
Volúmenes y redes en Docker Compose
En Docker Compose, volúmenes y redes se declaran en docker-compose.yml:
version: '3.9'
services:
app:
image: mi-app:1.0
volumes:
- app-data:/data # Volumen nombrado
- ./local:/app/local # Bind mount
networks:
- app-network
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
volumes:
app-data:
db-data:
networks:
app-network:
driver: bridge
Próximos pasos
- Comandos básicos:
docker volumeydocker network - Docker Compose: Declara volúmenes y redes en YAML
- Dockerfile: Incluye
VOLUMEyEXPOSEen tus imágenes