En la entrega de hoy de la serie Docker, hablaremos sobre trabajar con datos. En particular, los volúmenes de Docker. En estos materiales, comparamos constantemente los mecanismos de software de Docker con varias analogías comestibles. No nos apartaremos de esta tradición aquí. Los datos de Docker deben ser especiados. Hay muchos tipos de especias en el mundo, y en Docker hay muchas formas de trabajar con datos.
→
Parte 1: lo básico→
Parte 2: términos y conceptos→
Parte 3: archivos Dockerfile→
Parte 4: reducir el tamaño de las imágenes y acelerar su ensamblaje→
Parte 5: equipos→
Parte 6: trabajar con datosTenga en cuenta que este material se preparó con el motor Docker versión 18.09.1 y la versión API
1.39 .
Los datos de Docker se pueden almacenar de forma temporal o permanente. Comencemos con los datos de tiempo.
Almacenamiento temporal de datos
Hay dos formas de organizar el trabajo con datos temporales en contenedores Docker.
De manera predeterminada, los archivos creados por una aplicación que se ejecuta en un contenedor se guardan en una capa de contenedor habilitada para grabación. Para que este mecanismo funcione, no necesita configurar nada específicamente. Resulta barato y enojado. Una aplicación solo necesita guardar datos y continuar haciendo lo suyo. Sin embargo, una vez que el contenedor deje de existir, los datos almacenados de forma tan simple desaparecerán.
Para almacenar archivos temporales en Docker, puede usar otra solución adecuada para aquellos casos en los que se requiere un mayor nivel de rendimiento en comparación con lo que se puede lograr utilizando el mecanismo estándar para el almacenamiento temporal de datos. Si no necesita que sus datos se almacenen más tiempo del que existe el contenedor, puede conectar tmpfs al contenedor, un almacenamiento temporal de información que utiliza la RAM del host. Esto acelerará el rendimiento de la escritura y lectura de datos.
A menudo sucede que los datos deben almacenarse incluso después de que el contenedor deje de existir. Para hacer esto, necesitamos mecanismos útiles para el almacenamiento permanente de datos.
Almacenamiento permanente de datos
Hay dos formas de hacer que la vida de los datos sea más larga que la vida del contenedor. Una forma es usar la tecnología de montaje de unión. Con este enfoque, puede montar, por ejemplo, una carpeta realmente existente en el contenedor. Los procesos ubicados fuera de Docker podrán trabajar con datos almacenados en dicha carpeta. Así es
como se ve la tecnología tmpfs mount y bind mount.
Monte tmpfs y monte de enlaceLas desventajas de usar la tecnología Bind Mount son que su uso complica la copia de seguridad de los datos, la migración de datos y el intercambio de datos entre varios contenedores. Es mucho mejor usar volúmenes Docker para el almacenamiento persistente de datos.
Tom Docker
Un volumen es un sistema de archivos que reside en una máquina host fuera de los contenedores. La creación y gestión de volúmenes la realiza Docker. Estas son las propiedades básicas de los volúmenes de Docker:
- Representan un medio para el almacenamiento permanente de información.
- Son independientes y están separados de los contenedores.
- Se pueden compartir entre diferentes contenedores.
- Le permiten organizar la lectura y escritura efectiva de datos.
- Los volúmenes se pueden alojar en el proveedor de la nube remota.
- Pueden ser encriptados.
- Se les pueden dar nombres.
- El contenedor puede organizar el volumen para que se complete con datos por adelantado.
- Son convenientes para la prueba.
Como puede ver, los volúmenes de Docker tienen excelentes características. Hablemos sobre cómo crearlos.
Creación de volumen
Los volúmenes se pueden crear con Docker o mediante solicitudes de API.
Aquí están las instrucciones en el Dockerfile que le permite crear un volumen cuando se inicia el contenedor.
VOLUME /my_volume
Al usar una instrucción Docker similar, después de crear el contenedor, creará un volumen que contiene datos que ya existen en la ubicación especificada. Tenga en cuenta que si crea un volumen utilizando el Dockerfile, esto no le libera de la necesidad de especificar un punto de montaje para el volumen.
También puede crear volúmenes en Dockerfile utilizando el formato JSON.
Además, los volúmenes se pueden crear utilizando la línea de comando mientras el contenedor se está ejecutando.
Trabajando con volúmenes desde la línea de comando
▍ Crear un volumen
Puede crear un volumen independiente con el siguiente comando:
docker volume create —-name my_volume
▍ Información de volumen plegable
Para ver la lista de volúmenes de Docker, use el siguiente comando:
docker volume ls
Puede explorar un volumen específico como este:
docker volume inspect my_volume
▍Eliminar volumen
Puede eliminar un volumen como este:
docker volume rm my_volume
Para eliminar todos los volúmenes que no utilizan los contenedores, puede recurrir al siguiente comando:
docker volume prune
Antes de eliminar volúmenes, Docker le pedirá que confirme esta operación.
Si el volumen está asociado con un contenedor, dicho volumen no se puede eliminar hasta que se elimine el contenedor correspondiente. En este caso, incluso si se retira el contenedor, Docker no siempre comprende esto. Si esto sucede, puede usar el siguiente comando:
docker system prune
Está diseñado para limpiar los recursos de Docker. Después de ejecutar este comando, debería poder eliminar los volúmenes cuyo estado se determinó previamente de forma incorrecta.
Banderas --mount y --volumen
Para trabajar con volúmenes, cuando llama al
docker
, a menudo tiene que usar banderas. Por ejemplo, para crear un volumen durante la creación de un contenedor, puede usar la siguiente construcción:
docker container run --mount source=my_volume, target=/container/path/for/volume my_image
En la antigüedad (hasta 2017), la bandera
--volume
era
--volume
. Inicialmente, esta bandera (también se puede usar en forma abreviada, luego parece que
-v
) se usó para contenedores independientes, y la bandera
--mount
se
--mount
en el entorno Docker Swarm. Sin embargo, comenzando con Docker 17.06, el indicador
--mount
se puede usar en cualquier escenario.
Cabe señalar que cuando se usa el indicador
--mount
,
--mount
la cantidad de datos adicionales que se deben especificar en el comando, pero, por varias razones, es mejor usar este indicador en lugar de
--volume
. El indicador
--mount
es el único mecanismo que le permite trabajar con servicios o especificar la configuración del controlador de volumen. Además, trabajar con esta bandera es más fácil.
En los ejemplos existentes de comandos destinados a trabajar con datos en Docker, puede encontrar muchos ejemplos del uso del indicador
-v
. Cuando intente adaptar estos comandos por sí mismo, tenga en cuenta que los
--mount
y
--volume
utilizan diferentes formatos de parámetros. Es decir, no puede simplemente reemplazar
-v
con
--mount
y obtener un comando de trabajo.
La principal diferencia entre
--mount
y
--volume
es que cuando se usa el indicador
--volume
todos los parámetros se recopilan juntos en un campo, y cuando se usa
--mount
parámetros se separan.
Cuando se trabaja con
--mount
parámetros se representan como pares clave-valor, es decir, parece
key=value
. Estos pares están separados por comas. Estas son las opciones de
--mount
utilizadas:
type
- type
montaje. El valor de la clave correspondiente puede ser bind , volume o tmpfs . Estamos hablando de volúmenes aquí, es decir, estamos interesados en el valor del volume
.source
- source
montaje. Para volúmenes con nombre, este es el nombre del volumen. Para volúmenes sin nombre, esta clave no se especifica. Se puede acortar a src
.destination
: la ruta a la que se monta el archivo o la carpeta en el contenedor. Esta clave se puede acortar a dst
o target
.readonly
: monta un volumen de solo lectura . El uso de esta clave es opcional; no se le asigna ningún valor.
Aquí hay un ejemplo de uso de
--mount
con muchas opciones:
docker run --mount type=volume,source=volume_name,destination=/path/in/container,readonly my_image
Resumen
Estos son algunos comandos útiles que puede usar al trabajar con volúmenes de Docker:
docker volume create
docker volume ls
docker volume inspect
docker volume rm
docker volume prune
Aquí hay una lista de opciones de uso común para
--mount
, aplicable a un comando como
docker run --mount my_options my_image
:
type=volume
source=volume_name
destination=/path/in/container
readonly
Ahora que hemos terminado esta serie de Docker, es hora de decir algunas palabras sobre dónde pueden seguir quienes estudian Docker.
Aquí hay un gran buen artículo sobre Docker.
Aquí hay un libro sobre Docker (cuando compre este libro, intente obtener la última edición del mismo).
Aquí hay otro libro que se adaptará a aquellos que creen que la práctica es la mejor manera de aprender tecnología.
Estimados lectores! ¿Qué materiales sobre Docker recomendarías a los principiantes para estudiar?
