我的设置如下:
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.
答案 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"
您需要类似的配置。