如何连接到在Docker容器中运行的服务器?

我正在计算机上运行Docker容器。 该容器包含一个Java应用程序,用于启动监听http://localhost:9000的服务器。 当我运行没有Docker的代码时,连接到服务器是微不足道的,但是在Docker容器中运行时遇到了一些问题。 我的docker run命令如下所示:

 docker run -p 9000 -t -i my-image 

docker inspectNetworkSettings输出如下所示:

 "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:9000localhost:32768 localhost:9000172.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:

http://192.168.99.100:9000