2016-06-27 13 views
0

Ich verwende Docker für Windows (mit Hyper-V, nicht mit Docker Toolkit für Windows). Was ich erreichen möchte, ist es, 3+ Docker-Container mit den gleichen verfügbaren Ports zu drehen.Docker für Windows: Mehrere Docker-Container lokal mit denselben Port-Nummern drehen

Nachdem ich den ersten Docker Container erstellt habe, habe ich http://docker:8091 (oder http://10.0.75.2:8091) zur Verfügung, und das ist in Ordnung. Nun möchte ich einen anderen Container mit der gleichen verfügbaren Portnummer hochfahren. So etwas wie http://docker2:8091 oder http://10.0.75.3:8091). Und dann noch eins bei docker3 oder * .4: 8091.

(Beachten Sie, dass es ein Kinderspiel ist, drei Container mit exponierten Ports hochzufahren, die einem anderen zufälligen Port zugewiesen wurden, aber ich möchte die Portnummern beibehalten).

Ich habe versucht, einen Netzwerkadapter zu MobyLinuxVM über Hyper-V-Manager hinzuzufügen, aber das scheint Docker zu brechen, und ich muss neu installieren, um es wieder zu arbeiten.

Ich habe versucht, eine andere Hyper-V-Instanz mit docker-machine (docker-machine create -d hyperv --hyperv-virtual-switdch DockerNAT AnotherBox) zu drehen, aber das stört nur etwa die Hälfte und funktioniert nicht. (Basierend auf dem, was ich in den Foren lese, ist die Absicht mit Docker-Maschine auf Docker für Windows nicht für mich in der Lage, dies trotzdem zu tun, es ist nur für die Verwaltung von VMs in der Cloud).

Also ... gibt es eine Möglichkeit zu erreichen, was ich versuche zu tun?

+1

Sie versuchen, mehrere Container auf demselben Host-System Anschluss zuzuordnen? Für tcp ist das nicht möglich, http://stackoverflow.com/a/1694148/740175 –

+1

Was versuchst du damit zu tun? Wenn Sie einen Cluster für die Service-Replikation zusammenstellen möchten, sollten Sie nach Docker Swarm suchen. –

+1

Das ist so, als wollten Sie 3 Webserver auf Port 8091 betreiben. Docker macht Container-Ports für den Host-Computer verfügbar. Sie können die gleichen Ports innerhalb von Containern haben, aber wenn Sie sie offen legen, müssen sie unterschiedlich sein, um Konflikte zu vermeiden. – stacksonstacks

Antwort

1

Um den Port zu veröffentlichen, verwendet Docker die binäre Docker-Proxy in den Behälter zu übermitteln, effektiv wie:

docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8091 -container-ip 172.17.0.2 -container-port 8091 

Offensichtlich bindet es an allen Schnittstellen in diesem Beispiel, aber ich nehme an, es wäre möglich, an bestimmte Schnittstellen zu binden.

Angenommen, Sie 3 Schnittstellen auf Ihrem Rechner haben, und den entsprechenden DNS-Eintrag, es aught möglich zu sein, es zu tun:

docker-proxy -proto tcp -host-ip 10.0.75.2 -host-port 8091 -container-ip 172.17.0.2 -container-port 8091 
docker-proxy -proto tcp -host-ip 10.0.75.3 -host-port 8091 -container-ip 172.17.0.3 -container-port 8091 
docker-proxy -proto tcp -host-ip 10.0.75.4 -host-port 8091 -container-ip 172.17.0.4 -container-port 8091 
+0

In diesem Szenario brauche ich mehrere Host-Schnittstellen (z. B. mehrere LAN-Karten oder was auch immer)? –

+0

Ja, ich dachte, du hättest das in deiner Frage angedeutet, wenn du zwei separate IPs angegeben hättest. Nur mehrere Schnittstellen, nicht unbedingt mehrere LAN-Karten. –

1

Ja, es gibt einen Weg, mit einem Reverse-Proxy. Sie können Nginx oder HAProxy in einem Container oder viel einfacher verwenden. Sie können ein Nginx-Image verwenden, das sich automatisch neu konfiguriert, um die Proxy-Container umzukehren: https://hub.docker.com/r/jwilder/nginx-proxy/.

+0

Sieht vielversprechend aus, kann es aber nicht zum Laufen bringen. Ich habe versucht: docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy und dann docker laufen -e VIRTUAL_HOST = cb1.localhost -e VIRTUAL_PORT = 8091 -p 8091: 8091 -d --name cb1 couchbase. Wenn ich cb1.localhost: 8091 in einem Browser aufrufe, bekomme ich 404 (Ich habe meine Windows-Host-Datei so geändert, dass cb1.localhost auf 10.0.75 verweist.2, und ich habe auch versucht, 127.0.0.1) –

+1

Ihre couchbase ist nicht proxifiziert, weil es auf den 8091 Port des Hosts mappt. Sie müssen 8091 auf dem Proxy öffentlich zuordnen ('docker run -d -p 80:80 -p 8091: 8091 -v ...') und nur 8091 auf dem Couchbase-Container verfügbar machen ('docker run -e VIRTUAL_HOST = cb1.localhost -e VIRTUAL_PORT = 8091 --expose = 8091'). Es sollte so funktionieren. – Shanoor

+0

habe es, scheint gut zu funktionieren, danke für Ihre Hilfe. Weißt du, ob ich mehrere virtuelle Ports zuordnen kann und wenn ja, wie? –