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

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

Хост-докер привязывает порт только к интерфейсу 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 

Как отмечает @ 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 для проверки.

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

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

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