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:
Exposed Ports (Freigelegte Ports): Ports, die ein Container für potenzielle Verbindungen verfügbar macht, aber nicht automatisch vom Host aus zugänglich sind.
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:
- 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
- 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.internalanstelle vonlocalhost:
docker run --rm alpine ping -c 2 host.docker.internal
- Ü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.



