Los contenedores están diseñados para ser efímeros.
Esto significa que si un contenedor se elimina, todo lo que estaba almacenado dentro de él desaparece.
Esto es útil para aplicaciones temporales, pero es un problema cuando una aplicación necesita guardar datos persistentes.
Por ejemplo:
Para resolver este problema Docker utiliza volúmenes.
Un volumen es un espacio de almacenamiento que existe fuera del contenedor, pero que puede montarse dentro de él.
Esto permite que:
Conceptualmente:
Contenedor
│
└── /var/lib/mysql
│
▼
Volumen
(datos persistentes)
En Docker Compose los volúmenes se definen normalmente dentro del servicio.
Ejemplo:
services:
db:
image: mysql
volumes:
- db-data:/var/lib/mysql
Esto significa:
/var/lib/mysqldb-datavolumes:En muchos casos los volúmenes se declaran también al final del archivo docker-compose.yml.
Ejemplo:
services:
db:
image: mysql
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
Esto crea un volumen gestionado por Docker.
Docker se encarga de:
Normalmente se almacenan en una ruta interna de Docker, por ejemplo:
/var/lib/docker/volumes/
También es posible no declarar el volumen en el bloque volumes:.
Ejemplo:
services:
db:
image: mysql
volumes:
- db-data:/var/lib/mysql
Aunque el volumen no esté definido abajo, Docker lo creará automáticamente.
En este caso Docker decidirá:
Esto es práctico para entornos simples o de laboratorio.
Otra opción es montar directamente una carpeta del host.
Ejemplo:
services:
web:
image: nginx
volumes:
- ./web:/usr/share/nginx/html
Esto significa:
Carpeta local ./web
│
▼
/usr/share/nginx/html dentro del contenedor
Esto se llama bind mount.
Se utiliza mucho para:
| Tipo | Quién gestiona el almacenamiento | Uso habitual |
|---|---|---|
| Volumen Docker | Docker | Producción |
| Bind mount | Sistema de archivos del host | Desarrollo |
Los volúmenes permiten separar:
Esto permite:
Este concepto aparece también en Kubernetes, donde los volúmenes se gestionan mediante:
Por eso es importante entender primero cómo funcionan los volúmenes en Docker.