498 Stimmen

Exponieren eines Ports auf einem laufenden Docker-Container

Ich versuche, einen Docker-Container zu erstellen, der sich wie eine vollwertige virtuelle Maschine verhält. Ich weiß, dass ich die EXPOSE-Anweisung innerhalb eines Dockerfile verwenden kann, um einen Port freizugeben, und ich kann die -p Flagge mit docker run verwenden, um Ports zuzuweisen, aber sobald ein Container tatsächlich läuft, gibt es dann einen Befehl, um zusätzliche Ports live zu öffnen/zuzuweisen?

Zum Beispiel, sagen wir ich habe einen Docker-Container, der sshd ausführt. Jemand anderes, der den Container verwendet, loggt sich per SSH ein und installiert httpd. Gibt es eine Möglichkeit, Port 80 auf dem Container freizugeben und auf Port 8080 auf dem Host zu mappen, so dass die Leute den im Container laufenden Webserver besuchen können, ohne ihn neu zu starten?

3voto

Konrad Talik Punkte 912

Wenn keine Antwort für jemanden funktioniert - überprüfen Sie, ob Ihr Zielcontainer bereits im Docker-Netzwerk ausgeführt wird:

CONTAINER=my-target-container
docker inspect $CONTAINER | grep NetworkMode
        "NetworkMode": "my-network-name",

Speichern Sie es für später in der Variable $NET_NAME:

NET_NAME=$(docker inspect --format '{{.HostConfig.NetworkMode}}' $CONTAINER)

Wenn ja, sollten Sie den Proxy-Container im selben Netzwerk ausführen.

Suchen Sie als nächstes den Alias für den Container:

docker inspect $CONTAINER | grep -A2 Aliases
                "Aliases": [
                    "my-alias",
                    "23ea4ea42e34a"

Speichern Sie es für später in der Variable $ALIAS:

ALIAS=$(docker inspect --format '{{index .NetworkSettings.Networks "'$NET_NAME'" "Aliases" 0}}' $CONTAINER)

Führen Sie jetzt socat in einem Container im Netzwerk $NET_NAME aus, um eine Verbindung zum exportierten (aber nicht veröffentlichten) Port des $ALIASed-Containers herzustellen:

docker run \
    --detach --name my-new-proxy \
    --net $NET_NAME \
    --publish 8080:1234 \
    alpine/socat TCP-LISTEN:1234,fork TCP-CONNECT:$ALIAS:80

3voto

Ijaz Ahmad Punkte 9810

Hier sind einige Lösungen:

https://forums.docker.com/t/how-to-expose-port-on-running-container/3252/12

Die Lösung zum Zuordnen von Ports beim Ausführen des Containers.

docker run -d --net=host myvnc

das wird den Port automatisch auf Ihren Host freigeben und zuordnen

2voto

fons Punkte 4537

Sie können ein Overlay-Netzwerk wie Weave Net verwenden, das jedem Container eine eindeutige IP-Adresse zuweist und implizit alle Ports für jeden Container im Netzwerk freigibt.

Weave bietet auch Host-Netzwerkintegration. Es ist standardmäßig deaktiviert, aber wenn Sie auch auf die Container-IP-Adressen (und alle Ports) vom Host aus zugreifen wollen, können Sie einfach weave expose ausführen.

Vollständige Offenlegung: Ich arbeite bei Weaveworks.

1voto

Matt Punkte 58469

Es ist nicht möglich, Live-Port-Mapping durchzuführen, aber es gibt mehrere Möglichkeiten, wie Sie einem Docker-Container eine Schnittstelle geben können, die praktisch einer echten Schnittstelle entspricht, wie sie eine virtuelle Maschine haben würde.

Macvlan-Schnittstellen

Docker enthält jetzt einen Macvlan-Netzwerktreiber. Dieser verbindet ein Docker-Netzwerk mit einer "realen" Schnittstelle und ermöglicht es Ihnen, die Adressen dieses Netzwerks direkt dem Container zuzuweisen (ähnlich wie im Bridged-Modus virtueller Maschinen).

docker network create \
    -d macvlan \
    --subnet=172.16.86.0/24 \
    --gateway=172.16.86.1  \
    -o parent=eth0 pub_net

pipework kann auch eine reale Schnittstelle in einen Container einbinden oder in älteren Versionen von Docker eine Sub-Schnittstelle einrichten.

IP-Routing

Wenn Sie die Kontrolle über das Netzwerk haben, können Sie zusätzliche Netzwerke zu Ihrem Docker-Host routen, um sie in den Containern zu nutzen.

Dann weisen Sie diesem Netzwerk die Container zu und richten Ihren Docker-Host so ein, dass er die Pakete über das Docker-Netzwerk routet.

Gemeinsame Host-Schnittstelle

Die Option --net host ermöglicht es, die Host-Schnittstelle in einen Container zu teilen, aber dies ist wahrscheinlich keine gute Einrichtung für den Betrieb mehrerer Container auf einem Host aufgrund der gemeinsamen Natur.

1voto

ice.nicer Punkte 1364

Lies zuerst Ricardos Antwort. Das hat bei mir funktioniert.

Es gibt jedoch ein Szenario, in dem dies nicht funktioniert, wenn der laufende Container mit Docker-Compose gestartet wurde. Dies liegt daran, dass Docker-Compose (ich führe Docker 1.17 aus) ein neues Netzwerk erstellt. Die Lösung für dieses Szenario wäre

docker network ls

Dann füge Folgendes hinzu

docker run -d --name sqlplus --link db:db -p 1521:1521 sqlplus --net Netzwerkname

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X