it-swarm.com.de

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

In der Datei docker-compose.yml gibt es Optionen für ports und expose. Wie unterscheiden sie sich?

214
bibstha

Nach der docker-compose Referenz ,

Ports ist definiert als:

Stellen Sie ports bereit. Geben Sie entweder beide Ports an (Host: CONTAINER) oder nur den Container-Port (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 werden.
  • Ports werden auf dem Host-Computer für einen beliebigen Port oder einen bestimmten Port verfügbar gemacht.

Mein docker-compose.yml sieht folgendermaßen aus:

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

Wenn ich docker-compose ps mache, sieht das 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 offen, ohne sie auf dem Host-Computer zu veröffentlichen. Sie sind nur für verknüpfte Dienste zugänglich. Nur der interne Port kann angegeben werden.

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

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

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

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp
308
bibstha

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

ports:
   - 10005:80

Dies bedeutet, dass die Anwendung, die im Container ausgeführt wird, an Port 80 verfügbar ist. Da das externe System/die Entität jedoch nicht darauf zugreifen kann, muss es dem Host-Server-Port zugeordnet werden.

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 Dies wird ausschließlich zum Definieren des Ports verwendet, an dem die Anwendung im Docker-Container ausgeführt wird.

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

5
sorabzone

Häfen

Der Abschnitt ports veröffentlicht Ports auf dem Host. 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 (docker-proxy) implementiert, der den ersten Port überwacht und an den Container weiterleitet, der den zweiten Punkt überwachen muss. Wenn der Container den Zielport nicht überwacht, wird auf dem Host immer noch etwas überwacht. Wenn Sie jedoch versuchen, eine Verbindung zu diesem Host-Port herzustellen, wird die Verbindung von der fehlgeschlagenen Weiterleitung in den Container abgelehnt.

Beachten Sie, dass der Container alle Netzwerkschnittstellen überwachen muss, da dieser Proxy nicht im Netzwerknamespace des Containers ausgeführt wird und nicht 127.0.0.1 im Container erreichen kann. Die IPv4-Methode dafür besteht darin, Ihre Anwendung so zu konfigurieren, dass sie 0.0.0.0 überwacht.

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 finden Sie Docker-Fehler, die versuchen, den bereits verwendeten Host-Port abzuhören.

Entlarven

Expose ist Dokumentation. Hiermit werden Metadaten für das Image und beim Ausführen auch für den Container festgelegt. Normalerweise konfigurieren Sie dies in der Docker-Datei mit der Anweisung EXPOSE und sie dient als Dokumentation für die Benutzer, die Ihr Image ausführen, damit diese 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 freigelegten Ports sehen, wenn Sie docker inspect für das Bild oder den Container ausführen.

Es gibt einige Tools, die sich auf exponierte Ports verlassen. Im Docker werden mit dem Flag -P alle freigelegten Ports auf kurzlebigen Ports auf dem Host veröffentlicht. 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.

Anders als diese 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 Container auf einen anderen zuzugreifen. Wenn dieses Netzwerk vom Benutzer erstellt wurde (z. B. nicht das Standardbrückennetzwerk mit dem Namen bridge), können Sie mithilfe von DNS eine Verbindung zu den anderen Containern herstellen.

4
BMitch

Häfen

  1. Aktiviert den Container, um nach spezifizierten Ports aus der Welt außerhalb des Dockers zu lauschen (kann dieselbe Host-Maschine oder eine andere Maschine sein) UND auch eine andere Welt im Docker 
  2. Es kann mehr als ein Port angegeben werden (aus diesem Grund sind ports nicht port)

 enter image description here

entlarven

  1. Aktiviert den Container, um nur einen bestimmten Port von der Welt innerhalb des Dockers zu überwachen, und eine nicht zugängliche Welt außerhalb des Dockers. 
  2. Es kann nur ein einzelner Port angegeben werden

 enter image description here

2
Mehraj Malik

Ich stimme den Antworten völlig zu. Ich möchte nur erwähnen, dass der Unterschied zwischen exponiert und Ports Teil des Sicherheitskonzeptes im Docker ist. Es geht Hand in Hand mit dem networking von Docker. Zum Beispiel:

Stellen Sie sich eine Anwendung mit einem Web-Frontend und einem Datenbank-Backend vor. Die Außenwelt benötigt Zugriff auf das Web-Frontend (möglicherweise auf Port 80), aber nur das Backend selbst muss auf die Datenbank Host Zugreifen. und Hafen. Bei Verwendung einer benutzerdefinierten Bridge muss nur der Webport .__ sein. geöffnet, und für die Datenbankanwendung sind keine offenen Ports erforderlich. da das Web-Frontend es über die benutzerdefinierte Brücke erreichen kann.

Dies ist ein häufiger Anwendungsfall beim Einrichten einer Netzwerkarchitektur im Andockfenster. Zum Beispiel sind in einem Standard-Bridge-Netzwerk keine Ports von der Außenwelt aus zugänglich .____ Sie können einen Ingresspoint mit "Ports" öffnen. Mit "Expose" definieren Sie die Kommunikation innerhalb des Netzwerks. Wenn Sie die Standardports verfügbar machen möchten, müssen Sie in Ihrer Docker-Compose-Datei nicht "Expose" definieren.

0
medTech