Come condividere la mia immagine Docker senza utilizzare Docker-Hub?


257

Mi chiedo dove siano archiviate esattamente le immagini di Docker nella mia macchina host locale. Posso condividere la mia immagine Docker senza usare Docker-Hubo aDockerfile la 'reale'? E cosa sta succedendo esattamente quando 'spingo' la mia immagine Docker su Docker-Hub?


2
Per riferimento futuro: un buon articolo sullo spostamento delle immagini della finestra mobile
Mifeet,

Risposte:


243

Le immagini Docker sono memorizzate come livelli di filesystem. Ogni comando nel Dockerfile crea un livello. Puoi anche creare livelli usando docker commitdalla riga di comando dopo aver apportato alcune modifiche ( docker runprobabilmente tramite ).

Questi livelli sono memorizzati per impostazione predefinita in /var/lib/docker. Sebbene sia possibile (teoricamente) selezionare i file da lì e installarli in un altro server docker, è probabilmente una cattiva idea giocare con la rappresentazione interna utilizzata da Docker.

Quando si invia l'immagine, questi livelli vengono inviati al registro (il registro hub docker, per impostazione predefinita ... a meno che non si tagghi l'immagine con un altro prefisso del registro) e li memorizzino. Quando si spinge, l'id layer viene utilizzato per verificare se il layer è già presente localmente o deve essere scaricato. Puoi usare docker historyper dare un'occhiata a quali livelli (altre immagini) sono usati (e, in una certa misura, quale comando ha creato il livello).

Per quanto riguarda le opzioni per condividere un'immagine senza passare al registro dell'hub docker, le opzioni migliori sono:

  • docker saveun'immagine o docker exportun contenitore. Questo genererà un file tar nell'output standard, quindi ti piacerebbe fare qualcosa di simile docker save 'dockerizeit/agent' > dk.agent.latest.tar. Quindi è possibile utilizzare docker loado docker importin un host diverso.

  • Ospita il tuo registro privato. - Non aggiornato, vedi commenti Vedi l' immagine del registro della finestra mobile . Abbiamo creato un registro supportato da s3 che puoi avviare e arrestare secondo necessità (tutto lo stato viene mantenuto sul bucket s3 di tua scelta) che è banale da configurare. Questo è anche un modo interessante di vedere cosa succede quando si spinge in un registro

  • Usa un altro registro come quay.io (non l'ho provato personalmente), anche se probabilmente qualsiasi problema tu abbia con l'hub docker si applicherà anche qui.


6
Per riferimento futuro, il collegamento all'immagine del registro della finestra mobile non è aggiornato. Ora dovresti usare Docker Registry 2.0 e il codice su github / docker / distribution
RoelAdriaans,

1
Non sono sicuro che sia chiaro che Registry 2.0 è un sostituto pronto all'uso per quello originale. Sembra mancare alcune funzionalità di base come la ricerca stackoverflow.com/questions/30113726/docker-registry-2-0-api-v2
JoshRivers

1
Domanda su docker save: quando invio un'immagine che deriva da un'altra immagine (diciamo python:2.7) a un registro, l'immagine principale non deve essere caricata più di una volta a meno che non cambi. Posso salvare immagini parziali per ottenere un'ottimizzazione della dimensione del file simile? Sto saltando attraverso questi cerchi perché sono un hobbyista con più immagini e non voglio pagare per un registro privato.
Pieter,

4
Non potresti semplicemente estrarre i file src da un repository git, incluso un Dockerfile, e docker buildsull'host?
jshxe,

1
@Jishaxe parte della mia build è npm install... Non riesco a costruire sul mio host perché ha pochissima memoria e questo passaggio fallisce sempre (vedi: github.com/npm/npm/issues/5021 )
Soft Bullets

46

Sulla base di questo blog , si potrebbe condividere un'immagine docker senza un registro docker eseguendo:

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

Una volta completato questo comando, è possibile copiare l'immagine su un server e importarla come segue:

docker load --input latestversion-1.0.0.tar

18

L'invio di un'immagine docker a un server remoto può essere eseguito in 3 semplici passaggi:

  1. A livello locale, salva l'immagine docker come .tar :
docker save -o <path for created tar file> <image name>
  1. A livello locale, utilizzare scp per trasferire .tar sul telecomando

  2. Sul server remoto, carica l'immagine nella finestra mobile:

docker load -i <path to docker image tar file>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.