1 回答
TA贡献1811条经验 获得超6个赞
当您指定要侦听的主机名或 IP 地址(在本例中localhost解析为127.0.0.1)时,您的服务器将仅侦听该 IP 地址。
当您在 Docker 容器之外时,监听localhost不是问题。如果您的服务器只监听127.0.0.1:8000,那么您的客户端可以轻松连接到它,因为连接也是从127.0.0.1.
当你在 Docker 容器中运行你的服务器时,它只会像以前一样监听127.0.0.1:8000。这127.0.0.1是一个本地环回地址,在容器外无法访问。
当您使用 启动 docker 容器时-p 8000:8000,它会将前往的流量转发127.0.0.1:8000到容器的 IP 地址,在我的例子中是172.17.0.2.
容器在 docker0 网络接口中获取 IP 地址(您可以使用命令查看ip addr ls)
因此,当您的流量被转发到 上的容器时172.17.0.2:8000,那里没有任何监听并且连接尝试失败。
修复:
问题出在监听地址上:
server := http.Server{Addr: "localhost:8000"}
要解决您的问题,请将其更改为
server := http.Server{Addr: ":8000"}
这将使您的服务器监听所有容器的 IP 地址。
附加信息:
当您在 Docker 容器中公开端口时,Docker 将创建 iptables 规则来执行实际的转发。看到这个。您可以使用以下方式查看这些规则:
iptables -n -L
iptables -t nat -n -L
- 1 回答
- 0 关注
- 179 浏览
添加回答
举报