Linux VM中的Docker无法连接到Web应用程序

时间:2015-11-10 21:41:31

标签: docker

我的设置如下:

Host: Win10
Guest: Ubuntu 15.10 (clean install, only docker and nodejs are added)
Base image: https://hub.docker.com/r/microsoft/aspnet/ 1.0.0-beta8-coreclr

在guest虚拟机中我安装了Docker并创建了图像(使用yeoman将示例webapp添加到上图中)。当我在容器内运行图像时,我可以使用来自linux的容器IP(例如172.17.0.2)来成功地ping容器IP。

$sudo docker run -d -p 80:5000 --name web myapp

$sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' "web"
172.17.0.2

$ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.060 ms
1 packets transmitted, 1 received, 0% packet loss, time 999ms

$curl 172.17.0.2:80
curl: (7) Failed to connect to 172.17.0.2 port 80: Connection refused

我也可以连接到容器并执行ping等命令,但是从linux机器(VirtualBox中的guest虚拟机,docker的主机)我无法访问容器内托管的Web应用程序,如上所示。我尝试了几种方法,比如映射到主机IP地址等,但没有一种方法有效。有没有人有想法从哪里开始?问题来自Docker是否安装在VirtualBox机器内?

提前谢谢。

编辑:以下是容器中的日志:

Could not open /etc/lsb_release. OS version will default to the empty string.
Hosting environment: Production
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

1 个答案:

答案 0 :(得分:2)

您的命令告诉Docker基本上将来自Linux guest虚拟机的端口80的请求代理到容器的端口5000。所以你试过的curl命令不起作用,因为你正在尝试容器上的端口80,而容器本身有一个服务侦听端口5000.

要直接连接容器,您可以使用(在Linux客户机上):

curl 172.17.0.2:5000

要通过Linux来宾(来自您的主机)上的已发布端口进行访问:

curl (Linux guest IP)

或(来自Linux嘉宾):

curl localhost

编辑:这也会有问题:

Now listening on: http://localhost:5000

您希望容器内的应用程序绑定到所有接口(0.0.0.0),以便侦听容器的已分配IP。使用localhost将无法访问。

您可能会发现此示例很有用:

https://github.com/aspnet/Home/blob/dev/samples/1.0.0-beta8/HelloWeb/project.json

此行指定应用程序绑定到端口5004上的所有接口(使用“*”):

21            "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:5004"

您需要类似的配置。