backup - pasos - ¿Cómo puedo hacer una copia de seguridad de un contenedor Docker con sus volúmenes de datos?
dockerfile ejemplos (10)
si deseo revertir el contenedor, puedo intentar confirmar una imagen y luego eliminar el contenedor y crear un nuevo contenedor a partir de la imagen confirmada. Pero si lo hago, el volumen se borrará y todos mis datos desaparecerán.
Como explica la guía del usuario de la ventana acoplable, los volúmenes de datos están destinados a conservar los datos fuera de un sistema de archivos contenedor. Esto también facilita el intercambio de datos entre múltiples contenedores.
Mientras que Docker nunca eliminará los datos en volúmenes (a menos que elimine el contenedor asociado con docker rm -v
), los volúmenes a los que no hace referencia ningún contenedor Docker se denominan volúmenes colgantes . Esos volúmenes colgantes son difíciles de eliminar y de difícil acceso.
Esto significa que tan pronto como se borre el último contenedor que usa un volumen, el volumen de datos se colgará y su contenido será difícil de procesar.
Para evitar esos volúmenes colgantes, el truco consiste en crear un contenedor acoplador adicional utilizando el volumen de datos que desea conservar; de modo que siempre habrá, al menos, ese contenedor acoplable que hace referencia al volumen. De esta forma, puede eliminar el contenedor acoplable que ejecuta la aplicación WordPress sin perder la facilidad de acceso a ese contenido de volumen de datos.
Dichos contenedores se llaman contenedores de volumen de datos .
Debe haber alguna forma simple de hacer una copia de seguridad de mi contenedor más datos de volumen pero no puedo encontrarlo en ningún lado.
imágenes de docker de copia de seguridad
Para hacer una copia de seguridad de las imágenes del acoplador, use el comando de guardado del acoplador que producirá un archivo tar que se puede usar más adelante para crear una nueva imagen del acoplador con el comando de carga del acoplador .
contenedores de docker de respaldo
Puede hacer una copia de seguridad de un contenedor de docker por diferentes medios
- al comprometer una nueva imagen de acoplador basada en el estado actual del contenedor acoplable mediante el comando docker commit
- al exportar el sistema de archivos del contenedor Docker como un archivo tar utilizando el comando de exportación del acoplador . Luego puede crear una nueva imagen de acoplador desde ese archivo tar con el comando de importación de acoplador .
Tenga en cuenta que esos comandos solo respaldarán el sistema de archivos en capas del contenedor docker. Esto excluye los volúmenes de datos .
volúmenes de datos del acoplador de copia de seguridad
Para realizar una copia de seguridad de un volumen de datos, puede ejecutar un nuevo contenedor utilizando el volumen que desea respaldar y ejecutar el comando tar para producir un archivo del contenido de volumen como se describe en la guía del usuario de la ventana acoplable .
En su caso particular, el volumen de datos se usa para almacenar los datos de un servidor MySQL. Por lo tanto, si desea exportar un archivo tar para este volumen, primero deberá detener el servidor MySQL. Para hacerlo, deberá detener el contenedor de wordpress.
copia de seguridad de los datos de MySQL
Otra forma es conectarse de forma remota al servidor MySQL para generar un volcado de base de datos con el comando mysqldump . Sin embargo, para que esto funcione, su servidor MySQL debe estar configurado para aceptar conexiones remotas y también tiene un usuario que puede conectarse remotamente. Este podría no ser el caso con la imagen de WordPress acoplado que está utilizando.
Editar
Recientemente, Docker introdujo los complementos de volumen de Docker, que permiten delegar el manejo de volúmenes a los complementos implementados por los proveedores.
El comando de docker run
tiene un nuevo comportamiento para la opción -v
. Ahora es posible pasarle un nombre de volumen . Los volúmenes creados de esa manera se nombran y son fáciles de referencia más adelante, aliviando los problemas con volúmenes colgantes .
Editar 2
Docker introdujo el comando de docker volume prune
la docker volume prune
para eliminar fácilmente todos los volúmenes colgantes.
He estado usando este Docker-image tutum/wordpress para mostrar un sitio web de Wordpress. Recientemente descubrí que la imagen usa volúmenes para los datos de MySQL.
Entonces, el problema es este: si quiero hacer una copia de seguridad y restaurar el contenedor, puedo intentar enviar una imagen, y luego eliminar el contenedor y crear un nuevo contenedor a partir de la imagen confirmada. Pero si lo hago, el volumen se borrará y todos mis datos desaparecerán.
Debe haber alguna forma simple de hacer una copia de seguridad de mi contenedor más sus datos de volumen, pero no puedo encontrarlo en ningún lado.
Digamos que su nombre de volumen es data_volume
. Puede usar los siguientes comandos para hacer una copia de seguridad y restaurar el volumen hacia y desde una imagen acoplable llamada data_image
:
Hacer copias de seguridad:
docker run --rm --mount source=data_volume,destination=/data alpine tar -c -f- data | docker run -i --name data_container alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container
Para restaurar:
docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data alpine tar -x -f-
El siguiente comando ejecutará tar en un contenedor con todos los volúmenes de datos nombrados montados, y redirigirá la salida a un archivo:
docker run --rm `docker volume list -q | egrep -v ''^.{64}$'' | awk ''{print "-v " $1 ":/mnt/" $1}''` alpine tar -C /mnt -cj . > data-volumes.tar.bz2
Asegúrese de probar el archivo resultante en caso de que algo haya salido mal:
tar -tjf data-volumes.tar.bz2
He creado una herramienta para orquestar e iniciar copias de seguridad de datos y contenedores mysql, simplemente llamado docker-backup . Incluso hay una imagen lista para usar en el docker hub .
Está escrito principalmente en Bash ya que es principalmente orquestación. Utiliza duplicity
para el motor de copia de seguridad real. Actualmente puede realizar una copia de seguridad en FTP (S) y Amazon S3.
La configuración es bastante simple: escriba un archivo de configuración en YAML describiendo qué copia de seguridad y dónde, ¡y aquí va!
Para contenedores de datos, monta automáticamente los volúmenes compartidos por su contenedor para hacer una copia de seguridad y procesarlo. Para contenedores mysql, los vincula y ejecuta un mysqldump incluido con su contenedor y procesa el resultado.
Lo escribí porque utilizo Docker-Cloud, que no está actualizado con lanzamientos de motores docker recientes, y porque quería abrazar el camino Docker al no incluir ningún proceso de copia de seguridad dentro de mis contenedores de aplicaciones.
Sé que esto es viejo, pero me doy cuenta de que no existe una solución bien documentada para empujar un contenedor de datos (como respaldo) al Docker Hub. Acabo de publicar un breve ejemplo de cómo hacerlo en https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub
Lo siguiente es el resultado final
El tutorial de Docker sugiere que puede hacer una copia de seguridad y restaurar el volumen de datos localmente. Vamos a utilizar esta técnica, agreguemos algunas líneas más para hacer que esta copia de seguridad se inserte en el centro del acoplador para una fácil restauración futura en cualquier ubicación que deseemos. Entonces empecemos. Estos son los pasos a seguir:
Copia de seguridad del volumen de datos del contenedor de datos llamado data-container-to-backup
docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup
Expanda este archivo tar a un nuevo contenedor para que podamos confirmarlo como parte de su imagen
docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"
Confirme y presione la imagen con la etiqueta deseada ($ VERSIÓN)
docker commit data-backup repo/data-backup:$VERSION
docker push repo/data-backup:$VERSION
Finalmente, vamos a limpiar
docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)
Ahora tenemos una imagen llamada backup de datos en nuestro repositorio que es simplemente un sistema de archivos con los archivos y carpetas de respaldo. Para usar esta imagen (también conocida como restaurar desde la copia de seguridad), hacemos lo siguiente:
Ejecute el contenedor de datos con la imagen de respaldo de datos
run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}
Ejecute su imagen de whatEver con volúmenes del data-conainter
docker run --volumes-from=data-container repo/whatEver
Eso es.
Me sorprendió que no haya documentación para este trabajo. Espero que alguien encuentre esto útil. Sé que me tomó un tiempo pensar sobre esto.
Si le gusta ingresar operadores arcanos desde la línea de comandos, le encantarán estas técnicas manuales de respaldo de contenedores. Tenga en cuenta que existe una manera más rápida y eficiente de hacer copias de seguridad de los contenedores que sean igual de efectivos. He escrito instrucciones aquí: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus
Paso 1: Agregue un host Docker a cualquier nube Como se explica en un tutorial en el sitio de asistencia de Morpheus, puede agregar un host Docker a la nube que elija en cuestión de segundos. Comience por elegir Infraestructura en la barra de navegación principal de Morpheus. Seleccione Hosts en la parte superior de la ventana Infraestructura y haga clic en el botón "+ Hosts del contenedor" en la esquina superior derecha.
Para realizar una copia de seguridad de un host Docker en una nube a través de Morpheus, vaya a la pantalla Infraestructura y abra el menú "+ Hosts del contenedor".
Elija un tipo de host contenedor en el menú, seleccione un grupo y luego ingrese datos en los cinco campos: Nombre, Descripción, Visibilidad, Seleccionar una nube e Ingresar etiquetas (opcional). Haga clic en Siguiente y luego configure las opciones de host eligiendo un plan de servicio. Tenga en cuenta que los campos Volumen, Memoria y Recuento de CPU serán visibles solo si el plan que selecciona tiene habilitadas las opciones personalizadas.
Aquí es donde agrega y dimensiona volúmenes, establece el tamaño de la memoria y el recuento de CPU, y elige una red. También puede configurar el nombre de usuario y la contraseña del sistema operativo, el nombre de dominio y el nombre de host, que de forma predeterminada es el nombre del contenedor que ingresó previamente. Haga clic en Siguiente y luego agregue Flujos de trabajo de automatización (opcional) .Por último, revise su configuración y haga clic en Completar para guardarlos.
Paso 2: Agregue la Integración del Registro Docker a Nubes Públicas o Privadas Adam Hicks describe en otro tutorial Morpheus lo simple que es integrar con un Registro Docker privado. (No se requiere configuración adicional para usar Morpheus para aprovisionar imágenes con el centro público de Docker utilizando la API pública de Docker).
Seleccione Integraciones en la pestaña Administrador de la barra de navegación principal, y luego elija el botón "+ Nueva Integración" en el lado derecho de la pantalla. En la ventana de Integración que aparece, seleccione Repositorio de Docker en el menú desplegable Tipo, ingrese un nombre y agregue el punto final de la API de registro privado. Proporcione un nombre de usuario y una contraseña para el registro que está utilizando y haga clic en el botón Guardar cambios.
Integre un Registro Docker con una nube privada a través del cuadro de diálogo "Nueva integración" de Morpheus.
Para aprovisionar la integración que acaba de crear, elija Docker en Tipo en el cuadro de diálogo Crear instancia, seleccione el registro en el menú desplegable del Registro Docker en la pestaña Configurar y luego continúe aprovisionando como lo haría con cualquier contenedor Docker.
Paso 3: Administrar copias de seguridad Una vez que haya agregado el host Docker e integrado el registro, se configurará y realizará una copia de seguridad automáticamente para cada instancia que aprovisione. El soporte de Morpheus proporciona instrucciones para ver las copias de seguridad, crear una copia de seguridad de la instancia y crear una copia de seguridad del servidor.
Si solo necesita hacer una copia de seguridad de los volúmenes montados, puede simplemente copiar las carpetas de su Dockerhost .
Nota: si está en Ubuntu , Dockerhost es su máquina local. Si está en Mac , Dockerhost es su máquina virtual.
En Ubuntu
Aquí puede encontrar todas las carpetas con volúmenes: /var/lib/docker/volumes/
para que pueda copiarlas y archivarlas donde desee.
En MAC
No es tan fácil como en Ubuntu. Necesita copiar archivos de la VM.
Aquí hay una secuencia de comandos de cómo copiar todas las carpetas con volúmenes de la máquina virtual (donde se ejecuta el servidor Docker) a su máquina local. Suponemos que su VM de la máquina Docker ha nombrado por defecto .
docker-machine ssh default sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes
docker-machine ssh default sudo chmod -R 777 /home/docker/volumes
docker-machine scp -R default:/home/docker/volumes ./backup_volumes
docker-machine ssh default sudo rm -r /home/docker/volumes
Va a crear una carpeta ./backup_volumes en su directorio actual y copiará todos los volúmenes a esta carpeta.
Aquí hay un script de cómo copiar todos los volúmenes guardados de su directorio local ( ./backup_volumes ) a la máquina Dockerhost
docker-machine scp -r ./backup_volumes default:/home/docker
docker-machine ssh default sudo mv -f /home/docker/backup_volumes /home/docker/volumes
docker-machine ssh default sudo chmod -R 777 /home/docker/volumes
docker-machine ssh default sudo cp -v -R /home/docker/volumes /var/lib/docker/
docker-machine ssh default sudo rm -r /home/docker/volumes
Ahora puedes verificar si funciona por:
docker volume ls
Si solo necesitas una copia de seguridad sencilla para un archivo, puedes probar mi pequeña utilidad: https://github.com/loomchild/volume-backup
Ejemplo
Apoyo:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1
archivará el volumen denominado some_volume
en /tmp/archive1.tar.bz2
archive
Restaurar:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1
limpiará y restaurará el volumen denominado some_volume
del archivo de archivo /tmp/archive1.tar.bz2
.
Más información: http://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/
Si tiene un caso tan simple como el mío, puede hacer lo siguiente:
- Crea un Dockerfile que amplíe la imagen base de tu contenedor
- Supongo que sus volúmenes están asignados a su sistema de archivos, por lo que puede agregar esos archivos / carpetas a su imagen usando
ADD folder destination
- ¡Hecho!
Por ejemplo, suponiendo que tiene los datos de los volúmenes en su directorio de inicio, por ejemplo en /home/mydata
, puede ejecutar lo siguiente:
DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate
Donde DOCKERFILE apunta a un archivo como este:
FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <[email protected]>
WORKDIR /opt/data
ADD mydata .
El resto de las cosas se hereda de la imagen base. Ahora puede enviar esa imagen a la nube de portuarios y sus usuarios tendrán los datos disponibles directamente en sus contenedores
ACTUALIZACIÓN 2
Script de copia de seguridad de un solo volumen en bruto:
#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_NAME=$2
usage() {
echo "Usage: $0 [container name] [volume name]"
exit 1
}
if [ -z $CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
if [ -z $VOLUME_NAME ]
then
echo "Error: missing volume name parameter."
usage
fi
sudo docker run -rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME
Script de restauración de un solo volumen en bruto:
#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1
usage() {
echo "Usage: $0 [container name]"
exit 1
}
if [ -z $NEW_CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
sudo docker run -rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar
El uso puede ser así:
$ volume_backup.sh old_container /srv/www
$ sudo docker stop old_container && sudo docker rm old_container
$ sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container
Los supuestos son: el archivo de copia de seguridad se llama backup.tar, reside en el mismo directorio que el script de copia de seguridad y restauración, el nombre del volumen es el mismo entre los contenedores.
ACTUALIZAR
Me parece que hacer una copia de seguridad de los volúmenes de los contenedores no es diferente de hacer una copia de seguridad de los volúmenes de los contenedores de datos.
Los volúmenes no son más que rutas vinculadas a un contenedor, por lo que el proceso es el mismo.
No sé si docker-backup funciona también para los mismos volúmenes de contenedores, pero puede usar:
sudo docker run -rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
y:
sudo docker run -rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar
FINALIZAR ACTUALIZACIÓN
Esta bonita herramienta está disponible y le permite hacer copias de seguridad y restaurar contenedores de volúmenes docker:
https://github.com/discordianfish/docker-backup
si tiene un contenedor vinculado a algunos volúmenes de contenedores como este:
$ docker run --volumes-from=my-data-container --name my-server ...
puede hacer una copia de seguridad de todos los volúmenes como este:
$ docker-backup store my-server-backup.tar my-server
y restaurar de esta manera:
$ docker-backup restore my-server-backup.tar
O puede seguir la forma oficial: