Was ist der Unterschied zwischen Docker-Compose-Ports und Expose?

461

Was ist der Unterschied zwischen portsund exposeOptionen indocker-compose.yml

bibstha
quelle

Antworten:

527

Laut der Docker-Compose-Referenz ,

Ports ist definiert als:

Ports freigeben . Geben Sie entweder beide Ports (HOST: CONTAINER) oder nur den Container-Port an (ein zufälliger Host-Port wird ausgewählt).

  • In docker-compose.yml erwähnte Ports werden von verschiedenen Diensten gemeinsam genutzt, die von docker-compose gestartet wurden.
  • Ports werden dem Host-Computer einem zufälligen Port oder einem bestimmten Port ausgesetzt.

Mein docker-compose.ymlsieht aus wie:

mysql:
  image: mysql:5.7
  ports:
    - "3306"

Wenn ich das tue docker-compose ps, sieht es so aus:

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

Expose ist definiert als:

Stellen Sie Ports bereit, ohne sie auf dem Hostcomputer zu veröffentlichen. Sie sind nur für verknüpfte Dienste zugänglich. Es kann nur der interne Port angegeben werden.

Ports sind nicht Host-Computern ausgesetzt, sondern nur anderen Diensten.

mysql:
  image: mysql:5.7
  expose:
    - "3306"

Wenn ich das tue docker-compose ps, sieht es so aus:

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp
bibstha
quelle
24
Wäre es möglich zu erklären, welche Vorteile die Angabe exposein a hat docker-compose? Soweit ich das beurteilen kann, müssen Sie expose nicht angeben, um Ports für verknüpfte Dienste zugänglich zu machen.
Saftig
3
Sollte es nicht heißen, dass exponierte Ports nur für Dienste im selben Docker-Netzwerk verfügbar sind (die Verknüpfung wird größtenteils ersetzt)?
Miau
8
@Juicy Ich denke, es ist ähnlich wie exposein Dockerfiles: "Die EXPOSE-Anweisung veröffentlicht den Port nicht wirklich. Sie fungiert als eine Art Dokumentation ..." docs.docker.com/engine/reference/builder/#expose
tsauerwein
1
Überschreiben Ports alle Einstellungen auf Firewall-Ebene? Ich habe gerade bemerkt, dass ich keine Ports für MySQL in der Firewall geöffnet habe, aber sie waren remote zugänglich. Ich hatte Ports auf "3306: 3306" gesetzt, anstatt sie freizulegen.
TekiusFanatikus
3
Und denken Sie daran, wenn Sie verwenden docker-compose rundie Portdefinition, in docker-compose.ymlwird ignoriert standardmäßig. Verwenden docker-compose upoder geben Sie den Parameter--service-ports
Juha Untinen
177

Ports :

  1. Aktiviert den Container, um auf bestimmte Ports von der Welt außerhalb des Dockers zu warten (kann derselbe Hostcomputer oder ein anderer Computer sein) UND auch auf die Welt innerhalb des Dockers zuzugreifen.
  2. Es kann mehr als ein Port angegeben werden (aus diesem Grund werden keine Ports portiert).

Geben Sie hier die Bildbeschreibung ein

aussetzen :

  1. Aktiviert den Container, um nur von der Welt innerhalb des Dockers UND nicht von der Welt außerhalb des Dockers auf einen bestimmten Port zu warten.
  2. Es kann mehr als ein Port angegeben werden

Geben Sie hier die Bildbeschreibung ein

Mehraj Malik
quelle
3
Beachten Sie, dass Expose mehrere Ports zulässt - docs.docker.com/compose/compose-file/#expose - Sie geben jedoch nur den internen Port an und nicht den internen + externen
Stuart Moore
Aber was tun, wenn ich von meinem Container aus auf die Außenwelt zugreifen möchte? stackoverflow.com/questions/61322256/…
gstackoverflow
25

Ports In diesem Abschnitt wird die Zuordnung zwischen dem Hostserver und dem Docker-Container definiert.

ports:
   - 10005:80

Dies bedeutet, dass die im Container ausgeführte Anwendung an Port 80 verfügbar ist. Das externe System / die externe Entität kann jedoch nicht darauf zugreifen, sodass sie dem Host-Server-Port zugeordnet werden muss.

Hinweis: Sie müssen den Host-Port 10005 öffnen und die Firewall-Regeln ändern, damit externe Entitäten auf die Anwendung zugreifen können.

Sie können verwenden

http: // {Host-IP}: 10005

etwas wie das

EXPOSE Hiermit wird ausschließlich der Port definiert, auf dem die Anwendung im Docker-Container ausgeführt wird.

Sie können es auch in der Docker-Datei definieren. Im Allgemeinen ist es eine gute und weit verbreitete Praxis, EXPOSE in Dockerfile zu definieren, da sie nur sehr selten von einem anderen Port als dem Standard-80-Port ausgeführt werden

Sorabzone
quelle
19

Häfen

In diesem portsAbschnitt werden Ports auf dem Host veröffentlicht. Docker richtet eine Weiterleitung für einen bestimmten Port vom Host-Netzwerk in den Container ein. Standardmäßig wird dies mit einem Userspace-Proxy-Prozess implementiert (docker-proxy ) , der den ersten Port überwacht und in den Container weiterleitet, der den zweiten Punkt abhören muss. Wenn der Container den Zielport nicht überwacht, wird auf dem Host immer noch etwas abgehört, aber eine Verbindung wird abgelehnt, wenn Sie versuchen, eine Verbindung zu diesem Host-Port herzustellen, und zwar von der fehlgeschlagenen Weiterleitung in Ihren Container.

Beachten Sie, dass der Container alle Netzwerkschnittstellen abhören muss, da dieser Proxy nicht im Netzwerk-Namespace des Containers ausgeführt wird und im Container nicht 127.0.0.1 erreichen kann. Die IPv4-Methode hierfür besteht darin, Ihre Anwendung so zu konfigurieren, dass sie abgehört wird 0.0.0.0.

Beachten Sie auch, dass veröffentlichte Ports nicht in die entgegengesetzte Richtung funktionieren. Sie können vom Container aus keine Verbindung zu einem Dienst auf dem Host herstellen, indem Sie einen Port veröffentlichen. Stattdessen werden Docker-Fehler gefunden, die versuchen, den bereits verwendeten Host-Port abzuhören.

Entlarven

Expose ist Dokumentation. Es legt Metadaten für das Image und beim Ausführen auch für den Container fest. Normalerweise konfigurieren Sie dies in der Docker-Datei mit der EXPOSEAnweisung und es dient als Dokumentation für die Benutzer, die Ihr Image ausführen , damit sie wissen, an welchen Ports Ihre Anwendung standardmäßig empfangsbereit ist. Bei der Konfiguration mit einer Compose-Datei werden diese Metadaten nur für den Container festgelegt. Sie können die exponierten Ports sehen, wenn Sie a docker inspectauf dem Image oder Container ausführen .

Es gibt einige Tools, die auf exponierten Ports basieren. Im Docker ist die-P Flag alle exponierten Ports auf kurzlebigen Ports auf dem Host. Es gibt auch verschiedene Reverse-Proxys, die standardmäßig einen exponierten Port verwenden, wenn Datenverkehr an Ihre Anwendung gesendet wird, wenn Sie den Container-Port nicht explizit festlegen.

Abgesehen von diesen externen Tools hat Expose keinerlei Auswirkungen auf die Vernetzung zwischen Containern. Sie benötigen nur ein gemeinsames Docker-Netzwerk und eine Verbindung zum Container-Port, um von einem anderen auf einen Container zugreifen zu können. Wenn dieses Netzwerk vom Benutzer erstellt wurde (z. B. nicht das Standard-Bridge-Netzwerk mit dem Namen bridge), können Sie DNS verwenden, um eine Verbindung zu den anderen Containern herzustellen.

BMitch
quelle
3

Ich stimme den vorherigen Antworten voll und ganz zu. Ich möchte nur erwähnen, dass der Unterschied zwischen Expose und Ports Teil des Sicherheitskonzepts in Docker ist. Es geht Hand in Hand mit der Vernetzung von Docker. Zum Beispiel:

Stellen Sie sich eine Anwendung mit einem Web-Front-End und einem Datenbank-Back-End vor. Die Außenwelt benötigt Zugriff auf das Web-Front-End (möglicherweise auf Port 80), aber nur das Back-End selbst benötigt Zugriff auf den Datenbank-Host und -Port. Bei Verwendung einer benutzerdefinierten Bridge muss nur der Webport geöffnet werden, und für die Datenbankanwendung müssen keine Ports geöffnet werden, da das Web-Front-End über die benutzerdefinierte Bridge darauf zugreifen kann.

Dies ist ein häufiger Anwendungsfall beim Einrichten einer Netzwerkarchitektur in Docker. So sind beispielsweise in einem Standardbrückennetzwerk keine Ports von der Außenwelt aus zugänglich. Daher können Sie einen Eingangspunkt mit "Ports" öffnen. Mit "exponieren" definieren Sie die Kommunikation innerhalb des Netzwerks. Wenn Sie die Standardports verfügbar machen möchten, müssen Sie "exponieren" nicht in Ihrer Docker-Compose-Datei definieren.

medTech
quelle