我有一个绑定到本地主机的服务,我希望能够从 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
由于 Linux 版 Docker 目前没有干净的方法来获取主机的 IP,因此我使用qoomon/docker-主机解决方法图像通过桥接网络公开主机。我可以使用以下方法从容器访问主机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
我如何从容器内部访问此服务,无需将服务暴露给外界?
答案1
由于Docker for linux目前没有干净的方法来获取主机的IP...
获取主机 IP 地址的最简单方法是使用容器内可见的默认网关地址。这是容器所连接的主机上的桥接接口的地址。主机上监听所有接口的任何服务都可以通过此地址访问。
但是,仅绑定到localhost的服务是不...
这是完全可以预料到的:监听本地主机地址的服务只能从本地主机访问。无法从本地连接网络上的其他主机访问(从网络角度来看,这实际上是您的容器)。
如果您希望能够从容器访问主机服务,则需要执行以下操作之一:
- 让服务监听所有地址(
0.0.0.0
), - 让服务明确监听相应的 docker 桥接地址,或者
- 让服务监听其他地址,并将该地址作为环境变量或通过其他配置机制传递到容器中