Linux
從 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
由於 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 網橋地址上顯式偵聽,或者
- 讓服務監聽其他地址並將該地址作為環境變數或通過其他配置機制傳遞到容器中