Montar un volumen para persistir datos
En este paso, aprenderás cómo usar volúmenes de Docker para conservar datos generados y utilizados por contenedores Docker. Por defecto, los datos dentro de un contenedor son efímeros; se pierden cuando el contenedor se elimina. Los volúmenes proporcionan una forma de almacenar datos fuera del sistema de archivos del contenedor, permitiendo que persistan incluso después de que el contenedor se detenga o elimine.
Primero, detengamos y eliminemos el contenedor my-nginx
del paso anterior.
docker stop my-nginx
docker rm my-nginx
Ahora, crearemos un volumen de Docker. Los volúmenes son administrados por Docker y se almacenan en un área dedicada de la máquina host.
docker volume create my-volume
Deberías ver el nombre del volumen (my-volume
) impreso, confirmando que fue creado.
Puedes listar los volúmenes existentes usando el comando docker volume ls
.
docker volume ls
Deberías ver my-volume
en la lista de volúmenes.
Ahora, ejecutaremos un nuevo contenedor nginx
y montaremos el volumen my-volume
en el directorio webroot predeterminado de Nginx dentro del contenedor, que es /usr/share/nginx/html
. Esto significa que cualquier archivo colocado en /usr/share/nginx/html
dentro del contenedor se almacenará realmente en my-volume
en el host.
Ejecutaremos el contenedor en modo desatendido (-d
), publicaremos el puerto 80 del contenedor al puerto 8081 en el host (-p 8081:80
), le asignaremos un nombre (my-nginx-volume
), y usaremos el flag -v
para montar el volumen. El formato para montar un volumen con nombre es nombre_volumen:ruta_contenedor
.
docker run -d --name my-nginx-volume -p 8081:80 -v my-volume:/usr/share/nginx/html nginx
Deberías ver el ID del contenedor impreso, indicando que el contenedor está en ejecución.
Ahora, coloquemos un archivo HTML simple en el volumen montado. Podemos hacer esto ejecutando un comando dentro del contenedor usando docker exec
. Crearemos un archivo llamado index.html
en /usr/share/nginx/html
con contenido simple.
docker exec my-nginx-volume sh -c 'echo "<h1>¡Hola desde el volumen!</h1>" > /usr/share/nginx/html/index.html'
Este comando ejecuta un shell (sh -c
) dentro del contenedor my-nginx-volume
y ejecuta el comando echo
para crear el archivo index.html
.
Ahora, accedamos al servidor web en el puerto 8081 del host para ver el contenido del archivo index.html
que acabamos de crear.
curl http://localhost:8081
Deberías ver <h1>¡Hola desde el volumen!</h1>
en la salida. Esto confirma que el archivo creado dentro del contenedor está siendo servido por Nginx, y como fue escrito en el volumen montado, los datos son persistentes.
Para demostrar la persistencia, detengamos y eliminemos el contenedor my-nginx-volume
.
docker stop my-nginx-volume
docker rm my-nginx-volume
Ahora, ejecutemos un nuevo contenedor, montando el mismo volumen. Llamaremos a este nuevo contenedor my-nginx-volume-new
y publicaremos su puerto 80 al puerto 8082 del host.
docker run -d --name my-nginx-volume-new -p 8082:80 -v my-volume:/usr/share/nginx/html nginx
El nuevo contenedor está en ejecución y está usando el mismo my-volume
. Accedamos al servidor web en el puerto 8082.
curl http://localhost:8082
Deberías seguir viendo <h1>¡Hola desde el volumen!</h1>
en la salida. Esto ocurre porque el archivo index.html
se almacenó en my-volume
, que persistió incluso después de eliminar el contenedor original. El nuevo contenedor, al montar el mismo volumen, tiene acceso a los datos escritos previamente.
Esto demuestra el poder de los volúmenes para persistir datos independientemente del ciclo de vida del contenedor.