Como Copiar/Mover um Contêiner Docker para Outro Host

Como os contêineres Docker são pequenas caixas de software, você pode facilmente copiá-los e movê-los de um computador para outro. Pode ser que você tenha trabalhado em uma instância Docker em seu computador local e decidiu movê-la para um servidor mais poderoso. Ou talvez você apenas queira implantar seu contêiner personalizado em vários computadores, “copiando e colando” por aí. Outras vezes, você pode estar insatisfeito com um provedor de computação em nuvem e querer mudar para um diferente. Aqui, mostramos como mover sua imagem de contêiner Docker existente e volumes de dados de um host Linux para outro.
Índice
- Salvar Imagem do Contêiner do Host de Origem
- Exportando um Volume Docker de Seu Contêiner
- Carregar Imagem do Contêiner no Host de Destino
- Importando um Volume Docker Para Seu Contêiner
- Transferir Imagem Sem Criar um Arquivo
- Usando Docker Compose para Mover uma Implantação Docker Inteira
Bom saber: comece com contêineres instalando o Docker em sua distro Linux.
Salvar Imagem do Contêiner do Host de Origem
Comece listando os contêineres Docker disponíveis em execução no seu sistema. No meu caso, quero exportar meu contêiner Docker Nginx para uma nova máquina:
docker ps
Encontre o contêiner que você deseja copiar e então pare a instância:
docker stop NOME_DA_INSTANCIA
Um contêiner Docker é construído a partir de uma imagem inicial genérica. Com o tempo, você adiciona suas próprias alterações a essa imagem base. Processos em execução dentro do contêiner também podem salvar seus próprios dados ou fazer outras mudanças. Para preservar tudo isso, registre o estado atual do seu contêiner em uma nova imagem:
docker commit NOME_DA_INSTANCIA minhaimagemdocontainer
Observe que, se a instância estiver atualmente em execução, essa ação a pausará enquanto seu conteúdo é salvo. Se isso for um problema, você pode evitar essa pausa digitando docker commit -p=false NOME_DA_INSTANCIA minhaimagemdocontainer. No entanto, não faça isso a menos que seja absolutamente necessário. As chances de criar uma imagem com dados inconsistentes/incompletos aumentam nesse caso.
Agora, salve sua nova imagem de contêiner Docker em um arquivo de archive:
docker save -o minhaimagemdocontainer.tar minhaimagemdocontainerUse seu método preferido de transferência de arquivos e copie seu arquivo .tar para o host onde você deseja mover seu contêiner Docker. Por exemplo, o seguinte comando transfere minha imagem Docker Nginx usando scp:
scp ./minhaimagemdocontainer.tar [email protected]:/home/ramces/Exportando um Volume Docker de Seu Contêiner
Uma das desvantagens de salvar uma imagem Docker é que ela não vem com os acessórios Docker que você configurou ao lado de seu contêiner. Isso inclui qualquer montagem bind de rede e os volumes que você criou para armazenar seus dados persistentes.
Para exportar corretamente seu volume de dados, primeiro instale o Git em sua máquina local:
sudo apt install gitExecute o seguinte comando para baixar o script de exportação de volume para Docker:
git clone https://github.com/ricardobranco777/docker-volumes.sh.gitCertifique-se de que o script de exportação tenha as permissões corretas, então copie-o para o diretório “/usr/local/bin” da sua máquina:
sudo chmod +x ./docker-volumes.sh/docker-volumes.sh
sudo cp ./docker-volumes.sh/docker-volumes.sh /usr/local/bin/Teste se seu script está funcionando corretamente, então extraia todos os volumes associados ao seu contêiner:
docker-volumes.sh -h
docker-volumes.sh NOME_DA_INSTANCIA save minhaimagemdocontainer-volume.tar
Envie seus novos arquivos de volume Docker arquivados para sua máquina remota:
scp ./minhaimagemdocontainer-volume.tar [email protected]:/home/ramces/Carregar Imagem do Contêiner no Host de Destino
Faça login no seu host remoto, então execute o seguinte comando para carregá-lo no daemon Docker da sua máquina remota:
docker load -i ./minhaimagemdocontainer.tarUse docker create para reinitializar sua imagem de contêiner Docker com suas bandeiras de execução originais da sua máquina de origem. Por exemplo, meu contêiner Docker Nginx originalmente tinha a porta 80 mapeada para a porta 8080 da minha máquina host:
docker create --name meu-container-nginx -p 8080:80 minhaimagemdocontainerExecute seu novo contêiner Docker importado:
docker start meu-container-nginxConfirme se sua imagem importada está funcionando corretamente listando todos os contêineres ativos no sistema:
docker ps
FYI: transforme seu Raspberry Pi em uma galeria de fotos portátil capaz instalando o Photoprism com Docker.
Importando um Volume Docker Para Seu Contêiner
Para importar um arquivo de volume Docker .tar, primeiro baixe o Git em seu novo host:
sudo apt install gitAssim como em seu sistema original, baixe o script auxiliar docker-volume.sh, defina seus bits de permissão como “executar,” e então copie-o para o diretório “/usr/local/bin” da sua nova máquina.

Crie um novo contêiner Docker usando seu arquivo de imagem exportada:
docker create --name meu-container-nginx -v meuvol:/usr/share/nginx/html -p 8080:80 minhaimagemdocontainerExecute o script docker-volume.sh com seu arquivo .tar original para carregá-lo no daemon Docker do seu novo sistema:
docker-volumes.sh meu-container-nginx load minhaimagemdocontainer-volume.tarInicie seu novo contêiner Docker executando o seguinte comando:
docker start meu-container-nginxTeste se seu contêiner está carregando seu volume corretamente olhando para seus dados de configuração internos:
docker inspect -f '{{ .Mounts }}' meu-container-nginx
Transferir Imagem Sem Criar um Arquivo
Às vezes você pode querer pular a criação de um arquivo minhaimagemdocontainer.tar.gz. Talvez você não tenha espaço em disco suficiente, uma vez que o contêiner tem muitos dados nele. Você pode salvar, transferir e carregar a imagem no host de destino em um comando. Após executar o comando docker commit discutido acima, você pode usar isso:
docker save minhaimagemdocontainer | ssh [email protected] docker loadDeve funcionar do Windows também, já que agora ele possui um cliente SSH embutido (PuTTY não é mais necessário).
Continue com o comando docker create que se aplica à sua situação.
Nota: Certifique-se de que você montou corretamente qualquer volume Docker que estava previamente anexado ao seu contêiner antes de iniciar a imagem importada.
Por fim, inicie seu novo contêiner Docker importado executando docker start seguido pelo nome do seu contêiner.

Usando Docker Compose para Mover uma Implantação Docker Inteira
Com seu plugin Compose, o Docker torna possível construir, configurar e executar programas complexos sem se preocupar com a pilha de software subjacente do servidor. Isso, por sua vez, permite que você construa implantações de aplicativos reproduzíveis em diferentes sistemas Linux.
Para começar a migrar sua configuração Docker existente para o Docker Compose, primeiro verifique se seu plugin está atualmente no seu sistema:
sudo apt install docker-compose-plugin docker-buildx-pluginCrie uma nova pasta em seu diretório inicial para sua instalação Docker Compose:
mkdir ~/meu-docker-compose && cd ~/meu-docker-composeUse seu editor de texto favorito para criar um arquivo “docker-compose.yml” para sua aplicação:
nano ./docker-compose.ymlCole o seguinte bloco de código dentro do seu arquivo Compose e ajuste-o para suas necessidades específicas:
version: '3'
volumes:
meuvol: # Substitua pelo nome do seu volume importado.
services:
nginx:
image: minhaimagemdocontainer # Substitua pelo nome da sua imagem Docker importada.
ports:
- "8080:80"
volumes:
- meuvol:/usr/share/nginx/html # Substitua "meuvol" pelo nome da sua imagem montada.Salve seu novo arquivo Compose e então execute o seguinte comando para iniciá-lo:
docker compose up -dPor fim, teste se sua implantação Compose está funcionando corretamente. No meu caso, testarei meu contêiner Docker Nginx abrindo um navegador e navegando até “localhost:8080.”

Aprender como copiar e mover seu contêiner Docker para outros hosts Linux é apenas uma das poucas tarefas que você pode fazer com sua máquina. Explore este maravilhoso mundo de auto-hospedagem instalando um servidor Minecraft no Linux usando Docker.