如何连接到在Docker容器中运行的服务器?
我正在计算机上运行Docker容器。 该容器包含一个Java应用程序,用于启动监听http://localhost:9000
的服务器。 当我运行没有Docker的代码时,连接到服务器是微不足道的,但是在Docker容器中运行时遇到了一些问题。 我的docker run
命令如下所示:
docker run -p 9000 -t -i my-image
docker inspect
的NetworkSettings
输出如下所示:
"NetworkSettings": { "Bridge": "", "SandboxID": "f9c77b7ae7804583fa60211b7d8cfeec5f154b29f9d174a4f0cdb5a8d6e41126", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "9000/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "32768" } ] }, "SandboxKey": "/var/run/docker/netns/f9c77b7ae780", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "10b80d9de186be6ddf9e9d3bb1945124ec1fab7774a135720569e2bf4db3306e", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "EndpointID": "10b80d9de186be6ddf9e9d3bb1945124ec1fab7774a135720569e2bf4db3306e", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02" } } }
我曾尝试连接到localhost:9000
, localhost:32768
localhost:9000
和172.17.0.2:32768
无济于事。 我如何连接到在Docker镜像中运行的服务器?
如果你在OSX上,这意味着你正在为你的docker环境使用一个VirtualBox虚拟机。
确保你已经把你的端口9000转发给你的实际主机(mac),为了使这个端口在本地主机上可见。
这对旧的boot2docker或新的docker机器有效。
VBoxManage controlvm "boot2docker-vm" --natpf1 "tcp-port9000 ,tcp,,9000,,9000" VBoxManage controlvm "boot2docker-vm" --natpf1 "udp-port9200 ,udp,,9000,,$9000
(如果VM正在运行, modifyvm
controlvm
如果VM已停止, modifyvm
)
(用你的vm的名字replace“ boot2docker-vm
”:参见docker docker-machine ls
)
(使用-p 9000:9000
来依靠静态端口映射)
您可以尝试从VirtualBox主机环境访问您的容器。 使用-p 9000:9000
选项运行容器:
docker run -p 9000:9000 -t -i my-image
然后运行docker-machine来查找docker主机的IP:
docker-machine ip default
然后从上面的命令的输出访问您的Java应用程序。 例如,如果它是192.168.99.100: