Mein Szenario: Ich möchte, dass meine Docker-basierten Dienste wissen, welche IP sie aus dem Web aufruft (eine Anforderung meiner Anwendung).
Ich laufe auf einem Cloud-VPS, Debian Jessie, mit Docker 1.12.2.
Ich benutze nc
im ausführlichen Modus, um den Port zu öffnen 8080
.
docker run --rm -p "8080:8080" centos bash -c "yum install -y nc && nc -vv -kl -p 8080"
Angenommen, der VPS hat die Domäne example.com
und von meinem anderen Computer, der beispielsweise die IP-Adresse hat, die dead:::::beef
ich anrufe
nc example.com 8080
Der Server sagt:
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8080
Ncat: Listening on 0.0.0.0:8080
Ncat: Connection from 172.17.0.1.
Ncat: Connection from 172.17.0.1:49799.
172.17.0.1
befindet sich im lokalen Netzwerk des Servers und hat natürlich nichts mit meinem Client zu tun. Eigentlich:
docker0 Link encap:Ethernet HWaddr ....
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
Wenn ich den Container im Host-Netzwerkmodus starte
docker run --rm --net=host -p "8080:8080" centos bash -c "yum install -y nc && nc -vv -kl -p 8080"
und rufe meinen Server erneut an
nc example.com 8080
Ich bekomme das erwartete Ergebnis:
Ncat: Connection from dead:::::beef.
Ncat: Connection from dead:::::beef:55650.
Meine Fragen sind:
- Warum "maskiert" Docker IPs, wenn es sich nicht im Host-Netzwerkmodus befindet? Ich denke, der Docker-Daemon-Prozess ist wahrscheinlich derjenige, der den Port öffnet, die Verbindung empfängt und sie dann über seine eigene interne virtuelle Netzwerkschnittstellenverbindung an den Containerprozess weiterleitet.
nc
Wenn Sie im Container ausgeführt werden, wird nur angezeigt, dass der Aufruf von der IP-Adresse des Docker-Daemons stammt. - (Wie) kann ich meinen Docker-Dienst über externe IP-Adressen informieren, die ihn aufrufen, ohne alles in den Host-Modus zu versetzen?