Kurze Antwort:
EXPOSE
ist eine Möglichkeit, zu dokumentieren
--publish
(oder -p
) ist eine Möglichkeit, einen Host-Port auf einen laufenden Container-Port zuzuweisen
Beachten Sie unten, dass:
EXPOSE
im Zusammenhang mit Dockerfiles
steht ( dokumentieren )
--publish
steht im Zusammenhang mit docker run ...
( Ausführung / Laufzeit )
Ports freigeben und veröffentlichen
In der Docker-Netzwerkkonfiguration gibt es zwei verschiedene Mechanismen, die direkt Netzwerkports betreffen: Ports freigeben und veröffentlichen. Dies gilt für das Standard-Brücken-Netzwerk und benutzerdefinierte Brücken-Netzwerke.
-
Sie geben Ports mit dem Schlüsselwort EXPOSE
in der Docker-Datei oder dem Flag --expose
bei docker run frei. Das Freigeben von Ports ist eine Möglichkeit, zu dokumentieren, welche Ports verwendet werden, öffnet oder weist jedoch keine Ports tatsächlich zu. Das Freigeben von Ports ist optional.
-
Sie veröffentlichen Ports mit dem Flag --publish
oder --publish-all
bei docker run
. Dies teilt Docker mit, welche Ports auf der Netzwerkschnittstelle des Containers geöffnet werden sollen. Wenn ein Port veröffentlicht wird, wird er auf einem verfügbaren Hochordnungsport (höher als 30000
) auf dem Host-Rechner abgebildet, es sei denn, Sie geben den Port an, auf den er zur Laufzeit auf dem Host-Rechner abgebildet werden soll. Sie können den Port, auf den er zur Laufzeit auf dem Host-Rechner abgebildet werden soll, nicht angeben, wenn Sie das Image erstellen (in der Docker-Datei), da es keine Möglichkeit gibt, sicherzustellen, dass der Port auf dem Host-Rechner verfügbar ist, auf dem Sie das Image ausführen.
aus: Docker-Container-Netzwerk
Update Oktober 2019: Der obige Text ist nicht mehr in den Dokumenten enthalten, aber eine archivierte Version ist hier zu finden: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
Vermutlich ist die aktuelle Dokumentation die folgende:
Veröffentlichte Ports
Standardmäßig werden bei der Erstellung eines Containers keine Ports nach außen freigegeben. Um einen Port für Dienste außerhalb von Docker oder für Docker-Container verfügbar zu machen, die nicht mit dem Netzwerk des Containers verbunden sind, verwenden Sie das Flag --publish
oder -p
. Dies erstellt eine Firewall-Regel, die einen Containerport auf einem Port des Docker-Hosts abbildet.
und kann hier gefunden werden: docs.docker.com/config/containers/container-networking/#published-ports
Außerdem,
EXPOSE
...Die Anweisung EXPOSE
veröffentlicht den Port nicht tatsächlich. Es fungiert als eine Art Dokumentation zwischen der Person, die das Image erstellt, und der Person, die den Container ausführt, über welche Ports veröffentlicht werden sollen.
aus: Dockerfile-Referenz
Dienstzugriff, wenn EXPOSE
/ --publish
nicht definiert sind:
In der Antwort von @Golo Roden wird angegeben, dass:
"Wenn Sie keine davon spezifizieren, ist der Service im Container nur aus diesem selbst heraus erreichbar."
Vielleicht war das zum Zeitpunkt der Antwort der Fall, aber jetzt scheint es, dass auch wenn Sie EXPOSE
oder --publish
nicht verwenden, der Host
und andere Container
im selben Netzwerk auf einen Dienst zugreifen können, den Sie möglicherweise in diesem Container starten.
So testen Sie dies:
Ich habe das folgende Dockerfile
verwendet. Grundsätzlich starte ich mit Ubuntu und installiere einen kleinen Webserver:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Ich baue
das Image als "testexpose" und führe
einen neuen Container mit dem folgenden Befehl aus:
docker run --rm -it testexpose bash
Im Container starte ich ein paar Instanzen von mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Ist dann in der Lage, mit curl
vom Host oder anderen Containern abzurufen, um die Startseite von mini-httpd
abzurufen.
Weiterführende Informationen
Sehr detaillierte Artikel zum Thema von Ivan Pepelnjak: