Was ist der Unterschied zwischen dem Offenlegen und Veröffentlichen eines Docker-Ports?

0
123
Michael Vi/Shutterstock.com< /figure>

Exponierte und veröffentlichte Container-Ports sind zwei verschiedene, aber verwandte Konzepte in Docker. Offengelegte Ports werden in Ihrem Dockerfile als einfache Metadaten definiert. Sie müssen sie beim Start Ihres Containers veröffentlichen, wenn Sie den Zugriff von außen aktivieren möchten.

Einen Port freigeben

Ports werden über die EXPOSE-Anweisungen in einem . freigelegt image’s Dockerfile:

EXPOSE 80

Das Offenlegen eines Ports hat jedoch keine unmittelbaren Auswirkungen. Die Anweisung teilt nur mit, dass die Anwendung innerhalb des Containers auf Port 80 lauscht. Sie öffnet diesen Port nicht für die Welt und bietet keinen expliziten Zugriff auf andere Container.

Als Bildautor hilft das Auflisten von Ports, die von Ihrem Workload mit EXPOSE verwendet werden, Benutzern beim Konfigurieren geeigneter Portweiterleitungsregeln, wenn sie einen Container starten. Dies ist besonders wichtig, wenn nicht standardmäßige Ports verwendet werden: Während von einem Webserver erwartet werden kann, dass er auf Port 80 lauscht, können Benutzer den von einem benutzerdefinierten Socket-Server verwendeten Port nicht erraten.

Freigelegte Ports sind sichtbar, wenn Sie Ihre Container mit docker ps auflisten. Sie werden in der Spalte PORTS angezeigt, obwohl sie außerhalb des Containers nicht wirklich zugänglich sind. Auf diese Weise können Sie auf einfache Weise überprüfen, auf welchen Ports die Software in einem Container lauscht.

Sie können von einem Image bereitgestellte Ports überprüfen, ohne einen Container zu starten, indem Sie docker inspect verwenden. Ersetzen Sie das Tag oder die ID Ihres Bildes durch das Demo-Image:

docker inspect –format=”{{json .Config.ExposedPorts}}” Demo-Image

Veröffentlichen von Ports

Das Veröffentlichen eines Ports macht ihn von außerhalb des Containers zugänglich. Damit können Sie einen Port nehmen, den Sie durch eine EXPOSE-Anweisung entdeckt haben, und dann einen Host-Port daran binden.

Werbung

Ports werden mit dem Flag -p für den docker run-Befehl verfügbar gemacht:

docker run -d -p 8080:80 httpd:latest

Dieser Befehl bindet Port 8080 auf Ihrem Docker-Host an 80 in Ihrem neuen Container. Jetzt können Sie http://localhost:8080 besuchen, um auf den Port des Containers zuzugreifen. Wenn Sie docker ps ausführen, wird in der Spalte PORTS jetzt diese Zuordnung angezeigt. Der verfügbare Container-Port 80 wurde für den Host veröffentlicht.

Das Flag -p kann ohne Angabe eines Ports zum Binden verwendet werden:

docker run -d -p 80 httpd:latest

Diese Variante bindet Port 80 im Container an einen zufälligen Port auf dem Host. Sie können den zugewiesenen Port überprüfen, indem Sie docker ps ausführen.

-p unterstützt auch das Veröffentlichen eines Ports auf bestimmten Netzwerkschnittstellen:

docker run -d -p 127.0.0.1:8080:80 httpd:latest Advertisement

Hier ist der Container-Port 80 nur über den Port erreichbar 8080 auf der lokalen Loopback-Adresse des Hosts. Dies schützt Ihren Container vor Netzwerkaufrufen, die von Ihren anderen Geräten getätigt werden.

Veröffentlichung aller exponierten Ports

Sie können einen Container mit dem Flag –publish-all starten, damit Docker automatisch alle exponierten Ports veröffentlicht, die in der Docker-Datei des Images aufgeführt sind:

docker run -d –publish-all httpd:latest

Dadurch werden jedem exponierten Port im Container zufällige freie Ports auf Ihrem Host zugewiesen. Verwenden Sie den Befehl docker ps, um die vorgenommenen Portzuweisungen anzuzeigen. Dies vereinfacht das Starten eines neuen Containers aus einem Image, das das Öffnen mehrerer nicht standardmäßiger Ports erfordert.

Sie können –publish-all mit expliziten -p-Zuordnungen kombinieren. In diesem Fall überschreibt eine mit einem -p-Flag erstellte Zuordnung den zufälligen Port, der von –publish-all zugewiesen wurde.

Wenn Sie keinen Port veröffentlichen müssen

Sie müssen Container-Ports nur mit -p veröffentlichen, wenn Sie von Ihrem Docker-Host oder einem anderen Gerät in Ihrem physischen Netzwerk darauf zugreifen möchten. Docker-Netzwerke sind der bevorzugte alternative Ansatz für den Verkehr zwischen Containern.

Container, die sich ein Netzwerk teilen, können immer miteinander kommunizieren, auch wenn ihre Ports nicht explizit veröffentlicht wurden.

docker network Demo-Netzwerk erstellen docker run -d –network demo-network –name web web:latest docker run -d –network demo-network –name database database:latest Werbung

In diesem Beispiel , kann der Webcontainer eine Verbindung zu einem MySQL-Server herstellen, der auf Port 3306 im Datenbankcontainer ausgeführt wird, indem die Adresse database:3306 verwendet wird. Docker richtet automatisch Routing-Tabellen für die Containernamen im Netzwerk ein.

Portbereiche verwenden

Docker kann ganze Portbereiche bereitstellen und veröffentlichen, wenn mehrere Ports verfügbar sein müssen:

EXPOSE 8000-8100 docker run –publish-all docker run -p 6000-6100:8000-8100

Im ersten Fall , –publish-all weist Ihrem Host 100 zufällige Ports zu und ordnet sie dem Bereich des Containers zu. Die zweite Form bindet wie üblich einen Hostbereich explizit an einen Containerbereich. Die Leistung kann beeinträchtigt werden, wenn Sie eine sehr große Anzahl von Ports verwenden, da für jeden eine iptables-Regel erstellt wird.

Zusammenfassung

Offengelegte Ports sind Metadaten, die die Ports definieren, die von der Software in einem Container-Image überwacht werden. Das Vorhandensein von exponierten Ports macht sie nicht zugänglich, es sei denn, Sie veröffentlichen sie manuell. In diesem Sinne ist das Verb “expose” ist eine falsche Bezeichnung, da viele Leute davon ausgehen, dass es sich um eine aktive Aktion handelt, obwohl es sich tatsächlich um eine Informationsaussage handelt. EXPOSE sollte als Dokumentation behandelt werden, während das Flag -p eine funktionierende Portzuordnung erstellt.

Docker bietet einige zusätzliche Verhaltensweisen basierend auf den EXPOSE-Anweisungen. Sie können die exponierten Ports eines Containers mit docker ps anzeigen, unabhängig davon, ob sie veröffentlicht wurden. Es gibt auch das Flag –publish-all, das die exponierten Ports eines Images an zufällige Host-Ports veröffentlicht.

Sie müssen nur Ports veröffentlichen, wenn Sie von außen auf einen Container zugreifen möchten ein Docker-Netzwerk. Die Kommunikation zwischen Containern im selben Netzwerk ist immer ungehindert, unabhängig davon, ob die beteiligten Häfen offengelegt oder veröffentlicht wurden.