Назад | Перейти на главную страницу

Контейнеры Docker не могут получить доступ к опубликованным портам на IP-адресе хоста

У меня есть два контейнера, работающих в сети моста докеров (это может быть значение по умолчанию docker0, или пользовательский мост). Если я публикую порты из одного контейнера, другой контейнер не сможет получить доступ к этим опубликованным портам через IP-адрес хоста.

Пример:

$ docker run --detach -p 80:80 nginx
$ docker run --rm -it centos \
  /bin/bash -c "yum install -y wget && wget http://${HOST_IP}"
...
Connecting to ${HOST_IP}:80... failed: No route to host.

В приведенном выше примере к серверу nginx можно получить доступ с хоста и других серверов в сети (или в Интернете). Однако контейнер докеров centos, который имеет полный доступ к сети, не может подключиться к порту 80 на хосте. Доступ ко всем портам на хосте возможен без проблем, если он не находится на сетевом мосту докеров.

Я обнаружил, что брандмауэры полностью отключены (firewalld и iptables), а перезапуск службы docker открывает доступ, поэтому я достаточно уверен, что это проблема брандмауэра. я нашел этот докер libnetwork PR, но не было никакой активности в течение 6 месяцев.

Я упустил что-то фундаментальное о докере? Разве два контейнера в одной сети моста не должны иметь возможность общаться через порт публикации? Я должен добавить, что если я попытаюсь получить доступ к порту nginx напрямую, используя IP-адрес внутренней частной сети (172.X.X.X) изнутри контейнера centos, тогда он сработает. Это только при подключении к опубликованному порту хоста.

Я обнаружил, что это происходит как с последними образами centos (7.4.1708), так и с изображениями fedora (28).