Persistencia de datos con volúmenes de Docker y MySQL

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 VOLUME de 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.

Etiquetas: Docker MySQL Docker Volume Data Persistence Containerization

Publicado el 6-23 19:46