Подтвердить что ты не робот

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

У меня есть хост докера и внутри у меня есть один контейнер.

Хост 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 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
4b9b3361

Ответ 1

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

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

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

Ответ 2

Установка net.ipv6.conf.all.forwarding = 1 решит проблему. работать на меня

Ответ 3

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

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

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