Зробіть докер використання IPv4 для прив’язки портів


97

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

Хост докера прив'язує порт лише до інтерфейсу 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 допом

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

Якою командою ви запустили контейнер? Також опублікуйте результат, docker psколи контейнер працює.
Даніель т.

Чи можете ви підтвердити, що sshd насправді працює на контейнері? Запустіть docker exec -ti 201bde6c839a /bin/bash, як тільки ви ввійдете, опублікуйте вихідні дані ps aux іnetstat -taln
Даніель т.

У моєму хості Docker всі докерські порти слухають IPv6 і не мають проблем з підключенням до ssh на контейнерах.
Даніель т.

@Danielt. я додав інформацію. Я можу ssh використовувати exec, але я не можу ssh в контейнер безпосередньо ззовні, використовуючи порт хосту 40122 від mac
user3214546

Ви можете зачепити цю проблему github.com/docker/docker/issues/2174 , я не впевнений, чи вона вирішена. Чи можете ви також поділитися тим, як ви намагаєтесь підключитися через ssh, і помилкою, яку ви отримуєте?
Даніель т.

Відповіді:


72

Як зазначає @ 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 із налаштуванням net.ipv6.bindv6only. Щоб бути зрозумілим, net.ipv6.bindv6only має бути рівним 0 - ви можете запустити sysctl net.ipv6.bindv6onlyдля перевірки.


4
Насправді це велика проблема. Загальнодоступна хмара, як Azure, не дуже добре говорить про IPV6, наприклад, загальнодоступний балансир навантаження Azure робить спробу IPV4 як серверну систему.
Томас Деко,

1
Здається, вам може знадобитися встановити "Розширення Docker VM" в Azure і використовувати Ubuntu 14.04 LTS. Однак я не думаю, що проблема з ipv6 є, оскільки це лише на локальному хості, а не в мережі.
Майкл

Ви маєте рацію, проблема була в моєму конфігу (вимкнення IPV6 - це не гарна ідея ^^)
Томас Деко

1
@bigdong ти хочеш ipv6 на.
Майкл

1
@Michael Ти мій заощаджувач часу. :)
lv0gun9

6

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

Це можна зробити в живій системі за допомогою sudo sysctl -w net.ipv6.conf.all.forwarding=1


Ця відповідь має одну перевагу: вона дозволяє "виправити" проблему без необхідності перезапускати демон Docker (відповідь із зміною конфігурації docker нижче). Щодо верхньої, вибраної відповіді: я насправді мав, sysctl net.ipv6.bindv6only=0тому зміна цього конфігура не допомогла.
пкоперек


0

Якщо ви хочете, щоб порти контейнерів прив’язувались до вашої адреси 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 1.9.1


1
це працює на debian? це не повинно бути / etc / default / docker?
Димитрій Копріва

1
@BigDong дякую за коментар, я на RedHat, як ОС, тому шлях трохи відрізняється від однієї ОС до іншої. Я спробував відобразити ваш коментар у відповіді
Сільвен

-1

Я зміг отримати доступ до контейнера докера після відключення SELinux

Щоб тимчасово вимкнути SELinux #sudo setenforce 0

Мої контейнери-докери працювали на Centos-7

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.