A medida que vamos avanzando en los conceptos y utilidades de Docker nos topamos con un termino fundamental que es el de administrar datos en Docker. En este punto puede que nos surjan dudas de cómo hace Docker para gestionar los datos de nuestros contenedores, qué pasa con los datos una vez que se destruye el contenedor, cómo maneja docker el tema de la seguridad en los datos, entre otras interrogantes.
Preconfigurado de almacenamiento de datos en Docker
Por defecto, Docker viene preconfigurado para que todos los archivos que se creen dentro de un contenedor se almacenen en una capa especial de escritura de datos.
Está preconfiguración de Docker para el manejo de los datos tiene severos inconvenientes, dentro de los cuales están:
- Los datos no persisten, en caso que nuestro contenedor esté detenido y otro proceso necesita de estos datos, puede llegar a ser difícil utilizar dichos datos. En esta situación, Docker no tiene forma de acceder de forma práctica a los datos, se puede realizar pero es un tanto complejo.
De igual manera, si se elimina el contenedor, los datos que estén en la capa de escritura también serán eliminados junto con dicho contenedor y los habremos perdido.
- Otro de los grandes problemas es que la capa grabable de un contenedor está fuertemente ajustada o acoplada a la máquina host donde se está ejecutando el contenedor. Lo cual agrega cierto grado de dificultad para mover datos de un lugar a otro.
- Por ultimo, grabar datos en la capa de escritura de un contenedor requiere un controlador de almacenamiento para administrar el sistema de archivos.
Este controlador proporciona un sistema de archivos union, utilizando el kernel de Linux. Esta abstracción adicional reduce el rendimiento en comparación con el uso de volúmenes de datos.
Y sí, quizás en este momento te preguntarás «Bueno, ¿No se supone que Docker era genial y me ayudaba en todo? ¿Tanta complejidad para guardar unos simples datos? ¿En qué me ayuda todo esto?»
¡No corras! Espera…
Sí bien es cierto que Docker es una tecnología «relativamente» nueva (2013) y que en primera instancia podría resultar complicada, también es cierto que ha venido evolucionando muchísimo a lo largo de todo este tiempo y ha resuelto muchísimas de sus complicaciones iniciales.
Cada vez son más las empresas que lo adoptan dentro de sus estructuras por los múltiples beneficios que ello supone. Para julio del año 2018, casi un cuarto de las empresas habían adoptado Docker dentro su infraestructura.
Estos grandes avances han posibilitado el perfeccionamiento de los métodos usados por Docker para el manejo de datos. Actualmente, Docker nos ofrece tres maneras de gestionar los datos de nuestros contenedores:
1. Montajes de Volúmenes
Estos se almacenan en una parte del sistema de archivos de host que es administrado por Docker ( /var/lib/docker/volumes/
en Linux). Los contenedores que se ejecuten no van a modificar esta parte del sistema de archivos.
Los volúmenes son la mejor forma de conservar datos en Docker.
2. Montajes Bind o Montajes de Enlace
A diferencia de los volúmenes que se almacenan en un área especifica del sistema de archivos host, los montajes de enlace pueden estar en cualquier parte del sistema de archivos, inclusive pudieran estar almacenados en directorios importantes del sistema operativo.
Los montajes bind son la forma primitiva en la cual se habían gestionado los datos de los contenedores en Docker antes que aparecieran los volúmenes. Cuando usamos montajes de enlace no se tiene forma de controlar en donde se guardan los datos que generan y usan nuestros contenedores.
Un efecto secundario y que se toma como una vulnerabilidad de los montajes bind es que podría cambiar el sistema de archivos host a través de procesos que se ejecutan en un contenedor.
Es decir, alguno de nuestros contenedores podría, dado el caso, borrar algún directorio importante de nuestro sistema operativo. Esto es una consideración fundamental a tener en cuenta cuando se trabaja con montajes bind ya que puede suponer un riesgo de seguridad.
3. Montajes tmpfs
La mejor forma de comprender los montajes tmpfs es entenderlos como carpetas virtuales, carpetas que sólo existirán en la memoria del host, por tanto, estos datos no tendrán persistencia en nuestro sistema.
Los montajes tmpfs nunca se llegan a escribir en el sistema de archivos y generalmente son usados para almacenar información sensible o no persistente.
¿Cómo elijo el tipo de montura correcta para los datos en Docker?
Independientemente del tipo de montaje que elija utilizar, los datos tienen el mismo aspecto desde el contenedor. Está expuesto como un directorio o un archivo individual en el sistema de archivos del contenedor.
Docker Docs.
Si la propia documentación de Docker nos dice «No importa qué tipo de montaje elijas usar», entonces: ¿Cómo se supone que sabré cuando usar cada una de ellas?
Para esto, la propia documentación nos ofrece una serie de consideraciones generales que podríamos usar como referencia para saber con mayor certeza cuando usar determinado tipo de montura o almacenamiento.
¿Cuándo debería usar volúmenes?
Como se comentó anteriormente, los volúmenes son la forma predilecta para conservar los datos de nuestros contenedores. Deberías usar volúmenes:
- Si necesitas compartir datos entre múltiples contenedores en ejecución.
- En caso que el host Docker no garantice tener un directorio o estructura de archivos dada.
- Para almacenar los datos de su contenedor en un host remoto o en un proveedor de la nube, por ejemplo, un Bucket S3 de AWS.
- Cuando necesite realizar una copia de seguridad, restaurar o migrar datos de un host Docker a otro, los volúmenes son una mejor opción.
¿Cuándo debería usar monturas bind?
En general, debe usar volúmenes siempre que sea posible. Sin embargo, hay algunos casos en donde podría ser conveniente usar montajes bind o de enlace, algunos de ellos son:
- Cuando necesita compartir archivos de configuración de la máquina host a contenedores.
- Si necesita compartir código fuente o crear artefactos entre un entorno de desarrollo en el host Docker y un contenedor.
- Cuando se garantiza que la estructura del archivo o directorio del host Docker es consistente con los montajes de enlace que requieren los contenedores.
¿Cuándo debería usar monturas tmpfs?
Estos últimos son convenientes cuando no desea que los datos persistan en el equipo host o dentro del contenedor.
Se pueden identificar dos temas o casos donde convendría usar este tipo de monturas:
- Temas de seguridad, como pudiese ser el almacenamiento de alguna credencial sensible que requiera alguno de nuestros contenedores y que no deseamos guardar.
- Temas de rendimiento, cuando la aplicación que estemos manejando dentro del contenedor necesite hacer uso intensivo de grandes cantidades de datos no persistentes, ejemplo: datos de pruebas.
Conclusiones
Hemos visto los tipos de almacenamientos de datos en Docker, cómo Docker preconfigura el almacenamiento para nuestros contenedores y los problemas que esto puede generar a la hora de trabajar con datos persistentes. Sin embargo, vimos también como Docker tiene tres formas grandiosas para gestionar datos, y, dependiendo de nuestras necesidades podríamos utilizar para sacarle el máximo provecho a Docker.
Espero que este artículo les haya servido,
¡Saludos!
Fuentes:
Artículos: https://docs.docker.com/storage/
Imágenes: unsplash.com
excelente tema y explicación.