Contents
- Copia de seguridad y restauración de contenedores Docker
- Respaldo y restauración de volúmenes Docker
- Enfoque alternativo al backup & restore de volúmenes Docker
- Mejores prácticas de gestión de volúmenes Docker
- Scripts personalizados e imágenes Docker
- Volúmenes Backup & Share
- SnapShooter de Digital Ocean
- Duplicati
- Copia de seguridad y restauración de Docker con Bacula Enterprise
Aunque Docker -y todos los contenedores- suelen ser algo más recientes en un entorno de TI de producción que la mayoría de las demás tecnologías, sigue siendo necesario realizar copias de seguridad de estos contenedores, sus aplicaciones y sus datos persistentes. Si un sistema de TI de producción produce datos persistentes, es probable que esos datos tengan algún valor. Incluso pueden ser de importancia crítica. Por lo tanto, salvaguardar esos datos en caso de que ocurra algún tipo de desastre, por ejemplo como resultado de una violación de datos o de un error humano, es probablemente necesario.
Este tema cubre tanto la capacidad de Docker para crear copias de seguridad por sí mismo, como la capacidad de varias soluciones de terceros para crear copias de seguridad completas de Docker, como Bacula Enterprise.
Copia de seguridad y restauración de contenedores Docker
Por lo general, esto comienza con la confirmación del contenedor en cuestión como una imagen, utilizando el siguiente comando:
# docker commit -p [container-id] backup01
sha256:89682d4xxxxxx
Esta imagen puede guardarse como un archivo .tar con otro comando:
# docker save -o backup01.tar backup01
# ls -al | grep back
-rw——- 1 root root 178697728 Mar 31 23:35 backup01.tar
El archivo .tar también puede guardarse en el punto de montaje NFS. Una alternativa para ello es empujar la imagen en cuestión (backup01) directamente a su registro local. Para ello, primero tendremos que etiquetar adecuadamente la imagen:
# docker tag backup01 localhost:5000/backup-image:v1
En este caso localhostes el nombre de la ubicación, y 5000 es el número de puerto. Ambos pueden cambiarse si es necesario. También es importante recordar que tanto el nombre de la etiqueta como el repositorio deben estar en minúsculas para que la etiqueta se aplique correctamente. El proceso se completa con la iniciación del comando push:
# docker push backup-image:v1
Dado que hemos hablado de dos métodos de copia de seguridad, también habrá dos métodos de restauración. Para restaurar la imagen de copia de seguridad desde un archivo .tar tendrá que iniciar el siguiente comando:
# docker load -i /tmp/backup01.tar
La línea de comandos debería mostrarle las líneas de estado posteriores si el comando se ha introducido correctamente:
ff91b8b5abb1: Loading layer [======================>] 2.56 kB/2.56 kB
Loaded image: backup01:latest
Se puede utilizar otro comando llamado docker run para crear un contenedor a partir de esta imagen.
Una imagen empujada se puede tirar directamente con un comando relativamente simple:
# docker pull localhost:5000/backup-image:v1
Al igual que en el ejemplo anterior, tanto el localhost nombre como el número de puerto están sujetos a cambios en caso necesario.
Respaldo y restauración de volúmenes Docker
Otro tipo de copias de seguridad Docker es a través de volúmenes – proveedores de almacenamiento persistente para contenedores Docker. Es necesario realizar copias de seguridad de estos volúmenes para la continuidad de los datos.
Cuando se trata de la gestión de datos persistentes dentro de los contenedores Docker en ejecución, los volúmenes Docker son la forma más recomendada de gestionarlo todo. Este tipo de enfoque ofrece varias ventajas diferentes. Por ejemplo, los datos que se almacenan en el contenedor Docker a través de los volúmenes se aíslan eficazmente del resto del sistema de archivos, lo que hace mucho más difícil que se vean afectados por ciberataques en todo el sistema. Sin embargo, este tipo de aislamiento también dificulta la creación de volúmenes de copia de seguridad de Docker.
Además, los volúmenes eliminan la necesidad de preocuparse por la GUI y el UID entre el sistema de contenedores Docker y el SO. Los propios volúmenes son portátiles cuando se trata de diferentes instalaciones de Docker, lo que significa que no hay necesidad de preocuparse por el sistema operativo del host. Al mismo tiempo, este enfoque portátil permite gestionar los volúmenes Docker con diversas herramientas externas, como el almacenamiento basado en cubos, nfs, etc.
Dado que los volúmenes Docker son casi necesarios para crear de forma realista diferentes contenedores Docker con datos persistentes, es natural asegurarse de que también dispone de volúmenes Docker de copia de seguridad – este tipo de datos es al menos tan importante como cualquier otro dato dentro de su sistema, si no más importante.
Por supuesto, el uso de volúmenes Docker para almacenar datos de contenedores puede no ser exactamente conveniente y hay algunos dolores de crecimiento aquí y allá. Por ejemplo, tendría que aprender varios comandos diferentes para hacer algo tan simple como copiar información fuera del contenedor. También tendría que conocer varios comandos para ser capaz de agarrar un shell en un Docker en ejecución para poder ver el estado actual.
La totalidad de los datos del volumen Docker puede ser más difícil de hacer visible dentro de su sistema de archivos centralizado, ya que funciona de una manera ligeramente diferente a las ubicaciones de almacenamiento tradicionales – y usted tendría que crear volúmenes de copia de seguridad Docker para el mismo propósito que suele crear copias de seguridad de sus datos regulares.
Por lo general, los volúmenes Docker son gestionados por el demonio Docker, sin embargo, no vamos a interactuar con eso en absoluto. La idea de un volumen de copia de seguridad Docker es obtener una copia del volumen como un archivo comprimido en uno de los directorios locales. Esta copia es la copia de seguridad que estamos buscando.
En este ejemplo nuestro contenedor en cuestión se llama dckr-site con el volumen llamado dckr-volume, está montado en /var/lib/dckr/content/ y almacena todos los datos allí.
El primer paso es detener el contenedor utilizando el siguiente comando:
$ docker stop dckr-site
La siguiente se centra tanto en el montaje del contenedor como en la copia de seguridad del contenido del volumen:
$ mkdir ~/backup
$ docker run –rm –volumes-from dckr-site -v ~/backup:/backup ubuntu bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar .”
En este escenario:
- docker run el comando se utiliza para crear un nuevo contenedor,
- -rm comando indica al sistema que elimine el contenedor una vez finalizada la operación;
- -volumes-from dckr-site está montando los volúmenes del contenedor en nuestro nuevo contenedor temporal;
- bash -c «cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar» crea una copia de seguridad a partir de todo el contenido del directorio /backup/
El proceso de recuperación de estas copias de seguridad no es tan complicado. Comienza con la creación de un nuevo volumen con el siguiente comando:
$ docker volume create dckr-volume-2
A continuación, puede utilizar el siguiente comando para restaurar el volumen desde un contenedor temporal en un archivo .tar:
$ docker run –rm -v dckr-volume-2:/recover -v ~/backup:/backup ubuntu bash -c “cd /recover && tar xvf /backup/dckr-site.tar”
Por supuesto, tendrá que montar este nuevo volumen en el nuevo contenedor para que funcione correctamente:
$ docker run -d -v dckr-volume-2:/var/lib/dckr/content -p 80:2368 dckr:latest
Si el procedimiento se realiza correctamente, debería restaurarse el estado completo de la aplicación. Es importante mencionar que no se debe confiar en este método como fuente de copia de seguridad única, ya que los datos de la copia de seguridad siguen almacenados en el host y, por lo tanto, se perderían en caso de una pérdida de datos o un desastre que afecte también al host.
Enfoque alternativo al backup & restore de volúmenes Docker
Es natural que todos los sistemas modernos evolucionen y cambien con el tiempo, y Docker no es una excepción, especialmente con una comunidad tan masiva de usuarios y desarrolladores. A modo de ejemplo, existe un enfoque alternativo para realizar copias de seguridad de volúmenes Docker que algunos usuarios podrían preferir a la primera opción por una razón u otra.
El primer paso aquí sería definir el nombre del volumen. El comando en cuestión difiere para los usuarios de Windows (PowerShell) y Linux/macOS, los primeros necesitan el comando $VOLUME=”name_volume”, mientras que los segundos confían en el comando VOLUME=”name_volume”.
Una vez completado esto, la primera opción es realizar un comando de copia de seguridad:
docker run –rm \
-v «${VOLUME}:/data» \
-v «${PWD}:/backup-dir» \
ubuntu \
tar cvzf /backup-dir/backup.tar.gz /data
La parte /data representa el destino y podría modificarse si fuera necesario.
El comando Restaurar sería diferente, por supuesto, y el ejemplo siguiente lo muestra bien:
docker run –rm \
-v «${VOLUME}:/data» \
-v «${PWD}:/backup-dir» \
ubuntu \
bash -c «rm -rf /data/{*,.*}; cd /data && tar xvzf /backup-dir/backup.tar.gz –strip 1»
Cabe señalar que el rm -rf /data/{*,.*} parte existe para borrar todos los archivos existentes antes de la restauración de la copia de seguridad, pero la naturaleza de Docker hace que incluya dos comandos diferentes: uno para borrar todos los archivos y carpetas que empiezan por punto y otro para los archivos que no empiezan por punto. Sin embargo, hay dos «archivos» invisibles en cada contenedor llamados «.» y «..» que no son técnicamente archivos en primer lugar, razón por la cual no pueden ser borrados.
Como tales, los dos primeros mensajes de salida después de ejecutar el comando Restaurar serían sobre la incapacidad de eliminar estos archivos – esto es normal y no afecta al resto del proceso de ninguna manera, forma o manera.
Existen algunas diferencias clave entre este método y los que hemos ofrecido anteriormente:
- Los tres argumentos tar existentes anteriormente (c, v, y f, como en cvf) se incluyen ahora como cvzf – para que el archivo de copia de seguridad se comprima automáticamente tras su creación.
- Las rutas de destino de los volúmenes de copia de seguridad se especifican en cada comando de copia de seguridad, lo que facilita su localización posterior. Se trata de un enfoque diferente al de la utilización del comando –volumes-from, ya que este último no muestra los nombres de los volúmenes ni sus rutas de destino al usuario en cuestión.
- El proceso de restauración incluye el comando para borrar todos los datos de volumen existentes antes de realizar una operación de restauración para garantizar un proceso de restauración adecuado. Además, existe una razón para que se utilice punto y coma entre los comandos tar xvzf y rm, ya que utilizar && (de forma similar a como funciona nuestro primer método) significa que toda la cadena de comandos se detiene por completo tras enfrentarse al primer fallo del comando.
Por supuesto, este comando en particular solo es adecuado como ejemplo manual para las copias de seguridad de volúmenes de Docker, ya que cada ejecución del comando produce una copia de seguridad full, algo que sería muy ineficiente tanto en términos de tiempo como de espacio de almacenamiento si este comando se automatizara y realizara de forma regular (y ni siquiera la compresión puede solucionar este problema).
Mejores prácticas de gestión de volúmenes Docker
Trabajar con volúmenes Docker puede ser todo un reto: es una herramienta muy útil, pero tiene sus propios matices a los que la mayoría de los usuarios deben acostumbrarse tarde o temprano. Para facilitar un poco este proceso, podemos repasar algunos consejos y mejores prácticas para la gestión de volúmenes Docker:
- Implemente métodos coherentes para acoplar y desacoplar volúmenes a los contenedores.
- Emplee convenciones de nomenclatura coherentes y significativas para facilitar la identificación y la gestión de los volúmenes.
- Evite crear volúmenes innecesarios, ya que cada volumen consume recursos.
- Compruebe regularmente los volúmenes para identificar y solucionar problemas de almacenamiento de datos excesivos o de capacidad.
- Evite el acceso de escritura simultáneo a la misma unidad por parte de varios contenedores para evitar la corrupción de datos.
- Implante medidas de seguridad adecuadas para salvaguardar los datos confidenciales almacenados en los volúmenes.
- Asigne nombres claros y descriptivos a los volúmenes para una mejor organización y gestión.
Scripts personalizados e imágenes Docker
Dado que Docker cuenta con una comunidad bastante amplia de personas altamente cualificadas, no debería sorprender tanto saber que existen multitud de scripts e imágenes personalizados para realizar copias de seguridad de Docker.
Una imagen Docker de Offen es un buen ejemplo de ello. Se trata de un contenedor complementario ligero que puede realizar copias de seguridad de volúmenes Docker individuales o regulares en un directorio de destino específico: directorio local, Azure Blob, S3, Dropbox, WebDAV, etc. También tiene la capacidad de rotar las copias de seguridad más antiguas, puede cifrar las copias de seguridad con GPG y las tareas de copia de seguridad fallidas proporcionan notificaciones al usuario.
El proceso de configuración inicial es bastante sencillo (toda la información puede localizarse utilizando el enlace anterior), y la línea de comandos de ejemplo para una única operación de copia de seguridad debería tener este aspecto:
docker run –rm -v data:/backup/data
–env AWS_ACCESS_KEY_ID=»<key_id>» \
–env AWS_SECRET_ACCESS_KEY=»<access_key>» \
–env AWS_S3_BUCKET_NAME=»<bucket_name>» \
–entrypoint backup \
offen/docker-volume-backup:v2
Por supuesto, esto es sólo un ejemplo, pero hay muchas otras opciones disponibles en el mercado para los usuarios que estén dispuestos a dedicar el tiempo y el esfuerzo necesarios para aprender a utilizarlas.
Los usuarios que están menos familiarizados con la lógica de una interfaz de línea de comandos utilizada para realizar todas las tareas mencionadas anteriormente pueden estar buscando una manera más fácil de trabajar con contenedores Docker en su conjunto. Por suerte, existe una solución para ese problema: una aplicación oficial Docker Desktop que ofrece una interfaz gráfica de usuario sencilla para la gestión de aplicaciones, contenedores y mucho más.
Esta misma app cuenta también con un mercado de extensiones, que ofrece un montón de extensiones diferentes para ampliar o modificar en alguna medida la funcionalidad de la solución. Las extensiones pueden ser tanto oficiales como generadas por los usuarios, pero la que nos interesa la proporciona la propia Docker.
Volumes Backup & Share es la extensión oficial de gestión de volúmenes de Docker para Docker Desktop, que ofrece una forma fluida de trabajar con volúmenes, incluyendo sus operaciones de copia de seguridad y restauración, así como de clonación, compartición y mucho más.
La solución en cuestión ofrece cuatro tipos de copia de seguridad diferentes:
- Una nueva imagen.
- Una copia de seguridad de archivos (un tarball comprimido con gzip, similar al que hemos comentado antes).
- Un registro de imágenes.
- Una imagen existente.
Otras características incluyen la capacidad de importar o restaurar volúmenes, la capacidad de transferir volúmenes de un host a otro, y todo eso se puede hacer con cero comandos CLI involucrados – una gran opción para un público objetivo específico.
SnapShooter de Digital Ocean
Si nos centramos en las opciones de copia de seguridad de terceros para Docker, podemos empezar con SnapShooter. SnapShooter es una solución de copia de seguridad relativamente joven que solía dirigirse específicamente a las ofertas de DigitalOcean. Se amplió a otros proveedores unos años más tarde, y fue adquirida por DigitalOcean a principios de 2023.
Como su nombre indica, la oferta principal de SnapShooter es la capacidad de realizar instantáneas – aunque se amplió para incluir también copias de seguridad de archivos, copias de seguridad de bases de datos, copias de seguridad de aplicaciones, etc. En cuanto a sus capacidades para Docker – SnapShooter puede ofrecer soporte para copias de seguridad de volúmenes Docker, así como cobertura de copias de seguridad de bases de datos para MongoDB, MySQL y Postgres que se ejecutan en Docker.
SnapShooter también puede ofrecer una interfaz bastante fácil de usar que ayuda a sus usuarios a realizar una variedad de tareas diferentes. Esto incluye la creación de copias de seguridad y procesos de restauración de datos para volúmenes Docker, también.
Duplicati
Otra opción de copia de seguridad de terceros para volúmenes Docker que es algo diferente es Duplicati. Duplicati es una solución de copia de seguridad gratuita bastante conocida con una estructura de código abierto, ofrece la posibilidad de crear copias de seguridad de datos y moverlas a una variedad de ubicaciones de destino de almacenamiento, ya sean servidores remotos, NAS o servicios en la nube.
Dado que Duplicati es una oferta gratuita y de código abierto, es un poco más difícil trabajar con ella para un usuario medio. Sin embargo, aún puede utilizarse para configurar copias de seguridad periódicas de volúmenes Docker utilizando una secuencia específica de comandos. Cabe señalar que este ejemplo utiliza un contenedor Docker específico – linuxserver/duplicati.
El primer paso aquí sería ejecutar el comando llamado id $usuario para asegurarse de que el host actual tiene permisos de root para todas las tareas futuras. El comando en cuestión, así como la respuesta, deberían tener este aspecto:
root@debian:~# id $user
uid=0(root) gid=0(root) groups=0(root)
El número cero en ambos campos gid y uid representa el estado de un usuario root.
El siguiente comando ejecuta el mencionado contenedor Docker linuxserver/duplicati dentro de su sistema:
docker run -d \
–name=duplicati \
-e PUID=0 \
-e PGID=0 \
-e TZ=Etc/UTC \
-p 8200:8200 \
-v duplicati-config:/config \
-v /tmp/backups:/backups \
-v /:/source \
–restart unless-stopped \
lscr.io/linuxserver/duplicati:latest
En cuanto introduzca este comando, podrá acceder a la interfaz de usuario web de Duplicati visitando http://<server_ip>:8200 en la barra de búsqueda de su navegador web.
Una vez completada la ejecución inicial, es importante que el contenedor en cuestión se detenga con el comando docker stop <id_cont> , en el que se teclea el ID único del contenedor.
La mayoría de los tipos de interfaz gráfica para la gestión de contenedores Docker también debe ser capaz de realizar este paso siguiente, pero vamos a ir sobre la versión CLI de la misma por el bien de este ejemplo. Aquí, tenemos que modificar el comando de lanzamiento del contenedor Docker utilizado anteriormente sustituyendo el campo /source por la ubicación exacta de cada volumen del que desee realizar una copia de seguridad.
docker run -d \
–name=duplicati \
-e PUID=0 \
-e PGID=0 \
-e TZ=Etc/UTC \
-p 8200:8200 \
-v duplicati-config:/config \
-v /tmp/backups:/backups \
-v volume1:/source/volume1 \
-v volume2:/source/volume2 \
–restart unless-stopped \
lscr.io/linuxserver/duplicati:latest
Una vez completado este proceso, se recomienda reiniciar el contenedor de Duplicati antes de continuar. Nuestro último paso aquí es empezar a utilizar la interfaz de usuario web de Duplicati para iniciar los trabajos de copia de seguridad. Utilice el botón Add backup y siga el asistente de copia de seguridad para hacerlo. Tendrá que señalar los datos exactos de los que desea realizar una copia de seguridad – los volúmenes Docker que ha mapeado deberían encontrarse bajo la categoría Source data en el asistente de copia de seguridad. Las copias de seguridad propiamente dichas se guardan en el directorio /tmp/backups (puede modificarse).
Hemos repasado una solución de copia de seguridad de Docker a pequeña escala y una opción gratuita de copia de seguridad de volúmenes de Docker, ahora es el momento de ver cómo funcionan las soluciones de copia de seguridad empresariales a gran escala con la misma tarea.
Copia de seguridad y restauración de Docker con Bacula Enterprise
Bacula Enterprise utiliza su capacidad modular para permitir la integración nativa de varios sistemas y servicios, incluido Docker. Bacula es un software integral de copia de seguridad y recuperación en red que está diseñado para soportar las pesadas cargas de trabajo de medianas y grandes empresas. También tiene unos niveles de seguridad especialmente altos en comparación con otras soluciones de proveedores de copias de seguridad y, como tal, en él confían la gran mayoría de las organizaciones militares, de defensa y gubernamentales occidentales. El módulo Docker de Bacula proporciona una gran cantidad de útiles funciones adicionales junto a las principales de copia de seguridad y recuperación.
La copia de seguridad de Docker con Bacula Enterprise consta de tres sencillos pasos:
- El estado actual del contenedor se guarda en la nueva imagen
- Se ejecuta la utilidad Docker y se guardan los datos
- Se elimina la instantánea en cuestión para liberar espacio
La copia de seguridad en cuestión puede realizarse a un contenedor en cualquier estado, y el software de Bacula muestra el estado del proceso de copia de seguridad en cada paso. Cada copia de seguridad de imagen de contenedor supone guardar un archivo .tar más. Las copias de seguridad de imágenes se guardan en el directorio /@docker/image//.tar, y las copias de seguridad de contenedores en el directorio /@docker/container//.tar .
El proceso de restauración de las copias de seguridad de Docker con Bacula Enterprise es algo más complicado y puede realizarse de dos formas diferentes:
- Restaurar al directorio local que utiliza el parámetro where=/some/path Bacula para indicar la ruta completa de la copia de seguridad a restaurar como archivo o archivos de almacenamiento;
- Y Restaurar en el servicio Docker, lo que significa que los datos de la copia de seguridad se restaurarían con el comando where= como el nuevo contenedor, sin archivarlos en primer lugar.
La personalización del proceso de restauración también está disponible a través de varios parámetros diferentes, como container_create, container_run, y más.
En el momento de escribir estas líneas, Bacula es una de las pocas (o la única) solución de copia de seguridad y recuperación de nivel empresarial capaz de realizar una copia de seguridad completa y exhaustiva de un entorno Docker. También salvaguarda una amplia gama de otras tecnologías de contenedores, y se recomienda para entornos informáticos exigentes y de misión crítica por su escalabilidad, fiabilidad y resistencia.
En general, la disponibilidad de otras soluciones especializadas de copia de seguridad de Docker, combinada con la propia solución incorporada de Docker, junto con el módulo Docker de Bacula, significa que hay una gama de opciones disponibles para los administradores de TI que buscan una manera de salvaguardar su despliegue Docker de producción.