¿Cómo transferir volúmenes de solo datos de un host a otro?


Como se describe en la documentación de Docker sobre Trabajando con volúmenes existe el concepto de los llamados contenedores de solo datos, que proporcionan un volumen que se puede montar en varios otros contenedores, sin importar si el contenedor de solo datos está realmente en ejecución o no.

Básicamente, esto suena increíble. Pero hay una cosa que no entiendo.

Estos volúmenes (que hacen no mapear explícitamente a una carpeta en el host por razones de portabilidad, como los estados de la documentación) son creados y administrados por Docker en alguna carpeta interna del host (/var/docker/volumes/…).

Supongamos que utilizo un volumen de este tipo, y luego tengo que migrarlo de un host a otro - ¿cómo puedo portar el volumen? AFAICS tiene un ID único-¿puedo simplemente ir y copiar el volumen y su contenedor de solo datos de acuerdo a un nuevo host? ¿Cómo puedo saber qué archivos copiar? ¿O hay algún soporte incorporado en Docker que aún no he descubierto?

 87
Author: Golo Roden, 2014-02-06

5 answers

La respuesta oficial ya está disponible aquí:

Compartir directorios usando Volúmenes

En la sección" Copia de seguridad, restauración o migración de volúmenes de datos " tiene:

COPIA DE SEGURIDAD:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: retire el contenedor cuando salga
  • --volumes-from DATA: adjuntar a los volúmenes compartidos por el contenedor de DATOS
  • -v $(pwd):/backup: bind monta el directorio actual en el contenedor; para escribir el archivo tar en
  • busybox: una pequeña imagen más simple - bueno para un mantenimiento rápido
  • tar cvf /backup/backup.tar /data: crea un archivo tar sin comprimir de todos los archivos del directorio / data

RESTAURAR:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt
 92
Author: tommasop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 14:32:51

Puede exportar el volumen a tar y transferirlo a otra máquina. E importe los datos con tar en la segunda máquina. Esto no depende de los detalles de implementación de los volúmenes.

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp
 14
Author: Jiri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-29 13:53:42

Extendiendo la respuesta oficial desde Docker docsy la respuesta superior aquí, puede tener los siguientes alias en su .bashrc or .zshrc

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

Tenga en cuenta que la copia de seguridad se guarda en /tmp, por lo que puede mover el archivo de copia de seguridad guardado allí entre hosts docker.

También hay dos pares de alias de copia de seguridad/restauración. Uno usando compresión y debian:jessie y otro sin compresión pero con busybox. Favorezca el uso de compresión si los archivos a respaldar son grandes.

 13
Author: Luís Bianchin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-03 22:14:03

Voy a añadir otra herramienta reciente aquí de IBM que en realidad se hace para la migración de volumen de un host contenedor a otro. Este es un proyecto actualmente en curso. Por lo tanto, es posible que encuentre una versión diferente con características adicionales en el futuro.

Cargo se desarrolló para migrar contenedores de un host a otro host junto con sus datos con un tiempo de inactividad mínimo. Cargo utiliza las capacidades de federación de datos de union filesystem para crear una vista unificada de los datos (principalmente sistema de archivos raíz) en los hosts de origen y destino. Esto permite que Cargo inicie un contenedor casi inmediatamente (en milisegundos) en el host de destino, ya que los datos del sistema de archivos raíz de origen se copian en los hosts de destino, ya sea bajo demanda (utilizando una partición copy-on-write(COW)) o perezosamente en segundo plano (utilizando rsync).

Los puntos importantes son: - a centralized el servidor maneja el proceso de migración

El enlace al proyecto se da aquí:

https://github.com/nadgowdas/cargo
 2
Author: Arif A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-01 14:36:59

En caso de que sus máquinas estén en diferentes VPC o desee copiar desde/hacia una máquina local (como en mi caso) puede usar dvsync que creé. Es básicamente ngrok combinado con rsync sobre SSH empaquetado en dos imágenes pequeñas (ambas ~25MB). Primero, inicie dvsync-server en una máquina desde la que desea copiar datos (necesitará NGROK_AUTHTOKEN que se puede obtener desde ngrok dashboard):

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

Luego puede iniciar el dvsync-client en la máquina a la que desea copiar los archivos, pasando el DVSYNC_TOKEN mostrado por el servidor:

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client 

Una vez realizada la copia, el cliente saldrá. Esto también funciona con Docker CLI, Compose, Swarm y Kubernetes.

 0
Author: suda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-11 21:32:06