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

Доступ к службе Localhost из контейнера Docker

У меня есть служба, привязанная к локальному хосту, к которой я хотел бы получить доступ из контейнера Docker. Соответствующий вывод netstat: (Служба находится на порту 1143)

$ netstat -tulpn
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nam
tcp        0      0 127.0.0.1:1143          0.0.0.0:*               LISTEN      23317/protonmail-br
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1527/sshd

Поскольку у Docker для Linux в настоящее время нет чистого способа получить IP-адрес хоста, я использую qoomon / docker-host образ обходного пути, который показывает хост через мостовую сеть. Я могу получить доступ к хосту из моего контейнера, используя dockerhost:

bash-5.0# ping dockerhost
PING dockerhost (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: seq=0 ttl=64 time=0.187 ms
64 bytes from 172.22.0.2: seq=1 ttl=64 time=0.298 ms
64 bytes from 172.22.0.2: seq=2 ttl=64 time=0.126 ms

Я использую telnet чтобы узнать, может ли контейнер подключиться к порту.

Услуги, связанные с 0.0.0.0 доступны:

bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

Однако служба, привязанная только к localhost, не является:

bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.22.0.2): Connection refused

Как я могу получить доступ к этой службе из контейнера, не подвергая службу внешнему миру?

Поскольку Docker для Linux в настоящее время не имеет чистого способа получить IP-адрес хоста ...

Чистый способ получить IP-адрес для вашего хоста - использовать адрес шлюза по умолчанию, видимый внутри вашего контейнера. Это адрес интерфейса моста на хосте, к которому подключен ваш контейнер. Любая служба на вашем хосте, прослушивающая все интерфейсы, будет доступна по этому адресу.

Однако служба, привязанная только к localhost, не ...

Это вполне ожидаемо: к службе, прослушивающей адрес localhost, можно получить доступ только с локального хоста. К нему нельзя получить доступ с другого хоста в локально подключенной сети (что фактически является вашим контейнером с точки зрения сети).

Если вы хотите иметь доступ к службе хоста из вашего контейнера, вам необходимо:

  • Служба прослушивает все адреса (0.0.0.0),
  • Попросите службу явно прослушивать соответствующий адрес моста докеров, или
  • Попросите службу прослушивать какой-либо другой адрес и передать этот адрес в контейнер в качестве переменной среды или через какой-либо другой механизм конфигурации.

Я решил эту проблему в итоге с помощью таблиц IP.

Я добавил свое решение здесь, в stackoverflow:

https://stackoverflow.com/a/57833573/10735374