Docker Ports?

3 Antworten

Wozu werden diese benötigt?

Genau so wie andere Maschinen auch: Jede Maschine in einem Netzwerk hat um die 65.000 Ports pro IP-Adresse und nutzt diese zur Kommunikation mit anderen Geräten. Wenn Dienste angeboten werden, wird auf Anfragen auf einen festgelegten Port gehört - standardmäßig z.B. HTTP z.B. auf Port 80 (TCP), HTTPS auf 443 (TCP), SSH wäre Port 22 (TCP), ein Minecraft Java-Server auf 25565 (TCP) usw. Diese Ports können aber prinzipiell auch abweichen, müssen dann jedoch explizit angegeben werden.

Wie genau arbeitet Docker mit Ports?

Ich bezieh mich jetzt mal nur auf den normalen "Bridge Network Mode", den du vermutlich in der Regel nutzen wirst. Es gibt jedoch mehr Netzwerk-Treiber wie z.B. auch den Host-Mode: https://docs.docker.com/network/

Dein Dienst im Container wird auf einen gewissen Port hören - wenn du fertige Container nutzt, ist das vordefiniert. Du kannst Container jetzt einfach miteinander kommunizieren lassen, indem du sie in ein gemeinsames Subnetz steckst.

Willst du jetzt von außerhalb auf die Docker-Container zugreifen, musst du den Port noch mappen - du sagst also, über welchen Port deines Hosts die Anfragen an welchen Port im Container selbst weitergeleitet werden.

Wie funktioniert dies?

Port-Mappings werden bei Docker in der Schreibweise <Host-Port>:<Container-Port> angegeben - z.B. 3000:80 leitet Anfragen an den Host auf Port 3000 intern an den Port 80 des Containers weiter.

z.B. als Beispiel: Nginx Reverse Proxy per Docker-Compose

version: '3'
services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Dort sind explizit der Host-Port 80 (für HTTP) auf den Container-Port 80 gemappt, 81 (für die WebUI, auch HTTP) auf 81 und 443 (für HTTPS) auf 443. Der Container ist so vorgefertigt, dass er eben auf diese drei Ports - 80, 81 und 443 - hört und Anfragen entsprechend verarbeitet

Du könntest jetzt bei einem Dienst natürlich auch hingehen und den Host-Port ändern. Wenn wir jetzt weiterhin beim Nginx Reverse Proxy bleiben, könntest du den Host-Port für die WebUI z.B. auf 8081 legen, indem du die entsprechende Zeile von 81:81 auf 8081:81 änderst. Vom Host aus würdest du es dann z.B. per localhost:8081 aufrufen können

Woher ich das weiß:Studium / Ausbildung – Abgeschlossenes Studium der Informatik (B.Sc.)

Die Ports werden dabei für die kommunikation nach aussen bzw. von aussen nach innen richtung Container genutzt.

Wenn du beispielsweise einen Dockercontainer mit Apache Webserver startest, der Port 80 nutzt und diesen nicht freigibst, dann kannst du nicht auf die Webseiten des Webservers zugreifen weil keine Verbindung über den Port aufgebaut wird.

naja, du hast ja mehrere web-applikationen auf einem server laufen. entsprechend müssen sich die ja unterschiedlich aufrufen lassen. wenn du alle auf port 80 laufen lässt kann des nicht klappen.

jede applikation hat aber einen normalen port definiert. eben 80 als beispiel. intern im container bleibt der port auch. du gibst aber beim start an auf welchen port er nach außen gematcht werden soll. (z.b. auf 8080)

docker run .... -p 8080:80

so kannst du von deinem browser den port 8080 aufrufen und der wird dann auf die applikation im container mit port 80 weitergeleitet.