Wie man freigelegte Ports eines Docker-Containers inspiziert

DockerBeginner
Jetzt üben

Einführung

Docker ist eine weit verbreitete Containerisierungstechnologie, die die Art und Weise, wie Anwendungen entwickelt, verpackt und bereitgestellt werden, revolutioniert hat. Das Verständnis der freigelegten Ports eines Docker-Containers ist ein grundlegender Aspekt der Arbeit mit Docker, da es Ihnen ermöglicht, auf die in dem Container laufenden Dienste zuzugreifen und mit ihnen zu interagieren. Dieses Tutorial führt Sie durch den Prozess der Inspektion der freigelegten Ports eines Docker-Containers und befähigt Sie, Ihre containerisierten Anwendungen besser zu verwalten und zu optimieren.

Docker Container Ports verstehen

Bevor wir uns mit der Inspektion von Container-Ports befassen, wollen wir zunächst verstehen, was Ports sind und warum sie in Docker-Containern wichtig sind.

Was sind Container-Ports?

In Docker ermöglichen Ports Diensten, die innerhalb eines Containers laufen, mit der Außenwelt zu kommunizieren. Stellen Sie sich Ports als Türen zu Ihrer containerisierten Anwendung vor – ohne diese Türen zu öffnen, kann niemand auf die Dienste im Inneren zugreifen.

Arten von Port-Konfigurationen

Docker unterstützt zwei Haupttypen von Port-Konfigurationen:

  1. Exposed Ports (Freigelegte Ports): Ports, die ein Container für potenzielle Verbindungen verfügbar macht, aber nicht automatisch vom Host aus zugänglich sind.

  2. Published Ports (Veröffentlichte Ports): Freigelegte Ports, die einem Port auf dem Host zugeordnet sind, wodurch externer Zugriff auf die Container-Dienste ermöglicht wird.

Lassen Sie uns einen einfachen Webserver-Container ausführen, um dies besser zu verstehen:

docker run -d --name web-demo nginx

Führen Sie diesen Befehl im Terminal aus. Dadurch wird ein Nginx-Webserver-Container mit dem Namen web-demo im Detached-Modus (im Hintergrund laufend) gestartet.

Die Ausgabe zeigt eine Container-ID, ähnlich wie:

3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f

Dieser Nginx-Container hat standardmäßig Port 80 freigelegt (wie in seinem Dockerfile definiert), aber wir haben ihn noch nicht auf dem Host veröffentlicht, daher können wir nicht von außen darauf zugreifen.

Die Port-Konfiguration des Containers untersuchen

Nachdem unser Container nun läuft, wollen wir seine Port-Konfiguration untersuchen.

Verwenden von docker ps zur Anzeige der Port-Mappings

Der Befehl docker ps zeigt laufende Container und ihre Port-Konfigurationen an.

Führen Sie diesen Befehl in Ihrem Terminal aus:

docker ps

Sie sehen eine Ausgabe ähnlich der folgenden:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
3a6e8df899a9   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    80/tcp    web-demo

Beachten Sie die Spalte PORTS. Sie zeigt 80/tcp an, was darauf hindeutet, dass Port 80 freigelegt, aber nicht auf dem Host veröffentlicht ist.

Ausführen eines Containers mit veröffentlichten Ports

Lassen Sie uns unseren ersten Container stoppen und einen neuen mit einem veröffentlichten Port erstellen:

docker stop web-demo
docker rm web-demo

Führen Sie nun einen neuen Container mit Port-Mapping aus:

docker run -d --name web-demo -p 8080:80 nginx

Die Option -p 8080:80 veröffentlicht den Container-Port 80 auf Port 8080 auf dem Host.

Führen Sie docker ps erneut aus, um den Unterschied zu sehen:

docker ps

Ausgabe:

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

Beachten Sie, wie die Spalte PORTS jetzt 0.0.0.0:8080->80/tcp anzeigt, was bedeutet, dass Port 80 im Container auf Port 8080 auf allen Host-Schnittstellen gemappt ist.

Detaillierte Informationen zu Container-Ports untersuchen

Docker bietet mehrere Befehle, um die Port-Konfigurationen von Containern detailliert zu untersuchen. Lassen Sie uns diese Optionen erkunden.

Verwenden des Befehls docker port

Der Befehl docker port zeigt die Port-Mappings für einen Container an:

docker port web-demo

Ausgabe:

80/tcp -> 0.0.0.0:8080

Dies zeigt, dass Port 80/tcp im Container auf Port 8080 auf allen Host-Schnittstellen gemappt ist.

Verwenden von docker inspect für detaillierte Informationen

Für detailliertere Informationen verwenden Sie den Befehl docker inspect:

docker inspect web-demo

Dieser Befehl erzeugt eine große Menge an JSON-Ausgabe mit detaillierten Informationen über den Container. Um nur die Port-Informationen herauszufiltern, verwenden Sie diesen Befehl:

docker inspect --format='{{json .NetworkSettings.Ports}}' web-demo | jq

Wenn jq nicht installiert ist, können Sie es mit folgendem Befehl installieren:

sudo apt-get update && sudo apt-get install -y jq

Die Ausgabe des gefilterten Inspect-Befehls sieht wie folgt aus:

{
  "80/tcp": [
    {
      "HostIp": "0.0.0.0",
      "HostPort": "8080"
    }
  ]
}

Dies zeigt detaillierte Port-Mapping-Informationen:

  • Container-Port: 80/tcp
  • Host-IP: 0.0.0.0 (alle Schnittstellen)
  • Host-Port: 8080

Auflisten aller Container-Ports

Wenn Sie mehrere Container haben, können Sie alle Port-Mappings mit folgendem Befehl anzeigen:

docker ps --format "{{.Names}}: {{.Ports}}"

Ausgabe:

web-demo: 0.0.0.0:8080->80/tcp

Dies ist nützlich, wenn Sie mehrere Container mit unterschiedlichen Port-Konfigurationen verwalten.

Zugriff auf Dienste über freigegebene Ports

Nachdem wir nun verstanden haben, wie man Container-Ports untersucht, wollen wir auf den Webserver zugreifen, der in unserem Container läuft.

Testen der Container-Erreichbarkeit

Da wir Port 80 des Containers auf Port 8080 auf dem Host gemappt haben, können wir über Port 8080 auf den Nginx-Webserver zugreifen.

Verwenden wir den Befehl curl, um eine Anfrage an unseren Webserver zu stellen:

curl localhost:8080

Sie sollten das HTML der Nginx-Willkommensseite sehen:

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Dies bestätigt, dass wir über den veröffentlichten Port auf den Nginx-Webserver zugreifen können, der in unserem Container läuft.

Ausführen mehrerer Dienste

Erstellen wir einen weiteren Container mit einem anderen Dienst und Port-Mapping:

docker run -d --name redis-demo -p 6379:6379 redis

Dieser Befehl startet einen Redis-Datenbank-Container und mappt seinen Standardport 6379 auf denselben Port auf dem Host.

Überprüfen Sie die laufenden Container:

docker ps

Ausgabe:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
a45df67e21b3   redis     "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp   redis-demo
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp     web-demo

Jetzt haben wir zwei Container, die verschiedene Dienste ausführen, jeder mit seinem eigenen Port-Mapping.

Verwalten von Container-Port-Konfigurationen

Nachdem wir nun verstanden haben, wie man containerisierte Dienste inspiziert und darauf zugreift, wollen wir einige zusätzliche Konzepte zur Portverwaltung untersuchen.

Häufige Szenarien der Portverwaltung

Hier sind einige gängige Szenarien, denen Sie begegnen könnten:

1. Ändern von Port-Mappings

Wenn Port 8080 bereits auf Ihrem Host verwendet wird, können Sie auf einen anderen Port mappen:

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx

Jetzt ist der Nginx-Container über Port 8081 erreichbar:

curl localhost:8081

2. Binden an bestimmte Schnittstellen

Anstatt an alle Schnittstellen (0.0.0.0) zu binden, können Sie an eine bestimmte IP binden:

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx

Dies bindet den Container-Port nur an die Localhost-Schnittstelle, wodurch er von außerhalb des Hosts nicht zugänglich ist.

3. Verwenden von zufälligen Host-Ports

Wenn es Ihnen egal ist, welcher Host-Port verwendet wird, lassen Sie Docker einen zuweisen:

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -P nginx

Der Flag -P veröffentlicht alle freigelegten Ports auf zufällige Ports auf dem Host.

Überprüfen Sie den zugewiesenen Port:

docker port web-demo

Ausgabe:

80/tcp -> 0.0.0.0:49153

Die genaue Portnummer variiert, aber in diesem Beispiel wurde Port 80 auf Port 49153 gemappt.

Fehlerbehebung bei häufigen Port-Problemen

Hier sind Lösungen für häufige Probleme im Zusammenhang mit Ports:

  1. Port bereits in Verwendung: Wenn Sie einen Fehler wie "port is already allocated" sehen, wählen Sie einen anderen Port:
docker run -d --name another-web -p 8082:80 nginx
  1. Container kann keine Verbindung zum Host herstellen: Wenn ein Container eine Verbindung zu einem Dienst auf dem Host herstellen muss, verwenden Sie den speziellen Docker-DNS-Namen host.docker.internal anstelle von localhost:
docker run --rm alpine ping -c 2 host.docker.internal
  1. Überprüfen, welcher Prozess einen Port verwendet: Wenn ein Port bereits auf dem Host verwendet wird, finden Sie den Prozess:
sudo lsof -i :8080

Aufräumen

Lassen Sie uns unsere Container aufräumen:

docker stop web-demo redis-demo
docker rm web-demo redis-demo

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man mit Docker-Container-Ports arbeitet, einschließlich:

  • Verstehen des Unterschieds zwischen freigelegten (exposed) und veröffentlichten (published) Ports
  • Ausführen von Containern mit spezifischen Port-Mappings
  • Untersuchen von Container-Port-Konfigurationen mit verschiedenen Docker-Befehlen
  • Zugriff auf Dienste, die in Containern über gemappte Ports laufen
  • Verwalten und Beheben von häufigen portbezogenen Szenarien

Diese Fähigkeiten sind grundlegend für die Arbeit mit Docker-Containern und unerlässlich für die Bereitstellung von containerisierten Anwendungen in Entwicklungs- und Produktionsumgebungen. Mit diesem Wissen können Sie jetzt die Netzwerkaspekte Ihrer Docker-Container selbstbewusst konfigurieren und verwalten.