Portweiterleitung

DockerBeginner
Jetzt üben

Einführung

Die Isolation ist ein zentrales Merkmal von Containern. Standardmäßig ist das Netzwerk eines Containers vom Hostsystem getrennt. Ein Webserver, der im Container ausgeführt wird, kann daher zwar fehlerfrei laufen, von außerhalb aber trotzdem nicht erreichbar sein, sofern Sie keinen Port gezielt veröffentlichen.

Die Portweiterleitung schließt diese Lücke. Sie leitet Datenverkehr von einem ausgewählten Port auf dem Host an einen ausgewählten Port im Container weiter. Dies gehört zu den wichtigsten Grundlagen der Container-Netzwerke, weil dadurch verständlich wird, wie isolierte Dienste erreichbar werden.

Ohne diesen Schritt kann ein Dienst im Container vollkommen fehlerfrei laufen, bleibt aber praktisch auf den eigenen Netzwerk-Namespace des Containers beschränkt.

In diesem Lab üben Sie Folgendes:

  • Einen Nginx-Webserver-Container starten.
  • Den Host-Port 8080 auf den Container-Port 80 abbilden.
  • Die Portweiterleitung überprüfen und auf den Dienst zugreifen.
  • Die Ressourcen bereinigen.

Den Container-Port bereitstellen

In diesem Schritt starten Sie mit dem Nginx-Image einen neuen Docker-Container.

Nginx ist ein Webserver, der standardmäßig innerhalb des Containers auf Port 80 lauscht. Da der Container jedoch isoliert ist, kann auf Port 80 aus Ihrer LabEx-Umgebung nicht automatisch zugegriffen werden. Deshalb bilden Sie den Port 8080 auf Ihrem Hostsystem auf Port 80 im Container ab.

Die Syntax für die Portweiterleitung lautet -p <host_port>:<container_port>.

Die Reihenfolge ist wichtig. Die linke Seite bezeichnet den Host-Port, mit dem sich Clients verbinden. Die rechte Seite bezeichnet den Port, auf dem die Anwendung im Container tatsächlich lauscht.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

docker run -d -p 8080:80 --name my-nginx nginx

Aufschlüsselung des Befehls:

  • docker run: Erstellt und startet einen Container.
  • -d: Führt den Container im detached-Modus (im Hintergrund) aus.
  • -p 8080:80: Das Flag für die Portweiterleitung.
    • 8080: Der Port auf Ihrem Hostsystem (LabEx-Umgebung).
    • 80: Der Port im Container, auf dem Nginx lauscht.
  • --name my-nginx: Vergibt den Namen „my-nginx“ an den Container.
  • nginx: Das zu verwendende Image.

Bei erfolgreicher Ausführung gibt Docker die lange Container-ID aus.

Docker hat Nginx zu diesem Zeitpunkt nicht verändert. Stattdessen wurde eine Netzwerkregel erstellt, die Anfragen am Host-Port an den Dienst-Port im Container weiterleitet.

Portkonfiguration überprüfen

Überprüfen Sie nun, ob der Container ausgeführt wird und die Portweiterleitung korrekt konfiguriert ist. Der Befehl docker ps stellt diese Informationen bereit.

Führen Sie den folgenden Befehl aus:

docker ps

Die Ausgabe sollte ungefähr so aussehen:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
abc123456789   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   my-nginx

Ausgabe verstehen:

Sehen Sie sich die Spalte PORTS genau an: 0.0.0.0:8080->80/tcp.

  • 0.0.0.0:8080: Der Host lauscht an allen Netzwerkschnittstellen auf Port 8080.
  • ->: Gibt die Weiterleitungsrichtung an.
  • 80/tcp: Dies ist der Ziel-Port im Container.

Damit ist bestätigt, dass sämtlicher Datenverkehr an Port 8080 auf Ihrem Computer an Port 80 im Container weitergeleitet wird.

Aufgrund dieser Weiterleitung wird die Portweiterleitung häufig als „Veröffentlichen“ eines Container-Ports bezeichnet. Sie machen einen ansonsten isolierten Dienst für den Host oder externe Clients zugänglich.

Sie können auch einen speziellen Befehl verwenden, um nur die Ports zu überprüfen:

docker port my-nginx

Dienst testen

Nachdem der Port weitergeleitet wird, testen Sie nun, ob der Webserver erreichbar ist. Da Sie den Host-Port 8080 zugeordnet haben, können Sie auf den Nginx-Server zugreifen, indem Sie eine Anfrage an localhost:8080 senden.

Verwenden Sie dafür curl, ein Befehlszeilenprogramm zum Senden von Webanfragen.

Führen Sie den folgenden Befehl aus:

curl localhost:8080

Das sollten Sie erwarten:

Sie sollten den unverarbeiteten HTML-Code der standardmäßigen Nginx-Begrüßungsseite sehen.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
...
    <h1>Welcome to nginx!</h1>
...
</html>

Wenn diese HTML-Ausgabe erscheint, herzlichen Glückwunsch! Ihre Anfrage ist vom Host (Port 8080) -> in den Container (Port 80) -> zu Nginx gelangt, wurde dort verarbeitet, und die Antwort wurde zurückgesendet.

Dieser Hin- und Rückweg ist der praktische Beweis dafür, dass die Netzwerkverbindung zwischen Host und Container funktioniert. Er zeigt nicht nur, dass der Container-Prozess ausgeführt wird.

Ressourcen bereinigen

In diesem letzten Schritt bereinigen Sie die Umgebung. Es ist eine gute Praxis, nicht mehr benötigte Container zu stoppen und zu entfernen, damit Ports und Systemressourcen wieder freigegeben werden.

Stoppen Sie zuerst den laufenden Container:

docker stop my-nginx

Entfernen Sie anschließend den gestoppten Container:

docker rm my-nginx

Überprüfen Sie, ob der Container entfernt wurde:

docker ps -a

Der Container my-nginx sollte in der Liste nicht mehr erscheinen.

Zusammenfassung

In diesem Lab haben Sie die Grundlagen der Docker-Portweiterleitung erfolgreich kennengelernt. Sie haben:

  1. Einen Nginx-Container im detached-Modus gestartet.
  2. Den Host-Port 8080 mithilfe des Flags -p auf den Container-Port 80 abgebildet.
  3. Die Portkonfiguration mit docker ps überprüft.
  4. Mit curl vom Host aus auf den Dienst zugegriffen.
  5. Den Container bereinigt.

Das Verständnis der Portweiterleitung ist für die Bereitstellung von Webanwendungen unverzichtbar, weil dadurch externer Datenverkehr die in Ihren isolierten Containern ausgeführten Dienste erreichen kann.