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