Posted by q3it on viernes, diciembre 10, 2021 in Micro-servicios
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/