Por lo general, un contenedor es tanto inmutable (no cambia una vez en ejecución) como efímero (si requiere modificaciones creamos uno nuevo que las incluya). Es importante aclarar que esto no constituye una limitación de la tecnología, sino más bien una característica de diseño. Sin embargo, el contenedor todavía necesita acceder a archivos que persistan más allá de este ciclo (bases de datos, por ejemplo). Por ese motivo, en esta guía aprenderás a usar volúmenes como almacenamiento con Docker en Ubuntu 20.04.
Para alcanzar la separación de responsabilidades entre las aplicaciones y el almacenamiento permanente, Docker nos provee dos alternativas. La primera de ellas consiste en el uso de volúmenes y no requiere más que una ubicación especial para los archivos, la cual es enteramente administrada por Docker. La otra involucra emplear bind mounts, que representan un enlace entre un directorio local y otro del contenedor. En este caso usaremos volúmenes por ser el método que recomienda Docker debido a las siguientes razones:
- Administración a través de la línea de comandos
- Incluyen soporte para cifrado y pueden ser compartidos entre distintos contenedores
- Simplicidad para hacer copias de respaldo o migraciones
- Posibilidad de utilizar hosts remotos o proveedores en la nube
Requisitos previos
- Completar los pasos detallados en Instalar Docker y crear un contenedor en Ubuntu 20.04.
- Verificar que exista una regla en el cortafuegos de Donweb que permita el tráfico entrante al puerto 8080/TCP. Si necesitas asistencia, puedes consultar el artículo Firewall en la sección de ayuda.
Paso 1: Crear un volumen con nombre y agregar contenido
Para comenzar, veamos las opciones disponibles para la manipulación de volúmenes:
sudo docker volume --help
sudo docker volume create --help
Como observamos arriba, para crear un nuevo volumen utilizamos docker volume create
seguido del nombre que deseamos darle. Usaremos el comando que aparece abajo para crear un volumen con el nombre webvol. Por el momento no agregaremos opciones adicionales.
sudo docker volume create webvol
En cualquier momento puedes ver la lista completa de volúmenes de una forma sencilla:
sudo docker volume ls
Para acceder a más detalles sobre webvol, haz lo siguiente:
sudo docker volume inspect webvol
El dato de mayor interés por el momento es Mountpoint, que representa el directorio del host que está dedicado a este volumen en particular. La ruta al directorio resalta una de las características de los volúmenes: son administrados por Docker y se encuentran fuera de las áreas personales de los usuarios.
Ahora agrega una línea de contenido a un archivo index.html en esa ubicación. Por simplicidad y a fines demostrativos no seguimos la estructura formal de una página web:
sudo sh -c "echo 'Hola desde un volumen' > /var/lib/docker/volumes/webvol/_data/index.html"
Ahora que dispones de un volumen y contenido en el mismo, en el próximo paso lo usarás durante la creación de un contenedor desde cero.
Paso 2: Creación del contenedor y uso del volumen
A pesar de que las creaciones del volumen y del contenedor pueden realizarse juntas, en esta guía decidimos realizarlas de forma separada. El motivo detrás de esta elección es resaltar la independencia entre ambos recursos. Por ese mismo motivo, para borrar un volumen se requiere de un paso adicional debido a cuestiones de seguridad. En otras palabras, un volumen no se elimina automáticamente al descartar un contenedor.
A continuación, crea un nuevo contenedor llamado webserver agregando la opción --mount source=webvol,destination=/usr/share/nginx/html
. Esta opción montará el volumen webvol en el directorio /usr/share/nginx/html, que es la raíz del sitio web por defecto.
sudo docker container run --name=webserver --publish 8080:80 --detach --restart=always --mount source=webvol,destination=/usr/share/nginx/html nginx
Ahora consulta la lista actual de contenedores para verificar que webserver esté corriendo. En caso de ser así, abre el puerto 8080 de tu servidor en un navegador:
Si lo deseas, puedes ver los logs del contenedor:
sudo docker container logs webserver
Como mencionamos anteriormente, el volumen es independiente del contenedor y hasta puede usarse en otro. Para ilustrar, detengamos y eliminemos webserver para luego confirmar que el volumen está intacto:
sudo docker container stop webserver
sudo docker container rm webserver
sudo docker volume ls
cat /var/lib/docker/volumes/webvol/_data/index.html
Antes de seguir, aprovecha para agregar una nueva línea al archivo index.html:
sudo sh -c "echo '<br>Esta es una nueva linea' >> /var/lib/docker/volumes/webvol/_data/index.html"
Crea un nuevo contenedor webserver2 con el mismo comando que antes:
sudo docker container run --name=webserver2 --publish 8080:80 --detach --restart=always --mount source=webvol,destination=/usr/share/nginx/html nginx
Como lo hiciste anteriormente, abre el navegador en la misma dirección:
Aunque no lo haremos en esta ocasión, el comando para eliminar un volumen es docker volume rm
seguido del nombre de este. Si quieres eliminarlos a todos con un solo comando, deberás usar docker volume prune
.
Como puedes observar, los contenedores son reciclables. Sin embargo, la persistencia que aportan los volúmenes nos permite continuar usando nuestros datos sin problemas. El archivo index.html que usamos puede representar una gran cantidad de información permanente que debemos independizar del contenedor en sí.
Conclusión
En esta oportunidad aprendiste a crear un volumen con nombre, a agregar contenido a este, y a emplearlo en un contenedor. Siguiendo los mismos conceptos puedes hacer una aplicación más robusta e incluso experimentar con otras imágenes. Si necesitas ideas sobre las posibilidades, te recomendamos examinar el Docker Hub.