Wie kann ich mein Docker-Image ohne Verwendung des Docker-Hub freigeben?

257

Ich frage mich, wo genau die Bilder von Docker auf meinem lokalen Host-Computer gespeichert sind. Kann ich mein Docker-Image freigeben, ohne das Docker-Huboder ein Dockerfile"echtes" Docker-Image zu verwenden? Und was passiert genau, wenn ich mein Docker-Image auf Docker-Hub 'schiebe'?

yaquawa
quelle
2
Zum späteren Nachschlagen: ein guter Artikel über das Bewegen von Docker-Bildern
Mifeet

Antworten:

243

Docker-Images werden als Dateisystemebenen gespeichert. Jeder Befehl in der Docker-Datei erstellt eine Ebene. Sie können Ebenen auch über docker commitdie Befehlszeile erstellen , nachdem Sie einige Änderungen vorgenommen haben (über docker runwahrscheinlich).

Diese Ebenen werden standardmäßig unter gespeichert /var/lib/docker. Während Sie (theoretisch) Dateien von dort auswählen und auf einem anderen Docker-Server installieren könnten, ist es wahrscheinlich eine schlechte Idee, mit der von Docker verwendeten internen Darstellung zu spielen.

Wenn Sie Ihr Image verschieben, werden diese Ebenen an die Registrierung gesendet (standardmäßig die Docker-Hub-Registrierung ... es sei denn, Sie kennzeichnen Ihr Image mit einem anderen Registrierungspräfix) und dort gespeichert. Beim Pushing wird anhand der Layer-ID überprüft, ob der Layer bereits lokal vorhanden ist oder heruntergeladen werden muss. Sie können docker historydamit einen Blick darauf werfen, welche Ebenen (andere Bilder) verwendet werden (und in gewissem Umfang mit welchem ​​Befehl die Ebene erstellt wurde).

Die besten Optionen für die Freigabe eines Images, ohne auf die Docker-Hub-Registrierung zuzugreifen, sind:

  • docker saveein Bild oder docker exportein Container. Dadurch wird eine TAR-Datei in der Standardausgabe ausgegeben, sodass Sie so etwas tun möchten docker save 'dockerizeit/agent' > dk.agent.latest.tar. Dann können Sie docker loadoder docker importin einem anderen Host verwenden.

  • Hosten Sie Ihre eigene private Registrierung. - Veraltet, siehe Kommentare. Siehe Docker-Registrierungsbild . Wir haben eine s3-gestützte Registrierung erstellt, die Sie nach Bedarf starten und stoppen können (der gesamte Status wird im s3-Bucket Ihrer Wahl gespeichert), was für die Einrichtung trivial ist. Dies ist auch eine interessante Methode, um zu beobachten, was passiert, wenn auf eine Registrierung übertragen wird

  • Verwenden Sie eine andere Registrierung wie quay.io (ich habe es nicht persönlich ausprobiert), obwohl alle Bedenken, die Sie bezüglich des Docker-Hubs haben, wahrscheinlich auch hier zutreffen werden.

Abel Muiño
quelle
6
Zum späteren Nachschlagen ist der Link zum Docker-Registrierungsimage veraltet. Sie sollten jetzt Docker Registry 2.0 und den Code auf Github / Docker / Distribution
RoelAdriaans
1
Ich bin nicht sicher, ob es klar ist, dass Registry 2.0 ein gebrauchsfertiger Ersatz für das Original ist. Es scheint einige grundlegende Funktionen wie die Suche stackoverflow.com/questions/30113726/docker-registry-2-0-api-v2
JoshRivers
1
Frage zu docker save: Wenn ich ein Bild, das von einem anderen Bild stammt (sagen wir python:2.7), in eine Registrierung schiebe , muss das übergeordnete Bild nicht mehr als einmal hochgeladen werden, es sei denn, es ändert sich. Kann ich Teilbilder speichern, um eine ähnliche Optimierung der Dateigröße zu erzielen? Ich springe durch diese Reifen, weil ich ein Hobbyist mit mehreren Bildern bin und nicht für eine private Registrierung bezahlen möchte.
Pieter
4
Könnten Sie nicht einfach src-Dateien von einem Git-Repo, einschließlich einer Docker-Datei, docker buildauf dem Host abrufen ?
Jshxe
1
@Jishaxe Teil meines Builds ist npm install... Ich kann nicht auf meinem Host bauen, da er sehr wenig Speicher hat und dieser Schritt immer fehlschlägt (siehe: github.com/npm/npm/issues/5021 )
Soft Bullets
46

Basierend auf diesem Blog könnte man ein Docker-Image ohne Docker-Registrierung freigeben, indem man Folgendes ausführt:

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

Sobald dieser Befehl ausgeführt wurde, kann das Image auf einen Server kopiert und wie folgt importiert werden:

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

Das Senden eines Docker-Images an einen Remote-Server kann in drei einfachen Schritten erfolgen:

  1. Speichern Sie das Docker-Image lokal als .tar :
docker save -o <path for created tar file> <image name>
  1. Auf lokaler Ebene Verwendung scp zu übertragen TAR zu Fern

  2. Laden Sie auf dem Remote-Server das Image in das Docker:

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