我已阅读 docker API 并尝试创建一个简单的容器并公开 1 个端口。
在我的示例中,我有一个应用程序侦听容器内的 TCP 端口
9595
,我想从外部世界(即容器的主机)在端口 9090
上访问它。
创建容器时,我有
"ExposedPorts": { "9595/tcp: {}" }
和 "PortBindings": { "9595/tcp": [{ "HostPort": "9090" }] }
。
所以,如果我从主机访问
http://container_internal_ip:9595
它就可以了!但是,当我访问 http://localhost:9090
(这是我期望使用此端口映射功能时)时,它不起作用...
跑步时
docker port containerID
我有9595/tcp -> 0.0.0.0:9090
,这应该意味着,when connecting to any IP on the host, at port 9090, forward to the container in port 9595
。
那么,这里出了什么问题呢?为什么我无法连接到 9090?
我很感激任何澄清。
该端口确实按照预期暴露给“外部世界”,只是由于当前的 Windows 网络限制,它恰好无法从环回接口(localhost 或 127.0.0.1)上的容器主机本身访问。不要尝试通过容器主机上的环回接口访问它,而是尝试使用容器主机 IP 和容器公开的端口号从网络上的另一台计算机访问它。
有一篇很好的文章,位于 https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/
请发布您正在使用的docker命令。
如果您使用 Docker Toolbox 或 Docker for Windows,则需要特殊对待。您应该会看到 localhost 没有问题(如果您的容器是 Linux)。如果您希望您的容器从外部可见,请尝试使用 Elevated Power Shell:
netsh interface portproxy add v4tov4 listenaddress=yourip listenport=9090 connectaddress=10.0.75.1 connectport=9090
如果您的容器是 Windows,但是您不会看到 localhost 并且您需要使用容器内部地址:
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" <cointainerid>
参考:https://www.docker.com/blog/build-your-first-docker-windows-server-container/
问候