1 回答

TA貢獻1811條經(jīng)驗 獲得超6個贊
當(dāng)您指定要偵聽的主機名或 IP 地址(在本例中l(wèi)ocalhost解析為127.0.0.1)時,您的服務(wù)器將僅偵聽該 IP 地址。
當(dāng)您在 Docker 容器之外時,監(jiān)聽localhost不是問題。如果您的服務(wù)器只監(jiān)聽127.0.0.1:8000,那么您的客戶端可以輕松連接到它,因為連接也是從127.0.0.1.
當(dāng)你在 Docker 容器中運行你的服務(wù)器時,它只會像以前一樣監(jiān)聽127.0.0.1:8000。這127.0.0.1是一個本地環(huán)回地址,在容器外無法訪問。
當(dāng)您使用 啟動 docker 容器時-p 8000:8000,它會將前往的流量轉(zhuǎn)發(fā)127.0.0.1:8000到容器的 IP 地址,在我的例子中是172.17.0.2.
容器在 docker0 網(wǎng)絡(luò)接口中獲取 IP 地址(您可以使用命令查看ip addr ls)
因此,當(dāng)您的流量被轉(zhuǎn)發(fā)到 上的容器時172.17.0.2:8000,那里沒有任何監(jiān)聽并且連接嘗試失敗。
修復(fù):
問題出在監(jiān)聽地址上:
server := http.Server{Addr: "localhost:8000"}
要解決您的問題,請將其更改為
server := http.Server{Addr: ":8000"}
這將使您的服務(wù)器監(jiān)聽所有容器的 IP 地址。
附加信息:
當(dāng)您在 Docker 容器中公開端口時,Docker 將創(chuàng)建 iptables 規(guī)則來執(zhí)行實際的轉(zhuǎn)發(fā)??吹竭@個。您可以使用以下方式查看這些規(guī)則:
iptables -n -L
iptables -t nat -n -L
- 1 回答
- 0 關(guān)注
- 270 瀏覽
添加回答
舉報