Persistir información en Docker Volumes y ASPNET Core
Otros post sobre Docker y ASPNET Core:
- Hosteando una aplicación ASPNET Core en Docker
- Persistir información en Docker Volumes y ASPNET Core (este post)
Cuando dockerizamos una aplicación, y luego se ejecuta en un contenedor de Docker, la información de la aplicación se guarda mientras el contenedor este en ejecución, pero si por ejemplo nos vemos en la necesidad de eliminar y volver a crear el contenedor dicha información se pierde, o si el objetivo por el contrario es correr la aplicación en más de 1 contenedor, es necesario buscar una forma para guardar de forma segura y compartida la información de la aplicación, y en este punto Docker ofrece una característica conocida como volúmenes, característica que permite compartir información entre contenedores y guardarla de forma segura y más alla de la vida del contenedor.
Para mostrar el uso de volúmenes, voy a partir de un sencillo controlador que tiene dos acciones con las siguientes funcionalidades:
- Guardar un mensaje en un archivo de texto en una carpeta llamada Files
- Leer el archivo de texto y retornar el contenido
Así, el controlador luce:
Ahora, luego de dockerizar la aplicación (puedes ver como en este post: Hosteando una aplicación ASPNET Core en Docker) y de crear la imagen vamos a proceder primero a crear un volumen de Docker.
Lo primero, para ver los volúmenes de Docker, basta con ejecutar el siguiente comando:
docker volume ls
Ahora, vamos a crear un nuevo volumen con el nombre test, para ello utilizamos:
docker volume create <NOMBRE_VOLUMEN>
Listo, el siguiente paso es crear un contenedor que corra la imagen creada, y en este caso pasándole como parámetro el volumen que acabamos de crear, dicho volumen debe apuntar a la carpeta que deseamos persistir, en este Files, que en la carpeta en la cual está quedando el archivo creado.
Para crear entonces el contenedor, añadimos con el flag -v el volumen y la ruta que se desea mapear, para esto, voy a crear dos contenedores:
Contenedor 1:
docker create -p 3002:80 --name aspnet1 -v test:/app/Files demo/aspnetcoreanddockervolume
Contenedor 2:
docker create -p 3003:80 --name aspnet2 -v test:/app/Files demo/aspnetcoreanddockervolume
Para verificar, podemos ejecutar un docker ps y ver que efectivamente los dos contenedores está corriendo, uno por el puerto 3002 y el otro por el 3003:
Ahora, si enviamos un mensaje al contenedor 1:
Por ejemplo, es posible ver la información apuntando al contedor 2:
Ahora, para ver como funciona el tema de los volúmenes, al contenedor 2 envío otro mensaje con el texto “mensaje enviado al contenedor 2”, y el siguiente paso es detener los dos contenedores, para ellos usamos docker stop:
Ahora eliminar los contenedores, para ello docker rm:
Y crear un nuevo contenedor que corra por el puerto 3004 en este caso:
docker create -p 3004:80 --name aspnet3 -v test:/app/Files demo/aspnetcoreanddockervolume
Y luego, hacer el request al nuevo contenedor, y verificar que efectivamente la información persistida por los dos contenedores que se eliminaron sigue presente:
Ahora, otra opción disponible, para utilizar volúmenes, es mapear el volumen a una carpeta física del equipo host, para ello en Windows vamos a los settings de Docker y seleccionamos la unidad, o en MAC el directorio:
Y en este caso, para persistir los datos, en la creación del contenedor, le pasamos no el volumen, sino la carpeta:
docker create -p 3005:80 — name aspnet4 -v c:/Temp/volumedata:/app/Files demo/aspnetcoreanddockervolume
Y ahora, al volver a testear el endpoint, en la carpeta mapeada se debe crear el archivo:
Puedes acceder al ejemplo en el siguiente link: ASPNET Core & Docker Volume
En el siguiente post vamos a ver como trabajar con bases de datos en Docker.
Saludos,