Como se describe en la documentación de Docker sobre cómo trabajar con volúmenes, existe el concepto de los denominados contenedores de solo datos , que proporcionan un volumen que se puede montar en varios otros contenedores, sin importar si el contenedor de solo datos se está ejecutando o no.
Básicamente, esto suena genial. Pero hay una cosa que no entiendo.
Estos volúmenes (que no se asignan explícitamente a una carpeta en el host por razones de portabilidad, como indica la documentación) son creados y administrados por Docker en alguna carpeta interna en el host ( /var/docker/volumes/…
).
Supongamos que utilizo un volumen de este tipo y luego necesito migrarlo de un host a otro, ¿cómo transfiero el volumen? AFAICS tiene una ID única: ¿puedo simplemente copiar el volumen y su contenedor de solo datos correspondiente a un nuevo host? ¿Cómo averiguo qué archivos copiar? ¿O hay algún soporte integrado en Docker que aún no descubrí?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
esto no depende de los detalles de implementación de los volúmenes. E importe los datos con alquitrán en la segunda máquina.Respuestas:
La respuesta oficial está disponible en la sección "Copia de seguridad, restauración o migración de volúmenes de datos" :
APOYO:
--rm
: retire el contenedor cuando salga--volumes-from DATA
: adjuntar a los volúmenes compartidos por el contenedor de DATOS-v $(pwd):/backup
: enlaza montar el directorio actual en el contenedor; para escribir el archivo tar enbusybox
: una imagen pequeña más simple, buena para un mantenimiento rápidotar cvf /backup/backup.tar /data
: crea un archivo tar sin comprimir de todos los archivos en el directorio / dataRESTAURAR:
fuente
docker create
contenedores de solo datos para que no se inicien. Vea el ejemplo en el apagado. documentación: docs.docker.com/userguide/dockervolumes/…/data
con/var/lib/postgresql/data
, correcto?docker exec
entrar en él), entonces un comando simple es eltail -f /dev/null
que nunca saldrá, pero usa recursos mínimos. Cuando ya no lo necesite,docker stop data-container
lo hará por usted. Los volúmenes quedan para otros contenedores.Puede exportar el volumen a alquitrán y transferirlo a otra máquina. E importe los datos con alquitrán en la segunda máquina. Esto no depende de los detalles de implementación de los volúmenes.
fuente
docker run -v /data-volume -name datacointainer busybox true
: puede ejecutarlo en cualquier lugar. Después de crear el contenedor de datos, puede importar el archivo tar como se explica en la respuesta.--cidfile=id.txt
como parámetro de ejecución. El ID del contenedor se almacenará en el archivoid.txt
. He actualizado la respuesta.docker run --rm
lugar dedocker run --cidfile ... ; docker rm
.Extendiendo la respuesta oficial de los documentos de Docker y la respuesta principal aquí , puede tener los siguientes alias en su .bashrc o .zshrc
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 los hosts de 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 de la copia de seguridad son grandes.
fuente
Agregaré aquí otra herramienta reciente de IBM que en realidad está hecha para la migración de volumen de un host de contenedor a otro. Este es un proyecto actualmente en curso. Por lo tanto, puede encontrar una versión diferente con características adicionales en el futuro.
Cargo se desarrolló para migrar contenedores de un host a otro junto con sus datos con un tiempo de inactividad mínimo. Cargo utiliza las capacidades de federación de datos del sistema de archivos de unión para crear una vista unificada de los datos (principalmente el sistema de archivos raíz) en los hosts de origen y destino. Esto permite que Cargo inicie un contenedor casi de inmediato (en milisegundos) en el host de destino a medida que los datos del sistema de archivos raíz de origen se copian en los hosts de destino, ya sea a pedido (usando una partición de copia en escritura (COW) ) o de manera perezosa en segundo plano (usando rsync) .
Los puntos importantes son: - un
centralized
servidor maneja el proceso de migraciónEl enlace al proyecto se proporciona aquí:
fuente
En caso de que sus máquinas estén en diferentes VPC o si desea copiar desde / hacia una máquina local (como en mi caso), puede usar dvsync que he creado. Básicamente es ngrok combinado con
rsync
más de SSH empaquetado en dos imágenes pequeñas (ambas ~ 25 MB). Primero, iniciedvsync-server
en una máquina de la que desea copiar datos (necesitará elNGROK_AUTHTOKEN
que se puede obtener del panel de ngrok ):Luego puede iniciar el
dvsync-client
en la máquina en la que desea copiar los archivos, pasando lo queDVSYNC_TOKEN
muestra el servidor:Una vez que se haya realizado la copia, el cliente saldrá. Esto también funciona con Docker CLI, Compose, Swarm y Kubernetes.
fuente