Contenedores

Los volúmenes de Docker son utilizados para persistir los datos que manejan los contenedores. Esto nos permite crear contenedores e indicarles donde tienen que persistir nuestros datos.

 

¿Para qué sirven los volúmenes?

Pongamos ejemplos para entender el problema.  

Imaginemos que instanciamos una base de datos en la que persistiremos nuestros registros.  ¿Qué sucede cuando el contenedor es eliminado? ¿Dónde quedan nuestros datos?

Si no se montó un volumen al momento de crear el contenedor, una vez que lo eliminemos perderemos todo lo que hallamos persistido. 

Otra posible situación es si quiero crear un contenedor y que ya tenga registros cargados.  ¿Y si quiero que varios contenedores usen la misma base de datos?

La solución a estos problemas son los volúmenes. 

¿Qué es un volumen?

Son simplemente archivos y directorios en el host que esté corriendo docker. Estos son utilizados por los contenedores para persistir y/o leer datos. 

A la hora de usar volúmenes tenemos dos opciones:

  • Crear un volumen utilizando el CLI de Docker. Al momento de crear un contenedor y montarlo con un volumen de este tipo estamos usando ‘Volume mounting’
  • Usar un directorio del host que esté corriendo docker. Este tipo de montaje se denomina ‘Bind mounting’ 

Empecemos por ‘Volume mounting’

¿Cómo creo un volumen?

Usamos el comando 

$ docker volume create nombre-volumen

Esto simplemente crea un directorio con el nombre del volumen, por defecto en las distribuciones linux este directorio estará en: 

/var/lib/docker/volumes/nombre-volumen

¿Cómo uso este volumen? 

Al momento de crear un contenedor tenemos que indicarle que vamos a usar un volumen, esto lo logramos a través de la opción -v

$ docker run -v nombre-volumen:/var/lib/mysql mysql

Donde: 

  • nombre-volumen: nombre del volumen que vamos a usar.
  • /var/lib/mysql: path donde el contenedor persiste los datos por defecto.
  • mysql: nombre imagen

IMPORTANTE !

  • ‘/var/lib/mysql’ funcionara solo para la imagen de mysql, dependiendo de qué imagen usemos deberemos cambiar este path. Para saber a donde tiene que apuntar nuestro volumen debemos leer cuidadosamente la documentación
  • ¿No creaste un volumen con ese nombre? No pasa nada, docker lo va a crear y luego lo va a montar. 
Usar un directorio:

Si queremos que nuestros datos se persistan en un directorio que tenemos en el host, debemos indicarle el path a la hora de crear un contenedor.

$ docker run -v home/usuario/data:/var/lib/mysql mysql 

Donde: 

  • home/usuario/data: directorio que queremos usar para que nuestro contenedor persista los datos
  • /var/lib/mysql: directorio donde persiste los datos mysql por defecto. 
  • mysql imagen que vamos usar para instanciar un contenedor

Una alternativa más explícita

Otra forma de indicarles a docker que volumen usar, es con la opción --mount 

$ docker run --mount type=bind,source=home/usuario/data,target=/var/lib/mysql mysql

Donde: 

  • type indica qué tipo de montaje queremos hacer (mount o bind)
  • source directorio que queremos usar para que nuestro contenedor persista los datos
  • target directorio donde persiste los datos mysql por defecto. 

No existe ninguna diferencia a la hora de usar --mount o -v, simplemente la primera opción es más explícita como se puede apreciar en el ejemplo de arriba. 

¿Cómo elimino un volumen?

Si el volumen fue creado por docker, corremos el siguiente comando: 

$ docker volume rm nombre-volumen

Si se trata de un directorio que nosotros creamos, debemos eliminar el directorio.

Se debe corroborar que no hay ningún contenedor usando este volumen para evitar problemas. 

El resumen: 

Crear un volumen usando docker CLI:

$ docker volume create nombre-volumen

Montar el volumen a la hora de crear un contenedor:

  •   Bind mounting: 

$ docker run -v path-host:path-contenedor nombre-imagen

  • Volume mounting: 

docker run -v nombre-volumen:path-contenedor

*Si el volumen no existe, docker lo creara*

Eliminar un volumen:

$ docker volume rm nombre-volumen

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!