Gestión de datos con Docker Volumes
Un desafío al trabajar con contenedores Docker es la persistencia de datos. Los contenedores son efímeros, lo que significa que cualquier dato creado dentro de un contenedor se pierde cuando se elimina el contenedor. Los Docker volumes resuelven este problema al proporcionar una forma de persistir los datos fuera de los contenedores.
Comprensión de Docker Volumes
Los Docker volumes son el mecanismo preferido para persistir los datos generados y utilizados por los contenedores Docker. Son completamente gestionados por Docker y están aislados de la estructura de directorios del sistema de archivos del host.
Los beneficios de usar volúmenes incluyen:
- Los volúmenes son más fáciles de respaldar o migrar que los bind mounts
- Puede gestionar volúmenes utilizando comandos de la CLI de Docker
- Los volúmenes funcionan tanto en contenedores Linux como Windows
- Los volúmenes se pueden compartir de forma más segura entre múltiples contenedores
- Los controladores de volumen le permiten almacenar volúmenes en hosts remotos, proveedores de la nube o cifrar el contenido de los volúmenes
Creación y uso de Docker Volumes
Creemos un contenedor de base de datos MySQL simple que utiliza un volumen para persistir sus datos.
Creación de un Volumen
Primero, cree un Docker volume:
docker volume create mysql-data
Puede listar todos los volúmenes con:
docker volume ls
Debería ver su nuevo volumen en la lista:
DRIVER VOLUME NAME
local mysql-data
Ejecución de un contenedor con un volumen
Ahora, ejecutemos un contenedor MySQL que utiliza este volumen:
docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=mysecretpassword -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
Este comando:
--name mysql-db: Nombra el contenedor "mysql-db"
-e MYSQL_ROOT_PASSWORD=mysecretpassword: Establece una variable de entorno para configurar MySQL
-v mysql-data:/var/lib/mysql: Monta el volumen "mysql-data" en el directorio donde MySQL almacena sus datos
-p 3306:3306: Mapea el puerto 3306 en el host al puerto 3306 en el contenedor
-d: Ejecuta el contenedor en modo desatendido (detached mode)
mysql:5.7: Especifica la imagen a utilizar
Espere un momento a que el contenedor se inicie, luego verifique que se esté ejecutando:
docker ps
Interactuando con la base de datos
Creemos una base de datos y una tabla para demostrar la persistencia de datos. Primero, conéctese al contenedor MySQL:
docker exec -it mysql-db bash
Dentro del contenedor, conéctese al servidor MySQL:
mysql -u root -pmysecretpassword
Cree una nueva base de datos y tabla:
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
INSERT INTO users (name) VALUES ('John'), ('Jane'), ('Bob');
SELECT * FROM users;
Debería ver los datos insertados:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Jane |
| 3 | Bob |
+----+------+
Salga del prompt de MySQL y del contenedor:
exit
exit
Probando la persistencia del volumen
Ahora, detengamos y eliminemos el contenedor, luego creemos uno nuevo usando el mismo volumen:
docker stop mysql-db
docker rm mysql-db
Cree un nuevo contenedor usando el mismo volumen:
docker run --name mysql-db-new -e MYSQL_ROOT_PASSWORD=mysecretpassword -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
Ahora conéctese al nuevo contenedor y verifique si nuestros datos persistieron:
docker exec -it mysql-db-new bash
mysql -u root -pmysecretpassword
USE testdb
SELECT * FROM users
Debería ver los mismos datos que insertamos anteriormente:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Jane |
| 3 | Bob |
+----+------+
Salga del prompt de MySQL y del contenedor:
exit
exit
Esto demuestra que los datos persistieron incluso después de que se eliminó el contenedor original, porque se almacenaron en un Docker volume.
Inspección y gestión de volúmenes
Puede inspeccionar un volumen para obtener más información al respecto:
docker volume inspect mysql-data
Esto mostrará detalles como el punto de montaje y el controlador utilizado:
[
{
"CreatedAt": "YYYY-MM-DDTHH:MM:SS+00:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
"Name": "mysql-data",
"Options": {},
"Scope": "local"
}
]
Para limpiar, detengamos y eliminemos el contenedor:
docker stop mysql-db-new
docker rm mysql-db-new
Si también desea eliminar el volumen:
docker volume rm mysql-data
Ahora ha aprendido a usar Docker volumes para persistir datos entre los ciclos de vida de los contenedores, lo cual es esencial para aplicaciones con estado como las bases de datos.