Lassen Sie Docker IPv4 für die Portbindung verwenden

96

Ich habe Docker Host und drinnen habe ich einen Container.

Der Docker-Host bindet den Port nur an die IPv6-Schnittstelle, nicht an IPv4.

Dies ist die Ausgabe

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:55082           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::40280                :::*                    LISTEN      -
tcp6       0      0 :::5432                 :::*                    LISTEN      -
tcp6       0      0 :::40122                :::*                    LISTEN      -
tcp6       0      0 :::36378                :::*                    LISTEN      -
tcp6       0      0 :::40543                :::*                    LISTEN      -
tcp6       0      0 :::111                  :::*                    LISTEN      -

Jetzt habe ich 40122 Port auf Host, um mit Port 22 auf Container zu verbinden.

Ich möchte SSH in diesen Container, aber ich kann nicht als einzige an IPv6 gebunden sein

Dies ist meine Docker-Version Docker version 1.5.0, build a8a31ef

docker ps

201bde6c839a        myapp:latest   "supervisord -n"    3 weeks ago         Up 2 hours          0.0.0.0:40122->22/tcp, 0.0.0.0:40280->80/tcp, 0.0.0.0:40543->443/tcp   myapp

Ich rannte mit docker run -d -P -p 40122:22

netstat -tlna

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3031          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::6379                 :::*                    LISTEN

ps aux

root         1  0.0  0.8  52440 16668 ?        Ss   00:53   0:03 /usr/bin/python /usr/bin/supervisord -n
root        49  0.0  0.1  17980  3048 ?        S    01:32   0:00 bash
root        64  0.0  0.1  46632  2712 ?        S    01:32   0:00 su -l vagrant
vagrant     65  0.0  0.1  21308  3760 ?        S    01:32   0:00 -su
root       288  0.0  0.1  17980  3088 ?        S    02:01   0:00 bash
root       304  0.0  0.1  46632  2720 ?        S    02:01   0:00 su -l vagrant
vagrant    305  0.0  0.1  21304  3804 ?        S    02:01   0:00 -su
vagrant    308  0.0  3.7 429616 75840 ?        Sl+  02:01   0:05 python ./manage.py shell_plus
root       654  0.0  0.4  47596  9848 ?        S    03:12   0:01 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       655  0.0  0.3  90280  7732 ?        S    03:12   0:00 nginx: master process /usr/sbin/nginx
www-data   656  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   657  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   658  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   659  0.0  0.2  90940  4500 ?        S    03:12   0:00 nginx: worker process
root       660  0.0  0.2  61372  5332 ?        S    03:12   0:00 /usr/sbin/sshd -D
root       669  0.0  0.4  37004  8892 ?        Sl   03:12   0:01 redis-server *:6379
root       856  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       857  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       858  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       859  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
vagrant    889  0.0  0.1  18692  2508 ?        R+   04:11   0:00 ps aux
user3214546
quelle
Mit welchem ​​Befehl haben Sie den Container gestartet? Veröffentlichen Sie auch die Ausgabe, docker pswenn der Container ausgeführt wird.
Daniel t.
Können Sie bestätigen, dass sshd tatsächlich auf dem Container ausgeführt wird? Führen Sie docker exec -ti 201bde6c839a /bin/bash, sobald Sie in sind, die Ausgabe von ps aux undnetstat -taln
Daniel t.
In meinem Docker-Host lauschen alle Docker-Ports IPv6 und haben keine Probleme, auf Containern eine Verbindung zu ssh herzustellen.
Daniel t.
@ Danielt. Ich habe die Info hinzugefügt. Ich bin in der Lage, ssh mit exec zu ssh, aber ich bin nicht in der Lage, direkt von außen in den Container zu ssh über den Host-Port 40122 von mac
user3214546
Sie könnten dieses Problem treffen github.com/docker/docker/issues/2174 , ich bin nicht sicher, ob es behoben ist. Können Sie auch mitteilen, wie Sie versuchen, über ssh eine Verbindung herzustellen, und welchen Fehler Sie erhalten?
Daniel t.

Antworten:

71

Wie @ daniel-t im Kommentar hervorhebt : Bei github.com/docker/docker/issues/2174 geht es darum, die Bindung nur an IPv6 in anzuzeigen netstat, aber das ist kein Problem. In diesem Github heißt es:

Beim Einrichten des Proxys fordert Docker die Loopback-Adresse '127.0.0.1' an. Linux erkennt, dass dies eine Adresse ist, die in IPv6 vorhanden ist (als :: 0) und auf beiden geöffnet wird (es handelt sich jedoch formal um einen IPv6-Socket). Wenn Sie netstat ausführen, wird dies angezeigt und es wird angezeigt, dass es sich um ein IPv6 handelt. IPv4 wird jedoch weiterhin überwacht. Wenn Sie ein wenig mit Ihren Einstellungen gespielt haben, haben Sie möglicherweise diesen Trick deaktiviert, den Linux ausführt - indem Sie net.ipv6.bindv6only = 1 setzen.

Mit anderen Worten, nur weil Sie es nur als IPv6 sehen, kann es weiterhin über IPv4 kommunizieren, es sei denn, Sie haben IPv6 so eingestellt, dass es nur mit der Einstellung net.ipv6.bindv6 nur an IPv6 bindet. Um klar zu sein, sollte net.ipv6.bindv6 nur 0 sein - Sie können es ausführen sysctl net.ipv6.bindv6only, um es zu überprüfen.

Michael
quelle
4
Das ist eigentlich ein großes Problem. Öffentliche Clouds wie Azure sprechen IPV6 nicht sehr gut. Beispielsweise versucht der öffentliche Azure-Load-Balancer, IPV4 als Backend zu verwenden.
Thomas Decaux
1
Möglicherweise müssen Sie die "Docker VM-Erweiterung" in Azure installieren und Ubuntu 14.04 LTS verwenden. Ich glaube jedoch nicht, dass es ein Problem mit IPv6 gibt, da dies nur auf dem lokalen Host und nicht im Netzwerk erfolgt.
Michael
Sie haben Recht, das Problem war in meiner Konfiguration (IPV6 zu deaktivieren ist keine gute Idee ^^)
Thomas Decaux
1
@bigdong du willst ipv6 auf.
Michael
1
@ Michael Du bist meine Zeitersparnis. :)
lv0gun9
6

Durch die Einstellung net.ipv6.conf.all.forwarding=1wird das Problem behoben.

Dies kann auf einem Live-System mit erfolgen sudo sysctl -w net.ipv6.conf.all.forwarding=1

LuciferJack
quelle
Diese Antwort hat einen Vorteil: Sie können das Problem "beheben", ohne den Docker-Daemon neu starten zu müssen (die Antwort mit der Änderung der Docker-Konfiguration unten). In Bezug auf die oberste, ausgewählte Antwort: Ich hatte tatsächlich sysctl net.ipv6.bindv6only=0so eine Änderung dieser Konfiguration nicht geholfen.
pkoperek
2

Standardmäßig verwendet Docker AF_INET6-Sockets, die sowohl für IPv4- als auch für IPv6-Verbindungen verwendet werden können. Dies führt dazu, dass netstat eine IPv6-Adresse für die Überwachungsadresse meldet.

Von RedHat https://access.redhat.com/solutions/3114021

Gerassimos Mitropoulos
quelle
0

Wenn Sie möchten, dass Ihre Container-Ports an Ihre IPv4-Adresse gebunden werden, gehen Sie einfach wie folgt vor:

  • Suchen Sie die Einstellungsdatei
    • / etc / sysconfig / docker-network auf RedHat gleichermaßen
    • / etc / default / docker-network auf Debian ans gleichermaßen
  • Bearbeiten Sie die Netzwerkeinstellungen
    • füge DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx hinzu
    • xx.xx.xx.xx ist dein echtes IPv4 (und nicht 0.0.0.0)
  • Starten Sie Docker Deamon neu

funktioniert für mich auf Docker 1.9.1

Sylvain
quelle
1
funktioniert das auf debian? sollte es nicht / etc / default / docker sein?
Dimitri Kopriwa
1
@ BigDong danke für den Kommentar, ich bin auf RedHat wie OS, also ist der Pfad ein wenig anders von einem Betriebssystem zum anderen. Ich habe versucht, Ihren Kommentar in der Antwort wiederzugeben
Sylvain
-1

Nach dem Deaktivieren von SELinux konnte ich auf den Docker-Container zugreifen

SELinux vorübergehend deaktivieren #sudo setenforce 0

Meine Docker-Container liefen auf Centos-7

Manjunath N.
quelle