Docker volumen de copia de seguridad y restauración

23

Estoy usando Docker para implementar algunos servicios en un servidor CentOS 6.4, y estoy tratando de descubrir cómo hacer una copia de seguridad de los datos que generan.

Por ejemplo, uno de los servicios es una aplicación web donde los usuarios pueden cargar archivos. Para este contenedor, tengo un /filesvolumen del que quiero hacer una copia de seguridad. Parece que los montajes de host están mal vistos, porque dicho montaje no es de ninguna manera portátil, como se dice en esta publicación de blog y en la documentación de Docker para volúmenes .

Sé por la misma publicación de blog que no necesito un montaje de host para acceder a los archivos en un volumen, puedo usar docker inspectpara averiguar dónde están los archivos.

Pero aquí está mi problema: estaba pensando en hacer una copia de seguridad solo de los dockerfiles necesarios para construir los contenedores y los volúmenes asociados con ellos. En el caso probable de que tenga que restaurar todo desde la copia de seguridad, ¿cómo haría para saber qué directorio de volumen corresponde a qué contenedor? La reconstrucción del contenedor hace que la identificación y la ruta del volumen cambien, por lo que necesitaría información adicional para que coincida. ¿Qué más, en todo caso, debería hacer una copia de seguridad para poder restaurar todo realmente?

fcoelho
fuente

Respuestas:

24

Tienes razón. Como puede tener varios contenedores con volúmenes por su cuenta, debe realizar un seguimiento de qué volumen corresponde a cada contenedor. Cómo hacerlo depende de su configuración: uso el nombre -datos para el contenedor de datos, por lo que es obvio a qué contenedor pertenece una imagen. De esa manera se puede hacer una copia de seguridad de esta manera:

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

Ahora solo necesita reconstruir su imagen y recrear su contenedor de datos:

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

Esto significa que necesita hacer una copia de seguridad:

  • Dockerfile
  • volumen
  • ruta de volumen en contenedor
  • nombre del contenedor al que pertenece el volumen

Actualización: Mientras tanto, creé una herramienta para hacer una copia de seguridad de los contenedores y sus volúmenes (contenedores): https://github.com/discordianfish/docker-backup y una imagen de copia de seguridad que puede crear copias de seguridad y empujarlas a s3: https://github.com/discordianfish/docker-lloyd

Johannes 'pez' Ziemke
fuente
Eso es un compromiso justo, gracias. ¿Existe una clara ventaja de usar un contenedor separado para datos?
fcoelho
De nuevo, esto realmente depende de su configuración. Tiene sentido usar un contenedor de datos porque puede referirse fácilmente a él utilizando 'volume-from' y tener todos los elementos internos extraídos: simplemente adjunte volúmenes del contenedor a otros contenedores en lugar de pensar en términos de ruta y puntos de montaje.
Johannes 'fish' Ziemke
Tengo esta opción inválida de error - z. Parece que el tar predeterminado en busybox no es compatible con esto.
Dzung Nguyen
66
JQ es muy fresco, pero en lugar de introducir una dependencia, por qué no uso docker inspects construido en templating este modo: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Probablemente también sea aconsejable recordar a las personas que no esperen hacer una copia de seguridad de los archivos de esta manera mientras están en uso (por ejemplo, bases de datos).
mc0e
2
En Docker 1.8, el formato ha cambiado: Volumesdesaparecieron y, en Mountscambio, existen con una estructura diferente. Necesitamos trabajar un poco más rangepara encontrar el punto de montaje que nos interesaVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki
5

En el Docker más nuevo (probado en 1.9.1, build 9894698) puedes usar el cpcomando .

Aquí hay un ejemplo de cómo copiar un directorio desde el contenedor al host:

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

Aquí hay un ejemplo de cómo copiar un directorio del contenedor a un tararchivo:

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

Por último, pero no menos importante, un ejemplo de cómo copiar un directorio del contenedor a un tar.gzarchivo:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz
czerasz
fuente
2
docker cpenvía todo a través de la red. Es algo que desea evitar, especialmente si su volumen Docker ya es un volumen btrfs.
Jarek Przygódzki
2
La pregunta menciona copia de seguridad y restauración . Un ejemplo de restauración en esta respuesta usando docker cpsería bueno.
MadMike