2015-07-22 13 views
8

TL; DR Grundsätzlich bin ich für diese Suche:Docker Bild Push über SSH (verteilt)

docker push myimage ssh://myvps01.vpsprovider.net/ 

ich versagt die Gründe für ganze Docker Hub/Registry Sache zu erreichen. Ich weiß, dass ich eine private Registrierung ausführen kann, aber dafür muss ich die Infrastruktur einrichten, um tatsächlich einen Server zu betreiben.

Ich habe einen kleinen Einblick in die Funktionsweise von Docker (zumindest das Dateisystem) genommen, und es sieht so aus, als wären Docker Bildebenen mehr oder weniger Tarballs mit einigen aufwendigen Dateibenennungen. Ich denke naiv, dass es nicht unmöglich wäre, ein einfaches Python-Skript zu erstellen, um Push/Pull zu verteilen, aber natürlich habe ich es nicht versucht, deshalb stelle ich diese Frage.

Gibt es irgendwelche technischen Gründe, warum Docker nicht einfach verteilen (server-less) push/pull, wie Git oder Mercurial?

Ich denke, das wäre eine enorme Hilfe, da ich einfach die Bilder, die ich auf meinem Laptop erstellt habe, direkt auf die App-Server schieben kann, anstatt zuerst auf einen Repo-Server zu drücken und dann von den App-Servern zu ziehen. Oder habe ich gerade das Konzept missverstanden und das Registry ist ein wirklich essentielles Feature, das ich unbedingt brauche?

EDIT Einige Kontext, der hoffentlich erklärt, warum ich das wollen, sollten Sie das folgende Szenario:

  • Entwicklung, auf meinem Laptop (OSX getan Testen, laufen Docker Maschine, mit Docker-komponieren für Dienstleistungen zu definieren und Abhängigkeiten)
  • Deploy zu einer Live-Umgebung mit Hilfe eines Skripts (selbstgeschriebene, bash, wenig Abhängigkeiten von dev-Maschine, im Grunde nur Docker Maschine)
  • Implementierung auf einen neuen VPS mit sehr wenigen Abhängigkeiten außer SSH-Zugriff und Docker Daemon.
  • keine „permanente“ Dienste überall läuft, dh speziell wollen keinen permanent laufenden Registry Host I (vor allem nicht für alle zugänglich sind die VPS-Instanzen, obwohl das wahrscheinlich mit einigen cleveren SSH-Tunneling gelöst werden könnte)

Die derzeit beste Lösung besteht darin, den Docker-Computer zu verwenden, um auf den VPS-Server zu verweisen und ihn neu zu erstellen, aber die Bereitstellung verlangsamt sich, da ich den Container jedes Mal aus der Quelle erstellen muss.

Antwort

13

Wenn Sie Andockbilder an einen bestimmten Host senden möchten, gibt es bereits alles in Docker, um dies zu ermöglichen. Das folgende Beispiel zeigt, wie ein Docker Bild durch ssh drücken:

docker save <my_image> | ssh -C [email protected] docker load 
  • docker save wird ein tar-Archiv von einem Ihrer Docker Bilder (einschließlich der Schichten) produzieren
  • -C ist für ssh die Daten zu komprimieren
  • Strom
  • docker load schafft ein docker Bild aus einem tar-Archiv

Beachten Sie, dass die Kombination eines Docker-Registrierungseintrags + docker pull den Vorteil hat, dass nur fehlende Layer heruntergeladen werden.Wenn Sie also ein Docker-Image häufig aktualisieren (neue Layer hinzufügen oder einige letzte Layer ändern), würde der Befehl docker pull weniger Netzwerkverkehr erzeugen als das Schieben kompletter Docker-Images über ssh.

+5

Ich weiß, über Last zugreifen möchte und speichern, aber der ganze Punkt wäre nur die Schichten klug zu sein und Schieben/Ziehen, die sich unterscheiden. – Krumelur

3

Das Speichern/Laden eines Image auf einem Docker-Host und das Verschieben in eine Registry (privat oder Hub) sind zwei verschiedene Dinge.

Die ehemalige @Thomasleveil hat bereits angesprochen.

Letzteres tatsächlich hat haben die "Smarts", nur erforderliche Schichten zu schieben.

Sie können dies leicht selbst mit einer privaten Registrierung und ein paar abgeleiteten Bildern testen.

Wenn wir zwei Bilder und eine von der anderen abgeleitet, dann tun:

docker tag baseimage myregistry:5000/baseimage 
docker push myregistry:5000/baseimage 

alle Schichten schieben, die nicht bereits in der Registrierung gefunden werden. Wenn Sie jedoch dann das abgeleitete Bild schieben nächstes:

docker tag derivedimage myregistry:5000/derivedimage 
docker push myregistry:5000/derivedimage 

Sie vielleicht bemerkt, dass nur eine einzige Schicht gedrückt wird - vorausgesetzt, Ihr Dockerfile wurde so gebaut, dass es nur eine Schicht erforderlich (zB Verkettung von RUN Parametern, wie pro Dockerfile Best Practises).

Auf Ihrem Docker-Host können Sie auch eine private Dockerized-Registrierung ausführen.

Siehe Containerized Docker registry

Nach bestem Wissen und Gewissen und ab dem Zeitpunkt der Abfassung dieses, die Registrierung Push/Pull/Abfrage-Mechanismus nicht SSH nicht unterstützt, sondern nur HTTP/HTTPS. Das ist nicht wie Git und Freunde.

Siehe Insecure Registry, wie eine private Registrierung über HTTP laufen, vor allem bewusst sein, dass Sie die Optionen Docker Motor wechseln müssen und neu starten:

Öffnen Sie die Datei/etc/default/Docker Datei oder/etc/sysconfig/docker für Bearbeitung.

Je nach Betriebssystem starten die Engine Daemon-Optionen.

Bearbeiten (oder hinzufügen) Sie die DOCKER_OPTS-Zeile und fügen Sie die --insecure-Registrierung Flag hinzu.

Dieses Flag übernimmt beispielsweise die URL Ihrer Registrierung.

DOCKER_OPTS = "- unsicher-Registry myregistrydomain.com:5000"

schließen und die Konfigurationsdatei speichern.

Starten Sie Ihren Docker Daemon

Sie werden auch Unterricht selbstsignierte Zertifikate zu bedienen, so dass Sie die Verwendung von HTTPS.

Verwendung von selbstsignierten Zertifikaten

[...] 

Dies ist sicherer als die unsichere Registry-Lösung. Sie müssen jeden Docker-Daemon konfigurieren, dass Ihre Registrierung

Generate your own certificate: 

mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt 

Be sure to use the name myregistrydomain.com as a CN. 

Use the result to start your registry with TLS enabled 

Instruct every docker daemon to trust that certificate. 

This is done by copying the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt. 

Don’t forget to restart the Engine daemon. 
+1

Vielen Dank für die detaillierte Erklärung. Ich habe meine Frage mit einem Zusammenhang aktualisiert, was ich zu erreichen versuche. Im Prinzip bin ich damit einverstanden, die Docker-Engine selbst auszuführen, und ich möchte eine Registry hosten, die auf die Docker-Installation meiner Dev-Maschine zeigt, die über die SSH-Verbindung bedient wird, die ich bereits verwende. Mir ist klar, dass dies derzeit wahrscheinlich nicht möglich ist, was bedeutet, dass Ihre Antwort wahrscheinlich die akzeptable ist. – Krumelur

+0

Ah, ich verstehe. Ich werde meiner Antwort weitere Informationen hinzufügen und feststellen, dass nach meinem derzeitigen Verständnis SSH für (private) Registrys keine Option ist. Abgesehen von einem bizarren SSH-Tunnelszenario. – Marakai

+0

Ein zusätzlicher Punkt zu Ihren Bearbeitungen: etwas von dem, was Sie anstreben, lehnt sich stark an Orchestrierung und CI/CD an. Plattformen wie Bamboo oder Jenkins sind dazu in der Lage, dies mit Docker zu tun, aber da ich diese Optionen immer noch selbst lerne und auswerte, werde ich das nicht in meine Antwort aufnehmen, da ich denke, dass es nicht definitiv sein würde. – Marakai