Linux

從 Docker 容器內部訪問 localhost 服務

  • September 7, 2019

我有一個綁定到本地主機的服務,我希望能夠從 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 for 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 for linux 目前沒有乾淨的方法來獲取主機的 IP…

獲取主機 IP 地址的簡潔方法是使用容器內可見的預設網關地址。這是您的容器連接到的主機上的網橋介面的地址。您的主機上偵聽所有介面的任何服務都可以通過此地址訪問。

但是,僅綁定到 localhost 的服務不是…

這是完全可以預料的:監聽 localhost 地址的服務只能從本地主機訪問。無法從本地連接網路上的另一台主機訪問它(從網路角度來看,這實際上是您的容器)。

如果您希望能夠從您的容器訪問主機服務,您將需要:

  • 讓服務監聽所有地址 ( 0.0.0.0),
  • 讓服務在適當的 docker 網橋地址上顯式偵聽,或者
  • 讓服務監聽其他地址並將該地址作為環境變數或通過其他配置機制傳遞到容器中

引用自:https://serverfault.com/questions/982118