Como copiar/mover um contêiner Docker para outro host
Como os contêineres do Docker são pequenas caixas de software, por assim dizer, você pode copiá-los e movê-los de um computador para outro. No entanto, isso não é discutido com frequência, provavelmente porque organizações maiores configuram seus próprios repositórios, onde podem personalizar suas próprias imagens e distribuí-las entre seus servidores conforme acharem adequado. Mas você não deveria ter que se preocupar em configurar sua própria linha de distribuição se ocasionalmente precisar movimentar um ou mais contêineres.
Pode ser que você tenha trabalhado em uma instância do Docker em seu computador local e tenha decidido movê-la para um servidor mais poderoso. Ou talvez você queira apenas implantar seu contêiner personalizado em vários computadores, “copiá-lo e colá-lo”. Outras vezes, você pode estar insatisfeito com um provedor de computação em nuvem e querer mudar para outro. Seja qual for a situação, existe um procedimento bastante simples para fazer isso, que será detalhado a seguir.
Leia também: Como configurar o WordPress usando Docker no Ubuntu
Salvar imagem do contêiner do host de origem
Não é necessário parar o contêiner primeiro, mas é altamente recomendável que você faça isso. Você tirará um instantâneo dos dados em sua instância do Docker. Se estiver em execução enquanto você faz isso, há uma pequena chance de alguns arquivos ficarem incompletos em seu instantâneo. Imagine alguém enviando um arquivo de 500 MB. Quando 250 MB forem carregados, você emite o comando docker commit
. O upload continua, mas quando você restaura essa imagem do Docker em outro host, apenas 250 MB dos 500 MB podem estar disponíveis.
Então, se puder, primeiro interrompa a instância.
docker stop NAME_OF_INSTANCE
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 esta imagem base. Os processos em execução dentro do contêiner também podem salvar seus próprios dados ou fazer outras alterações. Para preservar tudo isso, você pode comprometer esse novo estado com uma nova imagem.
Observe que se a instância estiver em execução, esta ação irá pausá-la enquanto seu conteúdo é salvo. Se você adicionou muitos dados ao seu contêiner, esta operação levará mais tempo para ser concluída. Se isso for um problema, você pode evitar essa pausa digitando docker commit -p=false NAME_OF_INSTANCE mycontainerimage
em vez do próximo comando. 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 neste caso.
Neste tutorial, um nome genérico foi escolhido para a imagem resultante, mycontainerimage
. Você pode alterar esse nome se desejar. Se você fizer isso, lembre-se de substituí-lo em todos os comandos subsequentes onde encontrá-lo.
docker commit NAME_OF_INSTANCE mycontainerimage
Agora, salve esta imagem em um arquivo e compacte-a.
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
Em seguida, use seu método de transferência de arquivo preferido e copie mycontainerimage.tar.gz
para o host para onde deseja migrar seu contêiner.
Carregar imagem do contêiner no host de destino
Depois de fazer login no host para onde transferiu a imagem, importe-a para o Docker.
gunzip -c mycontainerimage.tar.gz | docker load
Como você nunca inicializou este contêiner aqui, ainda não é possível iniciá-lo com docker start
. Em vez disso, emita o mesmo comando que você usou no passado, quando executou esta instância do Docker pela primeira vez. A única diferença agora é que você usará "mycontainerimage" no final, em vez de qualquer imagem usada no passado.
O próximo comando é apenas um exemplo; não copie e cole isso, a menos que se aplique a você. (Nenhum parâmetro especial foi necessário quando você executou a imagem pela primeira vez)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
Por outro lado, a seguir está um exemplo de comando em que o parâmetro --publish
era necessário para encaminhar a porta 80 na máquina host para a porta 80 no contêiner:
docker run -d --name=http-server --publish 80:80 mycontainerimage
Depois, você pode parar e iniciar este contêiner normalmente, com os comandos docker stop
e docker start
.
Transferir imagem sem criar um arquivo
Às vezes você pode querer pular a criação de um arquivo mycontainerimage.tar.gz
. Talvez você não tenha espaço em disco suficiente, pois o contêiner contém muitos dados. Você pode salvar, compactar, transferir, descompactar e carregar a imagem no host de destino em um comando. Depois de executar o comando docker commit
discutido na primeira seção, você pode usar isto:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
Deve funcionar também no Windows, já que agora possui um cliente SSH integrado (o PuTTY não é mais necessário).
Depois, continue com o comando docker run
que se aplica à sua situação.
Conclusão
docker save
e docker load
são ótimas soluções ad hoc para mover contêineres ocasionalmente. Mas lembre-se, se você fizer isso com frequência, talvez seja melhor configurar seu próprio repositório privado.
Crédito da imagem: Serviço Médico da Força Aérea