En esta parte de la traducción de nuestra serie de materiales sobre Docker, hablaremos sobre el manejo de datos. Específicamente, sobre los volúmenes de Docker. En estos materiales, hemos estado comparando constantemente los mecanismos de software de Docker con diferentes analogías comestibles. No nos apartaremos de esta tradición aquí. Los datos en Docker serán nuestras especias. En el mundo existen muchas variedades de especias, y en Docker, muchas maneras de manejar datos.
→
→
→
→
→
→
Tenga en cuenta que este material se ha preparado utilizando el motor Docker versión 18.09.1 y API versión .
Los datos en Docker pueden almacenarse de forma temporal o permanente. Comencemos con los datos temporales.
Almacenamiento temporal de datos
En los contenedores Docker, se pueden organizar los datos temporales de dos maneras.
Por defecto, los archivos creados por la aplicación que se ejecuta en el contenedor se almacenan en la capa del contenedor que admite escritura. Para que este mecanismo funcione, no se necesita nada de configuración especial. Es una solución económica y efectiva. La aplicación solo necesita guardar los datos y continuar con sus tareas. Sin embargo, una vez que el contenedor deje de existir, también desaparecerán los datos almacenados de esta manera sencilla.
Para almacenar archivos temporales en Docker, también se puede utilizar otra solución adecuada para aquellos casos que requieren un nivel de rendimiento más alto en comparación con el que se puede alcanzar utilizando el mecanismo estándar de almacenamiento temporal de datos. Si no necesita que sus datos se almacenen más allá de la vida del contenedor, puede montar un tmpfs al contenedor: un almacenamiento temporal de información que utiliza la memoria RAM del host. Esto permitirá acelerar las operaciones de escritura y lectura de datos.
A menudo, es necesario almacenar datos incluso después de que el contenedor haya dejado de existir. Para esto, necesitaremos mecanismos de almacenamiento permanente de datos.
Almacenamiento permanente de datos
Existen dos formas de prolongar la vida útil de los datos más allá de la duración del contenedor. Una de las maneras es utilizar la tecnología de montaje enlazado. Con este enfoque, se puede montar, por ejemplo, una carpeta que realmente exista en el contenedor. Así, los procesos que están fuera de Docker también podrán trabajar con los datos almacenados en esa carpeta. Así es como el montaje de tmpfs y la tecnología de montaje enlazado.

Montaje de tmpfs y montaje enlazado
Las desventajas del uso de la tecnología de montaje enlazado son que complica la copia de seguridad de los datos, la migración de datos y el uso compartido de datos entre varios contenedores. Es mucho mejor utilizar volúmenes de Docker para el almacenamiento permanente de datos.
Volumenes de Docker
Un volumen es un sistema de archivos que se encuentra en la máquina host fuera de los contenedores. Docker es el encargado de crear y gestionar los volúmenes. Estas son las principales características de los volúmenes de Docker:
- Son medios para el almacenamiento permanente de información.
- Son autónomos y están separados de los contenedores.
- Pueden ser utilizados de forma conjunta por diferentes contenedores.
- Permiten organizar la lectura y escritura de datos de manera eficiente.
- Los volúmenes se pueden alojar en recursos de un proveedor de nube remoto.
- Se pueden cifrar.
- Se les pueden asignar nombres.
- Un contenedor puede preparar un volumen con datos por adelantado.
- Son útiles para pruebas.
Como pueden ver, los volúmenes de Docker tienen características extraordinarias. Hablemos de cómo crearlos.
Creación de volúmenes
Los volúmenes se pueden crear utilizando Docker o mediante solicitudes a la API.
Aquí está la instrucción en Dockerfile que permite crear un volumen al iniciar el contenedor.
VOLUME /my_volumeAl usar tal instrucción de Docker, después de crear el contenedor, se creará un volumen que contendrá los datos que ya están en la ubicación especificada. Tenga en cuenta que, si crea un volumen utilizando Dockerfile, esto no le exime de la necesidad de especificar el punto de montaje del volumen.
Los volúmenes en Dockerfile también se pueden crear utilizando el formato JSON.
Además, los volúmenes se pueden crear mediante la línea de comandos mientras se ejecuta el contenedor.
Trabajando con volúmenes desde la línea de comandos
▍Creación de un volumen
Se puede crear un volumen independiente con el siguiente comando:
docker volume create —-name my_volume▍Verificación de información sobre volúmenes
Para ver la lista de volúmenes de Docker, utiliza el siguiente comando:
docker volume lsPuedes explorar un volumen específico de esta manera:
docker volume inspect my_volume▍Eliminación de un volumen
Puedes eliminar un volumen de esta forma:
docker volume rm my_volumePara eliminar todos los volúmenes que no están en uso por contenedores, puedes usar este comando:
docker volume pruneAntes de eliminar volúmenes, Docker te pedirá confirmación para llevar a cabo esta operación.
Si un volumen está asociado a un contenedor, ese volumen no se puede eliminar hasta que se elimine el contenedor correspondiente. Además, incluso si el contenedor ha sido eliminado, Docker no siempre lo entiende. Si esto ocurre, puedes utilizar el siguiente comando:
docker system pruneEste comando está diseñado para limpiar recursos de Docker. Después de ejecutar este comando, deberías poder eliminar volúmenes cuyos estados se habían determinado incorrectamente antes.
Los flags —mount y —volume
Al trabajar con volúmenes, a menudo tendrás que usar flags cuando ejecutes el comando docker. Por ejemplo, para crear un volumen al crear un contenedor, puedes usar esta estructura:
docker container run --mount source=my_volume, target=\/container\/path\/for\/volume my_image En tiempos pasados (antes de 2017), el flag --volumeera muy popular. Originalmente, este flag (también puedes usar su forma abreviada, que es -v) se usaba para contenedores independientes, mientras que el flag --mount se utilizaba en el entorno de Docker Swarm. Sin embargo, a partir de Docker 17.06, el flag --mount puede usarse en cualquier escenario.
Es importante señalar que al usar el flag --mount aumenta la cantidad de información adicional que debes especificar en el comando, pero por varias razones, es mejor usar este flag en lugar de --volume. La bandera --mount — es el único mecanismo que permite trabajar con servicios o especificar parámetros del controlador del volumen. Además, trabajar con este flag resulta más sencillo.
En los ejemplos existentes de comandos dirigidos a trabajar con datos en Docker, puedes encontrar numerosos ejemplos del uso del flag -v. Al intentar adaptar estos comandos para ti, ten en cuenta que los flags --mount y --volume utilizan diferentes formatos de parámetros. Es decir, no puedes simplemente reemplazar -v en --mount y obtener un comando funcional.
La principal diferencia entre --mount y --volume es que al usar el flag --volume todos los parámetros se agrupan juntos, en un solo campo, mientras que al usar --mount los parámetros se separan.
Al trabajar con --mount los parámetros se presentan como pares de clave-valor, específicamente se ven como clave=valor. Estos pares se separan por comas. Aquí hay parámetros comúnmente utilizados --mount:
tipo— el tipo de montaje. El valor correspondiente para la clave puede ser , o . Aquí hablamos de volúmenes, es decir, nos interesa el valorvolumen.source— la fuente de montaje. Para volúmenes nombrados, esto es el nombre del volumen. Para volúmenes no nombrados, esta clave no se indica. Puede abreviarse asrc.destino— la ruta a la que se monta el archivo o carpeta en el contenedor. Esta clave puede abreviarse adstotarget.readonly— monta un volumen que está destinado . No es obligatorio usar esta clave, no se le asigna un valor.
Aquí hay un ejemplo de uso --mount con múltiples parámetros:
docker run --mount type=volume,source=volume_name,destination=\/path\/in\/container,readonly my_imageResultados
Aquí hay comandos útiles que se pueden utilizar al trabajar con volúmenes de Docker:
docker volume createdocker volume lsdocker volume inspectdocker volume rmdocker volume prune
Aquí hay una lista de parámetros comúnmente utilizados para --mount, aplicables en un comando del tipo docker run --mount my_options my_image:
type=volumesource=volume_namedestination=\/path\/in\/containerreadonly
Ahora que hemos terminado esta serie de materiales sobre Docker, es hora de decir algunas palabras sobre a dónde pueden ir aquellos que están aprendiendo Docker. un gran y buen artículo sobre Docker. un libro sobre Docker (al comprar este libro, intenta conseguir la edición más reciente). otro libro que será adecuado para aquellos que creen que la práctica es la mejor manera de aprender tecnologías.
¡Estimados lectores! ¿Qué materiales sobre Docker recomendarías a los principiantes?
Fuente: habr.com
