Persistir información en Docker Volumes y ASPNET Core

Julio Avellaneda
4 min readMar 11, 2018

--

Otros post sobre Docker y ASPNET Core:

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
Docker volumes

Ahora, vamos a crear un nuevo volumen con el nombre test, para ello utilizamos:

docker volume create <NOMBRE_VOLUMEN>
Docker volume create

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:

Docker ps

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:

Docker stop

Ahora eliminar los contenedores, para ello docker rm:

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:

Docker shared drives on Windows
Docker file sharing on MAC

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,

--

--

Julio Avellaneda

Microsoft MVP #ASPNET, #WebApi, #MVC, #KendoUI #Angular #Blogger and learning #NativeScript