Como compartilhar minha Docker-Image sem usar o Docker-Hub?

257

Estou pensando onde as imagens do Docker são armazenadas exatamente na minha máquina host local. Posso compartilhar minha imagem do Docker sem usar a Docker-Hubou uma imagem de DockerfileDocker 'real'? E o que está acontecendo exatamente quando eu 'envio' minha Docker-Image ao Docker-Hub?

yaquawa
fonte
2
Para referência futura: um bom artigo sobre como mover imagens de
janelas de

Respostas:

243

As imagens do Docker são armazenadas como camadas do sistema de arquivos. Todo comando no Dockerfile cria uma camada. Você também pode criar camadas usando a docker commitpartir da linha de comando após fazer algumas alterações (via docker runprovavelmente).

Essas camadas são armazenadas por padrão em /var/lib/docker. Embora você possa (teoricamente) escolher arquivos a partir de lá e instalá-los em um servidor docker diferente, provavelmente é uma má idéia brincar com a representação interna usada pelo Docker.

Quando você envia sua imagem por push, essas camadas são enviadas para o registro (o registro do docker hub, por padrão ... a menos que você marque sua imagem com outro prefixo do registro) e armazenadas lá. Ao pressionar, o ID da camada é usado para verificar se você já possui a camada localmente ou precisa ser baixada. Você pode usar docker historypara espreitar quais camadas (outras imagens) são usadas (e, até certo ponto, qual comando criou a camada).

Quanto às opções para compartilhar uma imagem sem enviar para o registro do docker hub, suas melhores opções são:

  • docker saveuma imagem ou docker exportum contêiner. Isso produzirá um arquivo tar para a saída padrão, então você gostaria de fazer algo parecido docker save 'dockerizeit/agent' > dk.agent.latest.tar. Então você pode usar docker loadou docker importem um host diferente.

  • Hospede seu próprio registro privado. - Desatualizado, ver comentários Consulte a imagem do registro da janela de encaixe . Criamos um registro com suporte para s3, que você pode iniciar e parar conforme necessário (todo o estado é mantido no balde s3 de sua escolha), que é trivial para a configuração. Essa também é uma maneira interessante de observar o que acontece ao enviar para um registro

  • Use outro registro como o quay.io (ainda não o testei pessoalmente), embora quaisquer preocupações que você tenha com o hub docker provavelmente se apliquem aqui também.

Abel Muiño
fonte
6
Para referência futura, o link para a imagem do registro da janela de encaixe está desatualizado. Agora você deve usar o Docker Registry 2.0 e o código no github / docker / distribution
RoelAdriaans
1
Não tenho certeza se está claro que o Registry 2.0 é um substituto pronto para uso do original. Parece faltar algumas funcionalidades básicas, tais como pesquisa stackoverflow.com/questions/30113726/docker-registry-2-0-api-v2
JoshRivers
1
Pergunta sobre docker save: quando envio uma imagem que deriva de outra imagem (digamos python:2.7) para um registro, a imagem pai não precisa ser carregada mais de uma vez, a menos que seja alterada. Posso salvar imagens parciais para obter uma otimização de tamanho de arquivo semelhante? Estou pulando por cima disso porque sou um hobby com várias imagens e não quero pagar por um registro particular.
Pieter
4
Você não pode simplesmente extrair arquivos src de um repositório git, incluindo um Dockerfile, e docker buildno host?
jshxe
1
O @Jishaxe parte da minha compilação é npm install... Não consigo compilar no meu host porque ele tem muito pouca memória e essa etapa sempre falha (consulte: github.com/npm/npm/issues/5021 )
Soft Bullets
46

Com base neste blog , é possível compartilhar uma imagem do docker sem um registro do docker executando:

docker save --output latestversion-1.0.0.tar dockerregistry/latestversion:1.0.0

Após a conclusão deste comando, é possível copiar a imagem para um servidor e importá-la da seguinte maneira:

docker load --input latestversion-1.0.0.tar
030
fonte
18

O envio de uma imagem do docker para um servidor remoto pode ser feito em 3 etapas simples:

  1. Salve localmente a imagem da janela de encaixe como .tar :
docker save -o <path for created tar file> <image name>
  1. Localmente, use scp para transferir .tar para remoto

  2. No servidor remoto, carregue a imagem na janela de encaixe:

docker load -i <path to docker image tar file>
JSON C11
fonte