2017-02-14 10 views
0

Ich habe ein Image, das ich verwende, um meine CI/CD-Builds (mit GitLab CE) auszuführen. Ich möchte meine app tun so etwas implementieren aus dem Behälter:Zugriff auf den Docker-Computer des Hosts aus dem Container

eval "$(docker-machine env manager)" 
sudo docker stack deploy --compose-file docker-stack.yml web 

Aber ich möchte die Docker-Maschine für den Zugriff Maschinen auf dem Host-System definiert, da der Behälter zerstört wird und ich möchte keine Zugriffsdetails in das Bild aufnehmen.

Ich habe ein paar Dinge ausprobiert

Zugriff auf die Remote-Host via docker-machine

  • Erstellen Sie die Docker-Maschine auf dem Host und montieren Sie die MACHINE_STORAGE_PATH so dass es
  • an dem Behälter vorhanden ist
  • Verbinden Sie sich manuell mit dem Remote-Docker-Gerät aus dem Container und stellen Sie MACHINE_STORAGE_PATH auf ein eingehängtes Volume
  • ein Montage der Docker Buchse

In beiden Fällen kann ich sehen, die Maschine Speicher wird beibehalten, aber wenn ich einen neuen Container erstellen und auszuführen sind docker-machine ls keine der Maschinen aufgeführt.

Zugriff auf die Remote-Host via DOCKER_HOST

  • Weiterleiten, um die Remote-Rechner Docker Port an den Host-Docker Port docker-machine ssh manager-1 -N -L 2376:localhost:2376
  • export DOCKER_HOST=:2376
  • Docker Sagen Sie den gleichen certs zu verwenden, die von docker- verwendet werden Maschine: export DOCKER_TLS_VERIFY=1 und export DOCKER_CERT_PATH=/Users/me/.docker/machine/machines/manager-‌​1
  • Test mit docker info

Das gibt mir error during connect: Get https://localhost:2376/v1.26/info: x509: certificate signed by unknown authority

Alle Ideen, wie ich eine Remote-Bereitstellung von in einem Behälter durchführen kann?

Dank

EDIT

Hier eine grafische Darstellung besser zu versuchen und zu helfen, das Szenario zu kommunizieren.

architectur

+0

ich würde 'docker.sock' nicht montieren wie es empfohlen wurde. Siehe diesen Artikel für Informationen https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/ Sie eröffnen ein großes Sicherheitsloch. –

+0

Würden Sie dies als ein großes Risiko betrachten, wenn der einzige Container, der auf dem Socket ausgeführt wird, ein Build-Container ist? – jaredcnance

+0

Normalerweise möchten Sie keinen Container innerhalb eines Containers ausführen. Wenn Sie Zugriff auf Volumes benötigen, sollten Sie stattdessen "--link" oder mit dem "docker> = 1.12" ein Netzwerk-Overlay erstellen. Es ist nichts falsch daran, einen Container zu verwenden, um andere Container zu starten. Sie müssen nur auf dem Hostcomputer und nicht innerhalb des Containers gestartet werden. Containern in Containern zu tun ist ein Anti-Pattern, das Sie im Laufe der Zeit nur schwer verwalten können. –

Antwort

-1

Im Fall, dass Sie von Ihrem CI Behälter mit dem Docker Host kommunizieren Sie einfach die Docker-Sockel kann, wenn der Behälter CI Start:

docker run -v /var/run/docker.sock:/var/run/docker.sock <gitlab-image> 

Jetzt laufen Sie können Docker-Befehle auf der Host aus dem CI-Container.

+0

Ja - also mache ich das schon. Ich kann Dinge wie 'docker build' und' docker login' machen, aber wenn ich wirklich auf einem entfernten Rechner bereitstellen möchte, zeigt 'docker-machine ls' keine Maschinen an. Das Ausführen von "docker-machine ls" auf dem Host zeigt jedoch mehrere Maschinen an. Gibt es einen Sockel, der für die Docker-Maschine montiert werden muss? – jaredcnance

+0

Dies sollte nicht empfohlen werden. Die Installation der 'docker.sock' ist ein Sicherheitsproblem. https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/ Es gibt eine Menge Artikel darüber, wenn Sie Docker in der Produktion verwenden, wird dies nicht empfohlen. –

0

Verwenden Sie keine Docker-Maschine dafür.

Docker-Maschine speichert Dateien in $ HOME /.docker/machine. Wenn Sie also mit einer neuen Kopie dieses Ordners neu starten, werden alle zuvor definierten Maschinen entfernt. Sie können diesen Ordner als Volume speichern, aber es gibt einen viel einfacheren Weg für Ihre Zwecke.

Die Lösung ist das Mounten des Docker-Sockets und entweder als root oder von einem Benutzer mit dem gleichen gid wie der Docker-Socket (beachten Sie, dass Gruppennamen innerhalb und außerhalb des Containers nicht übereinstimmen, also GID ist wichtig), Führen Sie Ihre docker ... Befehle wie üblich aus. Sie können die docker-machine Evaluierung vollständig überspringen, da Sie die Befehle für den lokalen Docker-Socket ausführen. Wenn Sie Befehle remote ausführen müssen, ist es einfacher, die Variablen DOCKER_HOST und DOCKER_TLS_VERIFY manuell zu definieren, anstatt docker-machine zu verwenden.

+0

Also mounte ich bereits den Sockel für Dinge wie das Erstellen von Bildern. Wenn ich einen Tunnel vom Host zum entfernten Rechner aufstelle: 'docker-machine ssh manager-1 -N -L 2376: localhost: 2376' und dann versuche' DOCKER_HOST =: 2376' zu setzen und 'docker info' zu starten I get: Hole http: // localhost: 2376/v1.26/info: fehlerhafte HTTP-Antwort "\ x15 \ x03 \ x01 \ x00 \ x02 \ x02". – jaredcnance

+0

Ich habe dann versucht 'export DOCKER_TLS_VERIFY = 1' und' exportieren DOCKER_CERT_PATH =/Benutzer/me/.docker/machine/machines/manager-1' und jetzt 'docker info' gibt' error connect: Get https: // localhost: 2376/v1.26/info: x509: Zertifikat von unbekannter Behörde signiert " – jaredcnance

+0

Sieht so aus, als ob Sie immer noch versuchen, docker-machine zu verwenden. Es ist auch nicht klar, welche Befehle und Dateien/Verzeichnisse Sie vom Host im Container verwenden. Diese sind per Definition nicht gleich. Weitere Informationen zur Verwendung von Remote - Docker - Sockets finden Sie unter diesem Link: https://docs.docker.com/engine/security/https/ – BMitch

Verwandte Themen