1. Descargar la imagen y levantar el primer contenedor
Para empezar, se obtiene la imagen oficial de MySQL y se ejecuta un contenedor de prueba.
docker pull mysql:8.0
docker run -d \
--name servidor-db \
-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
mysql:8.0
La variable MYSQL_ALLOW_EMPTY_PASSWORD=yes permite que el usuario root acceda sin contraseña. Solo debe usarse en entornos de prueba.
2. Inspeccionar el volumen creado automáticamente
La imagen de MySQL declara un volumen anónimo en /var/lib/mysql. Al arrancar el contenedor, Docker genera un volumen con un identificador aleatorio.
docker volume ls
Para ver los detalles del volumen generado:
docker volume inspect <ID_DEL_VOLUMEN>
La salida muestra el driver local, el punto de montaje en el host y el ámbito local.
3. Levantar un segundo contenedor y comparar volúmenes
docker run -d \
--name servidor-db2 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
mysql:8.0
docker volume ls
Cada contenedor recibe su propio volumen anónimo. Por tanto, los datos entre ambas instancias están aislados.
4. Comprobar la independencia de los volúmenes tras eliminar los contenedores
docker rm -f servidor-db servidor-db2
docker volume ls
Los volúmenes siguen presentes aunque los contenedores ya no existan. Esta independencia es la base de la persistencia en Docker.
5. Limpiar los volúmenes huérfanos
docker volume rm <ID_VOLUMEN_1> <ID_VOLUMEN_2>
docker volume ls
6. Usar un volumen nombrado con el parámetro -v
Para facilitar la reutilización, se asocia un volumen con un nombre explícito al crear el contenedor.
docker run -d \
--name servidor-db \
-v datos-mysql:/var/lib/mysql \
-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
mysql:8.0
docker volume inspect datos-mysql
El punto de montaje en el host será similar a /var/lib/docker/volumes/datos-mysql/_data.
7. Crear datos de prueba dentro del contenedor
Se accede al servidro MySQL y se crea una base de datos llamada prueba_db.
docker exec -it servidor-db /bin/bash
mysql -u root
mysql> CREATE DATABASE prueba_db;
mysql> SHOW DATABASES;
mysql> EXIT
8. Eliminar el contenedor sin borrar el volumen
docker rm -f servidor-db
docker volume ls
El volumen datos-mysql permanece disponible.
9. Reutilizar el volumen en un nuevo contenedor
docker run -d \
--name servidor-db-nuevo \
-v datos-mysql:/var/lib/mysql \
-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
mysql:8.0
10. Verificar la persistencia de los datos
Se accede al nuevo contenedor y se comprueba que la base de datos creada anteriormente sigue existiendo.
docker exec -it servidor-db-nuevo /bin/bash
mysql -u root
mysql> SHOW DATABASES LIKE 'prueba_db';
La base de datos prueba_db sigue disponible gracias al volumen nombrado.
Asepctos a tener en cuentta
- La directiva
VOLUMEde un Dockerfile genera un volumen anónimo si no se especifica un nombre con-v. - Un volumen nombrado simplifica la administración, el respaldo y la migración de datos.
- El ciclo de vida del volumen es independiente del ciclo de vida del contenedor.
- Varios contenedores pueden montar el mismo volumen, aunque en bases de datos concurrentes se debe evaluar la consistencia y el acceso simultáneo.