Ich experimentiere mit Dockerfiles, und ich glaube, ich verstehe die meisten Logik. Ich sehe jedoch in diesem Zusammenhang nicht den Unterschied zwischen "Exposure" und "Publizieren" eines Ports.
Alle Tutorials, die ich zuerst gesehen habe, enthalten den Befehl EXPOSE
in der Dockerfile:
...
EXPOSE 8080
...
Sie erstellen dann ein Bild aus dieser Docker-Datei:
$ docker build -t an_image - < Dockerfile
Und dann publish den gleichen Port wie oben, wenn das Image ausgeführt wird:
$ docker run -d -p 8080 an_image
oder veröffentlichen Sie alle Ports mit
$ docker run -d -P an_image
Was ist der Punkt, wenn ein Port in der Dockerfile verfügbar gemacht wird, wenn er trotzdem veröffentlicht wird? Wäre es jemals nötig, einen Port freizulegen und nicht später zu veröffentlichen? Eigentlich möchte ich alle Ports angeben, die ich beim Erstellen des Abbilds in der Dockerfile verwenden werde, und mich dann nicht mehr mit ihnen beschäftigen, sondern sie einfach ausführen mit:
$ docker run -d an_image
Ist das möglich?
Grundsätzlich haben Sie drei Möglichkeiten:
EXPOSE
noch -p
angebenEXPOSE
an.EXPOSE
und -p
angeben1) Wenn Sie weder EXPOSE
noch -p
angeben, ist der Dienst im Container nur über inside auf den Container selbst erreichbar.
2) Wenn Sie einen Port EXPOSE
verwenden, ist der Dienst im Container nicht von außerhalb von Docker, sondern von anderen Docker-Containern aus zugänglich. Das ist also gut für die Kommunikation zwischen Containern.
3) Wenn Sie EXPOSE
und -p
einen Port verwenden, ist der Dienst im Container von überall aus erreichbar, auch außerhalb von Docker.
Der Grund, warum beide getrennt sind, ist IMHO, weil:
Die Dokumentation besagt explizit:
Die Anweisung
EXPOSE
macht Ports für die Verwendung in Links verfügbar.
Es zeigt Ihnen auch, wie Sie Container verknüpfen definieren, was im Grunde die Kommunikation zwischen Containern ist, über die ich gesprochen habe.
PS: Wenn Sie -p
und nicht EXPOSE
ausführen, führt Docker eine implizite EXPOSE
aus. Dies liegt daran, dass ein Port, wenn er öffentlich zugänglich ist, automatisch auch für andere Docker-Container geöffnet ist. Daher enthält -p
EXPOSE
. Deshalb habe ich es oben nicht als vierten Fall aufgeführt.
EXPOSE
ist eine Möglichkeit, zu dokumentieren--publish
(oder -p
) ist eine Möglichkeit zum mapping a Hostport zu einem laufenden ContainerportBeachten Sie darunter:
EXPOSE
steht in Beziehung zu Dockerfiles
(documenting)--publish
steht in Beziehung zu docker run ...
(execution/run-time)Anzeigen und Veröffentlichen von Ports
In Docker-Netzwerken gibt es zwei verschiedene Mechanismen, die direkt Netzwerk-Ports betreffen: Offenlegen und Veröffentlichen von Ports. Dies gilt für das Standard-Bridge-Netzwerk und für benutzerdefinierte Bridge-Netzwerke.
Sie machen Ports mit dem Schlüsselwort
EXPOSE
in der Dockerfile oder dem Flag--expose
für die Dockerausführung verfügbar. Das Freigeben von Ports ist eine Möglichkeit, zu dokumentieren, welche Ports verwendet werden, aber es werden keine Ports zugeordnet oder geöffnet. Das Freigeben von Ports ist optional.Sie veröffentlichen Ports mit dem Flag
--publish
oder--publish-all
zudocker run
. Dies teilt Docker mit, welche Ports auf der Netzwerkschnittstelle des Containers geöffnet werden. Wenn ein Port veröffentlicht wird, wird er einem verfügbaren Port höherer Ordnung (höher als30000
) auf dem Host-Computer zugeordnet, es sei denn, Sie geben den Port an, der zur Laufzeit auf dem Host-Computer zugeordnet werden soll. Sie können beim Erstellen des Images (in der Dockerfile) nicht den Port angeben, dem der Host-Computer zugeordnet werden soll, da nicht garantiert werden kann, dass der Port auf dem Host-Computer verfügbar ist, auf dem Sie das Image ausführen.
Ebenfalls,
ENTLARVEN
... Die
EXPOSE
-Anweisung veröffentlicht den Port nicht wirklich. Sie fungiert als eine Art Dokumentation zwischen der Person, die das Image erstellt, und der Person, die den Container ausführt, über die Ports, die veröffentlicht werden sollen.von: Dockerfile-Referenz
EXPOSE
--publish
nicht definiert ist:Bei der Antwort von @Golo Roden heißt es:
"Wenn Sie keine davon angeben, ist _/auf den Dienst im Container nur von innerhalb des Containers selbst zugegriffen."
Vielleicht war dies zu dem Zeitpunkt der Fall, als die Antwort geschrieben wurde, aber jetzt scheint es, dass selbst wenn Sie EXPOSE
oder --publish
nicht verwenden, die Host
und andere containers
desselben Netzwerks auf einen Dienst zugreifen können, den Sie starten können in diesem Behälter.
Ich habe folgende Dockerfile
verwendet. Grundsätzlich beginne ich mit Ubuntu und installiere einen winzigen Webserver:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Ich build
das Bild als "testexpose" und run
einen neuen Container mit:
docker run --rm -it testexpose bash
Innerhalb des Containers starte ich einige Instanzen von mini-httpd
:
[email protected]:/# mini_httpd -p 80
[email protected]:/# mini_httpd -p 8080
[email protected]:/# mini_httpd -p 8090
Ich kann dann curl
vom Host oder anderen Containern verwenden, um die Homepage von mini-httpd
abzurufen.
Mit EXPOSE
können Sie private (Container) und öffentliche (Host) Ports definieren, die zum Zeitpunkt der Image-Erstellung verfügbar gemacht werden sollen, wenn der Container ausgeführt wird .. _ Der öffentliche Port ist optional. Wenn kein öffentlicher Port angegeben wird, wird ein beliebiger Port verwendet auf Host durch Docker ausgewählt werden, um den angegebenen Containerport in Dockerfile anzuzeigen.
Eine gute Praxis ist, keinen öffentlichen Port anzugeben, da nur ein Container pro Host begrenzt wird (ein zweiter Container wirft einen bereits verwendeten Port aus).
Sie können -p
in docker run
verwenden, um zu steuern, an welchen öffentlichen Port die freigelegten Containerports angeschlossen werden können.
Wenn Sie weder EXPOSE
noch -p
verwenden, werden keine Ports verfügbar gemacht.
Wenn Sie -p
immer unter docker run
verwenden, benötigen Sie EXPOSE
nicht. Wenn Sie jedoch EXPOSE
verwenden, ist Ihr docker run
-Befehl möglicherweise einfacher, EXPOSE
kann nützlich sein, wenn Sie nicht wissen, welcher Port auf dem Host verfügbar ist, oder wenn Sie nur sicher sind Ein Container wird geladen.
Sie setzen Ports mit dem Schlüsselwort EXPOSE in der Dockerfile oder mit dem Flag ____-- für die Dockerausführung aus. Durch das Freigeben von Ports können Sie dokumentieren, welche -Ports verwendet werden, jedoch keine Ports zuordnen oder öffnen. Offenlegen von ports ist optional.
Quelle: github commit
Die meisten Leute verwenden Docker-Composition mit Netzwerken. Die Dokumentation besagt:
Die Docker-Netzwerkfunktion unterstützt das Erstellen von Netzwerken, ohne dass Ports innerhalb des Netzwerks verfügbar gemacht werden müssen (detaillierte Informationen finden Sie in der Übersicht dieser Funktion).
Wenn Sie Netzwerke für die Kommunikation zwischen Containern verwenden, müssen Sie sich also keine Sorgen um das Freigeben von Ports machen.
Dockerfile EXPOSE vs Publish
ENTLARVEN
Wenn Sie Ihre Docker-Dateien schreiben, teilt die Anweisung EXPOSE Docker mit, dass der laufende Container bestimmte Netzwerk-Ports überwacht. Dies dient als eine Art Port-Mapping-Dokumentation, die dann beim Veröffentlichen der Ports verwendet werden kann.
ENTLARVEN [/...]
Sie können dies auch in einem Docker-Ausführungsbefehl angeben, z.
docker run --expose = 1234 my_app
EXPOSE lässt jedoch keine Kommunikation über die definierten Ports zu Containern außerhalb desselben Netzwerks oder zur Host-Maschine zu. Um dies zu ermöglichen, müssen Sie die Ports veröffentlichen.
Veröffentliche Ports und ordne sie dem Host zu
Es gibt mehrere Flags, die Sie verwenden können, wenn Sie den Docker-Run-Befehl verwenden, um die Ports eines Containers außerhalb des Netzwerks des Containers zu veröffentlichen und ihnen die Ports der Host-Maschine zuzuordnen. Dies sind die Flags -p und -P. Sie unterscheiden sich darin, ob Sie einen oder alle Ports veröffentlichen möchten.
Um den Port beim Ausführen des Containers tatsächlich zu veröffentlichen, verwenden Sie das Flag -p beim Andocken, um einen oder mehrere Ports zu veröffentlichen und zuzuordnen, oder das Flag -P, um alle freigelegten Ports zu veröffentlichen, und ordnen Sie sie den Ports höherer Ordnung zu. - Docker-Dokumente: EXPOSE
docker run -p 80: 80/tcp -p 80: 80/udp my_app
Im obigen Beispiel ist die erste Zahl nach dem Flag -p der Host-Port und die zweite der Container-Port.
Um alle Ports, die Sie in Ihrer Dockerfile mit EXPOSE definiert haben, zu veröffentlichen und an den Host-Computer zu binden, können Sie das Flag -P verwenden.
Docker-Run -P meine_App
EXPOSE wird verwendet, um den lokalen Port-Container-Port zuzuordnen, z
EXPOSE 8090
Was wird es tun, wird Localhost-Port 8090 Container-Port 8090 zuordnen