从 Docker 容器内部访问 Localhost 服务

从 Docker 容器内部访问 Localhost 服务

我有一个绑定到本地主机的服务,我希望能够从 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 桥接地址,或者
  • 让服务监听其他地址,并将该地址作为环境变量或通过其他配置机制传递到容器中

答案2

我最终使用 IP 表解决了这个问题。

我在 stackoverflow 上添加了我的解决方案:

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

相关内容