Conforme descrito na documentação do Docker em Trabalhando com Volumes, há o conceito dos chamados contêineres somente de dados , que fornecem um volume que pode ser montado em vários outros contêineres, não importa se o contêiner somente de dados está realmente em execução ou não.
Basicamente, isso parece incrível. Mas há uma coisa que não entendo.
Esses volumes (que não mapeiam explicitamente para uma pasta no host por motivos de portabilidade, como afirma a documentação) são criados e gerenciados pelo Docker em alguma pasta interna no host (/var/docker/volumes/…
).
Suponha que eu use esse volume e, em seguida, precise migrá-lo de um host para outro - como faço para transferir o volume? AFAICS tem um ID exclusivo - posso simplesmente copiar o volume e seu contêiner somente de dados de acordo para um novo host? Como faço para descobrir quais arquivos copiar? Ou há algum suporte integrado ao Docker que eu ainda não descobri?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
Isso não depende de detalhes de implementação dos volumes. E importe os dados com tar na segunda máquina.Respostas:
A resposta oficial está disponível na seção "Fazer backup, restaurar ou migrar volumes de dados" :
CÓPIA DE SEGURANÇA:
--rm
: remova o contêiner quando ele sair--volumes-from DATA
: anexar aos volumes compartilhados pelo contêiner DATA-v $(pwd):/backup
: bind monta o diretório atual no container; para escrever o arquivo tar parabusybox
: uma imagem pequena e mais simples - boa para manutenção rápidatar cvf /backup/backup.tar /data
: cria um arquivo tar descompactado de todos os arquivos no diretório / dataRESTAURAR:
fonte
docker create
para contêineres somente de dados, para que eles não sejam iniciados. Veja o exemplo no início. documentação: docs.docker.com/userguide/dockervolumes/…/data
com/var/lib/postgresql/data
, correto?docker exec
ele continue ), um comando simples étail -f /dev/null
que nunca sairá, mas usará recursos mínimos. Quando você não precisar mais dele rodando,docker stop data-container
fará isso por você. Os volumes permanecem para outros recipientes.Você pode exportar o volume para o tar e transferir para outra máquina. E importe os dados com tar na segunda máquina. Isso não depende de detalhes de implementação dos volumes.
fonte
docker run -v /data-volume -name datacointainer busybox true
- você pode executá-lo em qualquer lugar. Depois de criar o contêiner de dados, você pode importar o arquivo tar conforme explicado na resposta.--cidfile=id.txt
como parâmetro de execução. O ID do contêiner será armazenado no arquivoid.txt
. Eu atualizei a resposta.docker run --rm
vez dedocker run --cidfile ... ; docker rm
.Estendendo a resposta oficial dos documentos do Docker e a principal resposta aqui , você pode ter os seguintes aliases em seu .bashrc ou .zshrc
Observe que o backup é salvo em
/tmp
, portanto, você pode mover o arquivo de backup salvo lá entre os hosts docker.Também há dois pares de aliases de backup / restauração. Um usando compressão e debian: jessie e outro sem compressão, mas com busybox. Favor usar compactação se os arquivos para backup forem grandes.
fonte
Adicionarei aqui outra ferramenta recente da IBM que, na verdade, é feita para a migração de volume de um host de contêiner para outro. Este é um projeto atualmente em andamento. Portanto, você pode encontrar uma versão diferente com recursos adicionais no futuro.
Cargo foi desenvolvido para migrar contêineres de um host para outro host junto com seus dados com o mínimo de tempo de inatividade. Cargo usa recursos de federação de dados do sistema de arquivos de união para criar uma visão unificada dos dados (principalmente o sistema de arquivos raiz) nos hosts de origem e destino. Isso permite que o Cargo inicie um contêiner quase imediatamente (em milissegundos) no host de destino conforme os dados do sistema de arquivos raiz de origem são copiados para hosts de destino sob demanda (usando uma partição de cópia na gravação (COW) ) ou preguiçosamente em segundo plano (usando rsync) .
Os pontos importantes são: - um
centralized
servidor lida com o processo de migraçãoO link para o projeto é fornecido aqui:
fonte
Caso suas máquinas estejam em VPCs diferentes ou você queira copiar de / para a máquina local (como no meu caso), você pode usar o dvsync que criei. É basicamente ngrok combinado com
rsync
mais de SSH empacotado em duas imagens pequenas (ambas com cerca de 25 MB). Primeiro, você inicia odvsync-server
em uma máquina da qual deseja copiar os dados (você precisará do,NGROK_AUTHTOKEN
que pode ser obtido no painel ngrok ):Em seguida, você pode iniciar o
dvsync-client
na máquina para a qual deseja copiar os arquivos, passando oDVSYNC_TOKEN
mostrado pelo servidor:Assim que a cópia for concluída, o cliente sairá. Isso funciona com Docker CLI, Compose, Swarm e Kubernetes também.
fonte