Сделать docker использовать IPv4 для привязки портов

у меня есть Docker host, и внутри у меня есть один контейнер.

хост docker привязывает порт только к интерфейсу IPv6, а не к IPv4.

это выход

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      -

теперь у меня есть порт 40122 на хосте для связи с портом 22 на контейнере.

Я хочу SSH в этот контейнер, но я не могу его привязать только к IPv6

это моя версия docker 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

Я побежал через 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

3 ответов


как указывает @daniel-t в комментарии:github.com/docker/docker/issues/2174 показывает привязку только к IPv6 в netstat, но это не проблема. Как это GitHub выдает заявляет:

при настройке прокси-сервера Docker запрашивает обратный адрес "127.0.0.1", Linux понимает, что это адрес, который существует в IPv6 (как ::0) и открывается на обоих (но это формально сокет IPv6). Когда вы запускаете netstat, он видит это и говорит вам, что это IPv6 - но он все еще прослушивает IPv4. Если вы немного поиграли со своими настройками, вы, возможно, отключили этот трюк Linux - установив net.протокол IPv6.bindv6only = 1.

другими словами, только потому, что вы видите его только как IPv6, он все еще может взаимодействовать по IPv4, если у вас нет IPv6, установленного только для привязки IPv6 к сети.протокол IPv6.bindv6only установка. Для ясности, нет.протокол IPv6.bindv6only должно быть 0-вы можете запустить sysctl net.ipv6.bindv6only чтобы проверить.


настройки сети.протокол IPv6.conf.все.forwarding=1 исправит проблему. работай на меня!--1-->


Если вы хотите, чтобы ваши контейнерные порты привязывались к вашему ipv4-адресу, просто:

  • найти файл настроек
    • /etc/sysconfig / docker-сеть на RedHat так же
    • / etc / default / docker-network на Debian ANS alike
  • изменить настройки сети
    • добавить DOCKER_NETWORK_OPTIONS= - ip=xx.xx.xx.xx
    • xx.xx.xx.xx - ваш реальный ipv4 (а не 0.0.0.0)
  • перезагрузите настройки деамон

работает для меня на docker 1.9.1