it-swarm.com.de

Was ist der Unterschied zwischen "Expose" und "Publish" in Docker?

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?

373
user1496984

Grundsätzlich haben Sie drei Möglichkeiten:

  1. Weder EXPOSE noch -p angeben
  2. Geben Sie nur EXPOSE an.
  3. EXPOSE und -p angeben

1) 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 Auswahl eines Host-Ports hängt vom Host ab und gehört daher nicht zur Dockerfile (sonst wäre dies vom Host abhängig).
  • oft reicht es aus, wenn ein Dienst in einem Container von anderen Containern aus erreichbar ist.

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 -pEXPOSE. Deshalb habe ich es oben nicht als vierten Fall aufgeführt.

550
Golo Roden

Kurze Antwort:

  • EXPOSE ist eine Möglichkeit, zu dokumentieren
  • --publish (oder -p) ist eine Möglichkeit zum mapping a Hostport zu einem laufenden Containerport

Beachten 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 zu docker 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 als 30000) 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.

von: Docker-Containernetzwerk

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






Servicezugriff, wenn 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.

So testen Sie das:

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.

73
tgogos

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.

7
ton

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

3
mzalazar

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.

3
herm

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

0
Prakash

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

0
Mansur Ali