viernes, 10 de diciembre de 2021

Datos en Docker

Posted by q3it on viernes, diciembre 10, 2021 in
Para este post voy a correr una base de datos MongoDB.

Primera ejecución de Mongo sin persistir datos en disco, sólo en el contenedor
Levantando contenedor de Base de Datos Mongo ignorando los inputs que pueda generar la ejecución de dicho contenedor (-d). Se colocará al contendor el nombe de db. Esto descargará el contenedor de la internet.
—> docker run -d --name db mongo

Visualizar los logs generados al momento de ejecutar
—> docker logs db

Ejecutamos un bash (una consola para Linux) dentro del contendedor db (mongo). Esto nos muestra que cada proceso ejecutado necesita de algunos procesos Linux, y sobre esos procesos Linux se ejecuta, en este caso, el Mongo. Todos estos procesos, tanto de Linux como de Mongo, están dentro del contenedor levantado db.
—> docker exec -it db bash

Ya dentro del bash ingresamos al proceso (cliente mongo en modo bash/consola) mongo.

Creación (dentro del cliente mongo) de un usuario
—> use diego

Insertar un usuario en mongo
—> db.users.insert({ "name": "devnull"})

Listar los usuarios ingresados
—> db.users.find()

Ahora saldremos del cliente con exit, y de la misma manera, saldremos del bash del contenedor.

“Matar” el contenedor mongo.
—> docker rm -f db

Volvemos a ejecutar un nuevo contenedor de mongo con el mismo nombre db

Ingresar al bash del contenedor db, y luego a mongo (desde el bash)

Luego, crear usuario diego y buscar los datos. No hay datos ya que, cuando se “mató” el contenedor anterior, se fue con toda la información generada.


Segunda ejecución… persistiendo la data en el disco duro, fuera del contenedor
Borramos contenedor de mongo q está en ejecución
—> docker rm -f db

ahora un poco de Linux

Creación de un directorio/carpeta en donde se guardará la data generada por mongo
—> mkdir mongodata

Este directorio es creado en la misma ubicación desde donde ejecuta docker.
Para ver la ruta completa del lugar de dónde se está ejecutando docker (q es el directorio en donde se creó también el nuevo directorio, mongodata) utilizamos:
—> pwd

El resultado obtenido lo utilizaremos para dar la ruta completa para hacer el montaje del directorio usado dentro del contenedor, sobre el directorio recientemente creado fuera del contenedor.

Volvemos ahora a docker

Ejecutaremos ahora nuevamente el contendor de mongo, con el nombre db, pero además se agregará el parámetro -v para realizar el montaje: en primera instancia va el directorio externo donde se montará el directorio interno, y después de los dos puntos se coloca el directorio interno que será montado en el directorio externo.
—> docker run --name db -d -v /users/dbedoya/dev/diego/mongodata:/data/db mongo

Verificar si el contendor ejecutado ya está dejando sus archivos en el directorio externo (comando linux)
—> ls mongodata

Luego de esto, repetir la creación de usuario, la inserción de datos, salir del bash, salir del contenedor, matar el contenedor, volver a levantar el contenedor y verificar que la data esté allí.

La desventaja de esta manera de persistir la información, es que si por alguna razón, un proceso externo juega dentro del directorio creado para guardar la data de mongo, puede que este juego altere mi información.


Volumes
A pesar de que no es lo más divertido que tiene Docker, esta herramienta nos permite recuperar datos que podíamos dar por perdidos.

Existen tres maneras de hacer permanencia de datos:
  • Bind mount
  • Volume
  • tmpfs mount
Crear volúmenes en el host (Mejorado)
docker volume create <nombre del volumen>
docker run -d --name <nombre del contenedor> —mount src=<nombre del volumen>,dst= <carpeta datos contenedor> <nombre de la imagen>

Ej:docker volume create dbdata
Ej:docker run -d --name mongo-db --mount src=dbdata,dst=/data/db mongo

Manejo de Docker Volume
Esto es similar a montar un directorio de un contenedor en un directorio externo, pero de alguna manera se crea automáticamente en un directorio gestionado por docker y en donde otro proceso de la PC no debería poder ingresar.
El directorio en donde se guardan automáticamente estos volúmenes es en: /var/bin/docker/volume

Cada ejecución de un contenedor genera un volumen.
Listar todos los volúmenes creados
—> docker volume ls

Para poder borrar los volúmenes que no están asociados a ningún contenedor en ejecución
—> docker volume prune

Creación de un volumen.
—> docker volume create dbdata

Para poder asociar el directorio de un contenedor a un volumen se utiliza el parámetro --mount, luego src para indicar el volumen donde se guardará la información, y luego dst para indicar el destino o directorio del contenedor que se montará en el volumen indicado en src
—> docker run -d --name db --mount src=dbdata,dst=/data/db mongo

Una vez ejecutado nuevamente mongo con el nombre de db sobre el volumen dbdata, volver a ejecutar un bash dentro del contenedor y probar nuevamente la creación de datos en mongo.


https://docs.docker.com/storage/