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

Uma fotografia de uma pessoa trabalhando em uma mesa de computador.

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

Um terminal destacando os contêineres Docker disponíveis para um sistema.

Encontre o contêiner que você deseja copiar e então pare a instância:

docker stop NOME_DA_INSTANCIA

Um terminal mostrando a saída do comando docker stop.

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

Um terminal mostrando a saída do comando docker commit criando uma nova imagem a partir da atualmente em execução.

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 minhaimagemdocontainer

Use 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 git

Execute o seguinte comando para baixar o script de exportação de volume para Docker:

git clone https://github.com/ricardobranco777/docker-volumes.sh.git

Certifique-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

Um terminal mostrando o processo de backup de quaisquer dados de volumes associados a um contêiner Docker.

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.tar

Use 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 minhaimagemdocontainer

Execute seu novo contêiner Docker importado:

docker start meu-container-nginx

Confirme se sua imagem importada está funcionando corretamente listando todos os contêineres ativos no sistema:

docker ps

Um terminal mostrando a mesma imagem de contêiner Docker em execução em um sistema diferente.

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 git

Assim 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.

Um terminal mostrando o processo de obter e instalar o script de volume Docker para backup de dados associados a contêineres.

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 minhaimagemdocontainer

Execute 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.tar

Inicie seu novo contêiner Docker executando o seguinte comando:

docker start meu-container-nginx

Teste se seu contêiner está carregando seu volume corretamente olhando para seus dados de configuração internos:

docker inspect -f '{{ .Mounts }}' meu-container-nginx

Um terminal destacando os dados de volume importados para a nova máquina.

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 load

Deve 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.

Um terminal mostrando o processo de iniciar um novo contêiner e confirmando que está funcionando corretamente.

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-plugin

Crie uma nova pasta em seu diretório inicial para sua instalação Docker Compose:

mkdir ~/meu-docker-compose && cd ~/meu-docker-compose

Use seu editor de texto favorito para criar um arquivo “docker-compose.yml” para sua aplicação:

nano ./docker-compose.yml

Cole 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 -d

Por 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.”

Uma captura de tela mostrando o contêiner Docker Nginx importado funcionando corretamente em seu novo host de máquina.

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.