it-swarm.com.de

Legen Sie fest, dass Docker IPv4 für die Portbindung verwendet

Ich habe Docker Host und im Inneren 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 den Port 40122 auf dem Host, der mit dem Port 22 auf dem Container verbunden werden soll.

Ich möchte in diesen Container SSH, kann aber nicht nur an IPv6 gebunden werden

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
69
user3214546

Wie @ daniel-t im Kommentar ausführt: github.com/docker/docker/issues/2174 zeigt an, dass nur IPv6 in netstat gebunden wird, 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 diese Adresse in IPv6 (als :: 0) vorhanden ist, und öffnet sie auf beiden (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-System handelt, das jedoch weiterhin IPv4 ü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 betrachten, ist es weiterhin in der Lage, über IPv4 zu kommunizieren, es sei denn, Sie haben IPv6 so eingestellt, dass es nur mit der Einstellung net.ipv6.bindv6only an IPv6 bindet. Um klar zu sein, sollte net.ipv6.bindv6only 0 sein - Sie können sysctl net.ipv6.bindv6only Ausführen, um dies zu überprüfen.

47
Michael

Das Festlegen von net.ipv6.conf.all.forwarding = 1 behebt das Problem. arbeite für mich

5
LuciferJack

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

  • finde die Einstellungsdatei
    • / etc/sysconfig/docker-network unter RedHat gleichermaßen
    • / etc/default/docker-network unter Debian und anderen
  • bearbeiten Sie die Netzwerkeinstellungen
    • fügen Sie 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 bei mir auf docker 1.9.1

0
Sylvain