2015-08-24 11 views
44

Da boot2docker veraltet ist, habe ich auf docker-machine gewechselt, aber ich weiß nicht, wie man einen Port von docker-machine öffnet. In boot2docker konnte ich tun, wie folgt:Portweiterleitung in Docker-Maschine?

boot2docker ssh -L 27017:localhost:27017 

Dies würde Port 27017 von VirtualBox weiterleiten 27017 auf localhost, solange die SSH-Verbindung ist offen. Beachten Sie, dass ich nicht nach einer Möglichkeit suche, den Port in VirtualBox dauerhaft zu öffnen. Wie kann ich dies mit docker-machine erreichen?

Antwort

42

können Sie immer noch den VBoxmanage.exe Befehl aus dem von Docker Maschine VirtualBox Zugang:

VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017"; 
  • Verwenden docker-machine info den Namen Ihres vm zu erhalten.
  • Verwenden Sie modifyvm, wenn die VM noch nicht gestartet ist.

Siehe ein praktisches Beispiel in this answer.


, dass die aktuelle Problemumgehung ist, die Möglichkeit Argument docker-machine ssh passieren anhängig: siehe issue 691.

Die andere Lösung wäre es, nicht nach vorn Port und direkt die IP der VM verwenden:

$(docker-machine ip default) 

Wie commented von sdc:

You can confirm that port forwarding is set up correctly with

VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 
+1

Während dies funktioniert, ist es nicht wirklich, was ich erreichen möchte. Ich würde es vorziehen, wenn die Einstellungen nicht dauerhaft gemacht würden (ich habe die Frage aktualisiert, um dies zu berücksichtigen). Wenn das nicht funktioniert, bin ich immer noch dankbar für Ihre Antwort. – Johan

+0

@Johan Ich habe die Antwort bearbeitet, um zu erklären, warum ich VM-Port-Weiterleitung anstelle von SSH vorgeschlagen habe. – VonC

+0

Großartig !! Danke vielmals. – Johan

17

Sie kann ssh in die Maschine und das normale por weitergeben t Forwarding Argumente:

ssh [email protected]$(docker-machine ip default) -L 27017:localhost:27017 

Das Passwort des Benutzers Docker ist tcuser. (siehe https://github.com/boot2docker/boot2docker)

+7

Danke, sehr hilfreich. Übrigens wird dies auf den meisten Systemen nur dazu führen, dass der Port 27017 an den lokalen Loopback-Adapter gebunden wird, was bedeutet, dass von außerhalb des Hosts nicht darauf zugegriffen werden kann. Verwenden Sie 'ssh docker @ $ (docker-machine ip default) -L 1.2.3.4: 27017: localhost: 27017', um es der Außenwelt zugänglich zu machen, wobei 1.2.3.4 die lokale IP-Adresse ist. –

+0

Ist es möglich, mehrere Ports mit docker-machine ssh weiterzuleiten? z.B. -L 27017: localhost: 27017 -L 3000: localhost: 3000 – majorBummer

3

Wenn Sie nicht möchten, dass Kennwörter verwendet werden, würde ich hinzufügen, dass Sie nur auf den privaten Schlüssel zeigen.

ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa [email protected]$(docker-machine ip default) 
21

Mit neueren Versionen von Maschine, können Sie einfach tun (wo Standard der Name der Maschine ist):

docker-machine ssh default -L 27017:localhost:27017 

Dies ist eine vorübergehende Lösung als die VM-Konfiguration ändern.

Verwenden Sie die folgende Variante nur vorwärts Ports in einem Hintergrundprozess:

docker-machine ssh default -f -N -L 27017:localhost:27017 
  • -f Requests ssh in den Hintergrund gehen kurz vor der Befehlsausführung.
  • N zulassen leeren Befehl (hier nützliche Ports nur weiterleiten)
+2

versucht "docker-machine ssh default -N -L 80: localhost: 80' auszuführen und habe folgenden Fehler:' Privilegierte Ports können nur von root weitergeleitet werden. exit status 255' – noonehos

+1

auch wenn ich versuche, 'sudo docker-machine ssh default -N -L 80: localhost: 80' Ich habe eine andere Nachricht 'Maschine existiert nicht' – noonehos

+0

@noonehos wie ich in meiner Antwort sagen, Standard ist ein Name einer Maschine. Finden Sie Ihren, indem Sie docker-machine ls eingeben. – David

1

Just in Skript die Antwort von @VonC zu verbessern - zur Zeit Docker Toolbox auf MacOS X bei Verwendung der Standard-VM-Maschine ist " Standard". So ein Skript zur Karte des aus dem Behälter ausgesetzt alle aussehen soll:

for port in `docker port cassandra | cut -d'-' -f1`; 
do 
    port_num=`echo ${port} | cut -d'/' -f1` 
    port_type=`echo ${port} | cut -d'/' -f2` 
    echo "Create rule natpf1 for ${port_type} port ${port_num}" 
    VBoxManage controlvm "default" natpf1 "${port_type}-port${port_num},${port_type},,${port_num},,${port_num}" 
done 

wenn Sie versuchen, mehrere Male ausführen, sollte eine Aussage vor der Schöpfung zum Löschen der bestehenden Regel hinzugefügt werden:

VBoxManage controlvm "default" natpf1 delete "${port_type}-port${port_num}" 

In Das Skript geht davon aus, dass Sie die Ports bereits vom Container an VM weitergeleitet haben.

docker port cassandra 

gibt eine Ausgabe wie:

7000/tcp -> 0.0.0.0:7000 
+0

Hinweis: das Skript setzt voraus, dass der Name des ausgeführten Containers "Cassandra" lautet - in der for-Schleife. (Hafen Hafen Cassandra) – npenkov

7

Da ich harte Zeit erinnern, wie dies zu tun, habe ich eine kleine Bash-Skript erstellt habe pf genannt (was für „forward-Port“ steht), das Sie erlaubt zu tun: Port 8080 im Hintergrund

$ pf 8080 

Dies wird die docker Port 8080 weiterleiten Host (anhängen -f, um es in den Vordergrund laufen zu lassen). Gehen Sie einen anderen Host-Port benutzen Sie einfach:

$ pf 8090:8080 

, die den Host-Port-Karten 8090 bis 8080.

Um die Portweiterleitung hinzufügen -s stoppen:

$ pf 8090:8080 -s 

(eigentlich Host-Port ist genug auch: pf 8090 -s). Es gibt auch andere Optionen, so überprüfen Sie die github Seite.

+1

Liebe das, funktioniert super. – kennyg