У меня есть служба, привязанная к локальному хосту, к которой я хотел бы получить доступ из контейнера 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: