我正在阅读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?
我感谢任何澄清。
答案 0 :(得分:5)
该港口确实暴露在外面的世界中。正如预期的那样,由于当前的Windows网络限制,它恰好无法从环回接口(localhost或127.0.0.1)上的容器主机本身访问。而不是尝试通过容器主机上的环回接口访问它,尝试使用容器主机ip和容器公开的端口号从网络上的另一台机器访问它。
https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/
有一个很好的写作答案 1 :(得分:3)
请发布您正在使用的泊坞窗命令。
如果您使用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://blog.docker.com/2016/09/build-your-first-docker-windows-server-container/
此致