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
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
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 :
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.
Es kann mehr als ein Port angegeben werden (aus diesem Grund werden keine Ports portiert).
aussetzen :
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.
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 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.
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.expose
in Dockerfiles: "Die EXPOSE-Anweisung veröffentlicht den Port nicht wirklich. Sie fungiert als eine Art Dokumentation ..." docs.docker.com/engine/reference/builder/#exposedocker-compose run
die Portdefinition, indocker-compose.yml
wird ignoriert standardmäßig. Verwendendocker-compose up
oder geben Sie den Parameter--service-ports
Ports :
aussetzen :
quelle
Ports In diesem Abschnitt wird die Zuordnung zwischen dem Hostserver und dem Docker-Container definiert.
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
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
quelle
Häfen
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.
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
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 adocker 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.quelle
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:
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.
quelle