Volúmenes en docker


En este post vas a aprender la definición y cómo trabajar con los volúmenes de docker, aprenderás a crear, y asignar un volumen a un contenedor

oscar Escrito por oscar 01 November 2021 5227 0

Acerca del proyecto

En este post vas a aprender la definición y cómo trabajar con los volúmenes de docker, nos vamos a guiar con la documentación oficial ya que allí se explica gran parte de las definiciones, ademas vamos a ver varias características y algunos ejemplos que nos ayudarán a entender el concepto de los volúmenes.

Adicionalmente voy a crear dos post por aparte donde explico cómo utilizar los volúmenes en Windows y cómo utilizar los volúmenes en Linux, aunque trabajando con la máquina virtual que nos proporciona docker, la forma de conectarse y la ubicación de los archivos es distinto, pero eso lo vamos a ver en estos post.

Por último vamos a ver un último post donde se encuentra la recopilación de todos los ejercicios anotaciones principales y cómo trabajar con los volúmenes ya sea directamente con un docker Run, dockerfile, docker-compose.

Conocimiento previo

Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.

Proyecto Descripción
Introducción docker Iniciamos con docker, donde conoceremos los temas que vamos a trabajar en este curso, aprenderemos a usar este gestor de contenedores con todas sus funcionalidades, ademas realizaremos ejercicios prácticos para reforzar el conocimiento aprendido.
¿Qué es docker? ¿Qué es docker?, es una plataforma que permite crear e implementar aplicaciones rápidamente. En este post aprenderás a detalle la definición, sus características y la diferencia con las tecnologías de aplicaciones tradicionales.
¿Qué es un contenedor? ¿Qué es un contenedor de docker?, lo podemos definir como una forma de limitar los recursos para una aplicación, donde solo va a contener sus librerías, configuraciones, entre otros. En este post explicamos a detalle los contenedores.
¿Qué es una imagen en docker? ¿Qué es una imagen en docker?, es un archivo compuesto por múltiples capas, que se utiliza para ejecutar código en un contenedor de docker. En este post aprenderás la definición y como usar las imagenes para crear contenedores.
Ciclo de vida del contenedor docker Aprenderás el ciclo de vida del contenedor en docker y los comandos básicos para poder ejecutar acciones sobre un contenedor. Estos comandos son utilizados en todo el ciclo de vida del contenedor y permiten realizar diferentes acciones para cada estados que puede tener el contenedor.
Docker comandos básicos Vamos a ver los comandos con los que podemos crear, gestionar e ingresar a la terminal bash de un contenedor, estos comandos son útiles y necesarios para poder realizar los ejemplos que tiene este curso, así que es muy importante que los aprendas.

Entrono y programas a instalar

Para este post usamos los siguientes programas:

  • Microsoft Windows [Versión 10.0.19043.1110]
  • Docker version 20.10.7, build f0df350

Volúmenes

Para definir los volúmenes en docker nos vamos a guiar en la documentación oficial que podemos encontrar en docker, básicamente nos hablan que los volúmenes son el mecanismo para conservar los datos generados y utilizarlos En los contenedores, ya que docker se encarga de mantener y administrar los volúmenes independientemente del sistema operativo para que sean fáciles de trabajar en la máquina host.[1]

  • Los volúmenes se pueden administrar mediante comandos CLI de docker y la Api de docker
  • Los volúmenes se pueden compartir entre uno o varios contenedores
  • los volúmenes funcionan en contenedores de Linux como de Windows
  • Los controladores de volumen le permiten almacenar volúmenes en hosts remotos o proveedores en la nube, para cifrar el contenido de los volúmenes o para agregar otras funciones.
  • Los nuevos volúmenes pueden tener su contenido precargado por un contenedor.
  • Los volúmenes en Docker Desktop tienen un rendimiento mucho mayor que los montajes de enlace de hosts de Mac y Windows.

Ahora se preguntarán porque vamos a utilizar volúmenes si dentro de los mismos contenedores de docker podemos almacenar información, archivos, imágenes, entre otros. Una de las razones por las que utilizamos volúmenes es que el contenedor es efímero, al momento de que nosotros paremos ese contenedor, lo detengamos o se destruya la información que habrá persistido dentro también se va a destruir. Aquí es donde entran los volúmenes, ya que podemos asignarle un volumen a un contenedor cuando éste se está ejecutando, hacer que la información se guarde en ese volumen y no importa si ese contenedor se destruye, se pierde o se dañe, la información se estará persistiendo hasta que el volumen exista.

bind mounts (monturas de enlace)

Antes de definir este tema, aclaro que no me voy a enfocar mucho en esta forma de almacenar información, ya que no es tan efectiva y fácil de trabajar, cómo lo son los volúmenes.

Un montaje de enlace lo que hace es generar la ruta absoluta dónde se encuentra el archivo o el directorio que se va a enlazar al contenedor, eso depende netamente del sistema de archivos de la máquina host donde se esté trabajando docker.

Para ello y la misma documentación recomienda que utilicemos los volúmenes y que no utilicemos este sistema de archivos, los volúmenes son administrados directamente por docker y no tenemos que hacer ninguna administración adicional para persistir información.

Comandos para los volúmenes

Vamos a explicar los principales comandos que podemos usar para crear, administrar y borrar volúmenes:

Crear volúmenes

Para crear un volumen con docker es muy fácil de realizar, ya que la sintaxis es muy sencilla, solamente tenemos que utilizar los siguientes comandos:

docker volume create MY_VOLUME

Dónde docker es el comando principal que nos indica el uso de esta herramienta, volume en la instrucción que vamos a utilizar para todo el manejo de los volúmenes. Los siguientes comandos varían dependiendo de lo que necesitemos, en este caso el create va a crear un nuevo volumen y el último parámetro es el nombre de este volumen, cabe aclarar que el nombre del volumen no tiene que estar con espacios ni caracteres especiales y tiene que ser un hombre que nosotros podamos identificar fácilmente.

Listar un volumen

Para listar los volúmenes básicamente necesitamos la instrucción de docker con la instrucción de volumen indicándole las palabra ls la cuál es la abreviatura de lista, observemos el siguiente comando:

docker volume ls

DRIVER    VOLUME NAME
local     611f76d836569c5662efaf02e954913fdce7b89328a9edd6a703cabfd26abcac
local     902a568c04cf4898f899db499d8ecc61799e317376ebbcab6b41fb0e0e7182bf
local     75066de0a93b37d0e0f8690fe1138ca184b23ca5c7c40aadce1a9ef0887ef06b
local     mi-volumen

Este comando devuelve el listado de los volúmenes que se encuentran creados en docker.

Inspeccionar un volumen

El comando inspeccionar volumen nos permite ver la configuración, cómo fue creado este volumen, el nombre del volumen, la ubicación, dónde se van a guardar los archivos, el tipo de controlador que está utilizando, entre otros.

docker volume inspect mi-volumen

[
    {
        "CreatedAt": "2021-03-18T04:20:01Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "keykload",
            "com.docker.compose.version": "1.27.4",
            "com.docker.compose.volume": "mi-volumen"
        },
        "Mountpoint": "/var/lib/docker/volumes/mi-volumen/_data",
        "Name": "mi-volumen",
        "Options": null,
        "Scope": "local"
    }
]

Eliminar un volumen

Si estamos aprendiendo a usar los volúmenes, este comando es de utilidad, nos permitirá eliminar todos esos volúmenes creados que no usaremos, veamos un ejemplo:

docker volume rm MY_VOLUME

Añadiendo volúmenes a un contenedor

Vamos a crear contenedores donde le vamos a asociar volúmenes, primero creamos un volumen, con el nombre que queramos, por ejemplo:

docker volume create mi-volumen

Ahora, tenemos dos formas de montar un volumen a un contenedor, vamos a explicar cada una de estas formas, donde veremos cual es mejor. Antes de continuar en este ejemplo solo montaremos volúmenes directamente al contenedor.

La primera forma de montar el contenedor es la siguiente, este ejemplo lo obtuve de la documentación oficial:

docker run -d --name volumentest --mount source=mi-volumen,target=/app nginx:latest

1422fdefbd9016a40b49acffb6b2cc5ac215e452b8ed1f336cd92ff6edd6f788

Vamos a crear un contenedor a partir de la imagen ngnix y a este lo llamamos volumentest, ahora con la bandera --mount vamos a asignarle en nombre del contenedor con "source" y el directorio dentro del contenedor que va a estar relacionado.

Si ingresamos a la terminal bash de este contenedor y al listar las carpetas y archivos, podemos ver el directorio app que se ha creado:

C:\Users\ce>docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
6b48cbaca436   nginx:latest   "/docker-entrypoint.…"   9 seconds ago   Up 6 seconds   80/tcp    volumentest

C:\Users\ce>docker exec -it volumentest bash
root@6b48cbaca436:/# ls
app  boot  docker-entrypoint.d   etc   lib    media  opt   root  sbin  sys  usr
bin  dev   docker-entrypoint.sh  home  lib64  mnt    proc  run   srv   tmp  var
root@6b48cbaca436:/# cd app
root@6b48cbaca436:/app# touch texto.txt
root@6b48cbaca436:/app# ls
texto.txt

Por último en este contenedor, creamos un archivo llamado texto.txt, les explico mas adelante para que lo creamos.

La segunda forma de iniciar un contenedor con un volumen es usar el mismo comando, pero en su forma abreviada, con la bandera "-v", veamos el ejemplo:

docker run -d --name volumentest-2 -v mi-volumen:/app nginx:latest
1ffe3ab33d36b4ecee8235b28c403747af42aa14db2e4a5c5239b9c170b3fe05

Observe que en esta forma solo especificamos la bandera -v, el nombre del volumen, dos puntos (:) y la carpeta que vamos a montar o relacionar en el contenedor. Ademas hemos montado el mismo volumen que el contenedor del ejemplo anterior. Observemos que los contenedores se restan ejecutando al mismo tiempo:

C:\Users\ce>docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS     NAMES
1ffe3ab33d36   nginx:latest   "/docker-entrypoint.…"   4 hours ago   Up 4 hours   80/tcp    volumentest-2
6b48cbaca436   nginx:latest   "/docker-entrypoint.…"   4 hours ago   Up 4 hours   80/tcp    volumentest

Ahora vamos a ingresar por bash al segundo contenedor, donde buscamos la carpeta "app" y listamos los archivos, aquí deberá aparecer el archivo texto.txt que creamos en el primer contenedor; este archivo lo vemos ya que estamos compartiendo el mismo volumen y cualquier modificación se verá reflejado en los dos contenedores.

C:\Users\ce>docker exec -it volumentest-2 bash
root@1ffe3ab33d36:/# ls
app  boot  docker-entrypoint.d   etc   lib    media  opt   root  sbin  sys  usr
bin  dev   docker-entrypoint.sh  home  lib64  mnt    proc  run   srv   tmp  var
root@1ffe3ab33d36:/# cd app
root@1ffe3ab33d36:/app# ls
texto.txt

Referencias

[1] docker volumes https://docs.docker.com/storage/volumes/, Consultado Octubre 2021


Comentario

Debe aceptar antes de enviar