Antworten:
Laut der Docker-Compose-Referenz ,
Ports freigeben . Geben Sie entweder beide Ports (HOST: CONTAINER) oder nur den Container-Port an (ein zufälliger Host-Port wird ausgewählt).
Mein docker-compose.yml
sieht 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
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
expose
in Dockerfiles: "Die EXPOSE-Anweisung veröffentlicht den Port nicht wirklich. Sie fungiert als eine Art Dokumentation ..." docs.docker.com/engine/reference/builder/#expose
docker-compose run
die Portdefinition, in docker-compose.yml
wird ignoriert standardmäßig. Verwenden docker-compose up
oder geben Sie den Parameter--service-ports
Ports :
aussetzen :
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
In diesem ports
Abschnitt 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.
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 EXPOSE
Anweisung 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 inspect
auf 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.
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.
expose
in a hatdocker-compose
? Soweit ich das beurteilen kann, müssen Sie expose nicht angeben, um Ports für verknüpfte Dienste zugänglich zu machen.