Как получить доступ к портам на хосте из контейнера Docker
Если вы подключаетесь к внешнему миру, Docker ведет себя так, как будто запрос исходит от хост-компьютера. Но если вы хотите получить доступ к процессам, запущенным на хосте, вашему брандмауэру может потребоваться дополнительная настройка.
Решение: добавьте правило брандмауэра для 172.18.0.0/16.
Если вы только что попытались получить доступ к процессу, запущенному на хост-компьютере, например к службе HTTP, вы могли быть заблокированы. Это связано с тем, что, несмотря на то, что контейнеры Docker работают на хосте, они используют некоторые специальные сети внутри, чтобы держать их логически разделенными, и из-за этого у них разные IP-адреса.
Вы можете увидеть это при запуске ifconfig
, вы увидите свой стандартный сетевой интерфейс, а также интерфейс docker0
. По умолчанию Docker использует блок 172.18.0.0/16 для выделения IP-адресов контейнера.
Исправить это очень просто — откройте этот диапазон портов в брандмауэре. Запросы из диапазона IP-адресов, которые использует Docker, скорее всего, будут заблокированы. Это частный диапазон IP-адресов, поэтому риск его открытия минимален. Для UFW это будет:
sudo ufw allow from 172.18.0.0/24
Необязательное указание порта для открытия:
sudo ufw allow from 172.18.0.0/24 to any port 9200
Для iptables
это будет:
iptables --append INPUT --protocol tcp --src 172.18.0.0/24 --jump DROP
Для служб управляемого хостинга, таких как AWS, вам может не потребоваться ничего менять — группы безопасности — это сетевые брандмауэры, которые находятся перед экземплярами и не должны влиять на внутренний трафик.