Docker Tutorial [Teil 4 - Ports / Portmapping]

Datum

Wenn man einen docker Container (mit z.B. NginX) nur per docker container run -d nginx erstellt, so lauscht der Nginx standardmäßig auf Port 80, aber nur im Container selbst.

Eine Übersicht der lauschenden Ports und deren Zuordnung findet sich in der schon in der einfachen Übersicht, unter dem Punkt PORTS:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ba1c1d61393f        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        80/tcp              nginx

Wenn man nun auf den Port 80 des Containers zugreifen will, muss man die vergebene IP-Adresse herausfinden (z.B. per docker inspect <CONTAINER ID/Containername> | grep -i ipaddress

$ docker inspect ba1c1d61393f | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",

Auf diese IP kann man dann eine entsprechende cURL-Abfrage schicken:

$ curl -I 172.17.0.2
HTTP/1.1 200 OK
Server: nginx/1.17.0
Date: Wed, 12 Jun 2019 10:40:29 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 May 2019 14:23:57 GMT
Connection: keep-alive
ETag: "5ce409fd-264"
Accept-Ranges: bytes

zusätzlichen Port im Container öffnen

Will man weitere Ports im Container nach außen freigeben sollte man --expose verwenden.
Aus der Hilfe: --expose <list> Expose a port or a range of ports

Diese Option lässt sich auch mehrfach angeben.
Als Beispiel erstelle ich einen Container aus dem nginx Image, welcher zusätzlich den Port 1337 und die Port-Range 6330-6335 im Container öffnet. (Ob im Container auf den jeweiligen Ports etwas lauscht sei jetzt mal angenommen)

$ docker container run -d --expose 6330-6335 --expose 1337 nginx
f1116609d8b93dcdb21fb1f0144dff06b6bbd253ceb713edf9712794ed03cb84
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
f1116609d8b9        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        80/tcp, 1337/tcp, 6330-6335/tcp   fervent_hermann

Sofern nicht anders angegeben wird tcp als Standardprotokoll verwendet. Will man einen udp Port öffnen muss das extra angegeben werden.

Bsp.: docker container run -d --expose 1337/udp nginx

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
94e3b3cb518c        nginx               "nginx -g 'daemon of…"   4 seconds ago       Up 2 seconds        80/tcp, 1337/udp                  gifted_leavitt

Container-Port auf einen festen Port auf dem Host mappen

Um einen Port im Container auf einen Port auf dem Host-System zu mappen verwendet man die Option -p.

Auszug aus der Hilfe: -p, --publish list Publish a container's port(s) to the host

Nun erstellen wir einen Container, welcher das nginx-Image verwendet und dessen lokaler Port 80 (im Container) auf den Port 8080 (auf dem Host) gemappt wird:
docker container run -d -p 8080:80 nginx

Achtung: Die Syntax lautet bei der -p Option: -p HOST-PORT:CONTAINER-PORT

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
ed9397d8cf18        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   zealous_jones
$ curl -I localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.17.0
Date: Wed, 12 Jun 2019 11:08:46 GMT
Content-Type: text/html
...

Auch hier kann die Option -p mehrfach angegeben werden und kann zwischen tcp und udp unterschieden werden.

Beispiel: docker container run -d -p 8081:80/tcp -p 8081:80/udp nginx

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
cc4b02fa485e        nginx               "nginx -g 'daemon of…"   4 seconds ago       Up 3 seconds        0.0.0.0:8081->80/tcp, 0.0.0.0:8081->80/udp   blissful_jang

Container-Port auf einen zufälligen Port auf dem Host mappen

Um dies zu tun wird die Option -P verwendet.
Aus der Hilfe: -P, --publish-all Publish all exposed ports to random ports

Auch hiermit erstellen wir wieder einen Container:
docker container run -d -P nginx

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
3529223afc00        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:32768->80/tcp   vigilant_mclean

Hier wurde nun von docker der Port 80 (im Container) auf den Port 32768 (auf den Host) gemappt.

$  curl -I localhost:32768
HTTP/1.1 200 OK
Server: nginx/1.17.0
Date: Wed, 12 Jun 2019 11:18:44 GMT

Portmapping anzeigen lassen

Mithilfe des Befehls docker container port <CONTAINER ID/Containername> lassen sich die entsprechenden Port-Zuweisungen aufzeigen.

Beispiel:

$ docker container port 3529223afc00
80/tcp -> 0.0.0.0:32768

Dies funktioniert auch wenn Port-Ranges gemappt werden:

$ docker container port f40737a53ba8
6332/tcp -> 0.0.0.0:32772
6333/tcp -> 0.0.0.0:32771
6334/tcp -> 0.0.0.0:32770
6335/tcp -> 0.0.0.0:32769
80/tcp -> 0.0.0.0:32776
1337/tcp -> 0.0.0.0:32775
6330/tcp -> 0.0.0.0:32774
6331/tcp -> 0.0.0.0:32773

Autor
Kategorien container, docker

PRTG Map