ASP.NET Docker 未向浏览器提供 Web 应用程序
ASP.NET on Docker Not Serving Web App to Browser
当 Web 应用程序容器化在 Docker 中时,我无法让我的 ASP.NET Web 应用程序服务到我的浏览器。
我正在 运行创建一个 Mac,我已经使用 Visual Studio 代码创建了一个 ASP.NET 网络应用程序。这是一个简单的开箱即用演示,它基于 yo aspnet
"Empty Application." 当 运行 "native"(Docker 之外)时,此应用程序提供 "Hello World!" 到 http://localhost:5000 就好了。换句话说,运行ning dnx web
启动网络服务器 (Kestrel) 并产生:
Hosting environment: Production
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
这很好。现在输入 Docker。我似乎已经成功构建了一个包含 Web 应用程序的 Docker 图像,当我 运行 容器在 Docker 时,我从 Kestrel 得到了相同的输出。也很好,但是,我无法再在 http://localhost:5000 的浏览器中加载 "Hello World!" 页面。相反,我得到一个 ERR_CONNECTION_REFUSED
。这是相当明显的,因为由于 Docker "indirection," 没有任何东西直接服务于端口 5000。换句话说,我认为转发配置不正确,或者,我认为我误解了寻址。
我相信端口转发参与了这个过程。在我的 Docker 文件中,我使用了一个 EXPOSE 5000
,我认为它可以让我使用 运行 命令将我对端口 5000 的本地使用映射到 Docker 容器的端口 5000像这样:
docker run -i -t -p 5000:5000 container_name
但 http://localhost:5000 (ERR_CONNECTION_REFUSED
) 并非如此。所以我想到 Docker 几乎肯定不在 localhost
。我注意到 Docker 加载时,它说:
docker is configured to use the default machine with IP 192.168.99.100
所以,我想我会尝试 http://192.168.99.100:5000, but again (confusingly?) ERR_CONNECTION_REFUSED
. Next, I read an interesting article here 并且我能够从建议的命令中确定
docker inspect container_name | grep IPAddress
容器已分配"IPAddress": "172.17.0.2"
所以,我想我会尝试 http://172.17.0.2:5000。现在我们可能真的有所进展,因为我得到的不是 ERR_CONNECTION_REFUSED
,而是一个旋转的沙漏和由此产生的超时。但是还是没有"Hello World!"
我可能遗漏了什么?
事实证明,Web 应用程序 在虚拟机 192.168.99.100
的 IP 地址上 可用,正如所怀疑的那样。 172.17.0.2
显然是某种转移注意力的东西。
真正的问题似乎是容器的默认 "internal" IP 是 0.0.0.0
根据 this posting 的出色建议,我编辑了 Dockerfile 并指定了以下内容:
ENTRYPOINT ["dnx", "web", "--server.urls", "http://0.0.0.0:5000"]
因为...
This will allow our web application to serve requests that come in from the
port forwarding provided by Docker which defaults to 0.0.0.0
端口映射对于 link 主机到容器的端口至关重要,但 EXPOSE
命令显然是多余的。现在,当我 运行
docker run -i -t -p 80:5000 container_name
我可以简单地浏览到 http://192.168.99.100(端口 80 是隐含的)
还有中提琴!这是我的 "Hello World!"
除了使用 http://0.0.0.0:5000 你还可以使用 http://*.5000
ENTRYPOINT ["dnx", "web", "--server.urls", "http://*:5000"]
或者您可以将其包含在运行时环境中
"commands": {
"kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:5004"
},
"web": ......
并且 dockerfile 中的入口点可以是
ENTRYPOINT ["dnx","-p","project.json","kestrel"]
当 Web 应用程序容器化在 Docker 中时,我无法让我的 ASP.NET Web 应用程序服务到我的浏览器。
我正在 运行创建一个 Mac,我已经使用 Visual Studio 代码创建了一个 ASP.NET 网络应用程序。这是一个简单的开箱即用演示,它基于 yo aspnet
"Empty Application." 当 运行 "native"(Docker 之外)时,此应用程序提供 "Hello World!" 到 http://localhost:5000 就好了。换句话说,运行ning dnx web
启动网络服务器 (Kestrel) 并产生:
Hosting environment: Production
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
这很好。现在输入 Docker。我似乎已经成功构建了一个包含 Web 应用程序的 Docker 图像,当我 运行 容器在 Docker 时,我从 Kestrel 得到了相同的输出。也很好,但是,我无法再在 http://localhost:5000 的浏览器中加载 "Hello World!" 页面。相反,我得到一个 ERR_CONNECTION_REFUSED
。这是相当明显的,因为由于 Docker "indirection," 没有任何东西直接服务于端口 5000。换句话说,我认为转发配置不正确,或者,我认为我误解了寻址。
我相信端口转发参与了这个过程。在我的 Docker 文件中,我使用了一个 EXPOSE 5000
,我认为它可以让我使用 运行 命令将我对端口 5000 的本地使用映射到 Docker 容器的端口 5000像这样:
docker run -i -t -p 5000:5000 container_name
但 http://localhost:5000 (ERR_CONNECTION_REFUSED
) 并非如此。所以我想到 Docker 几乎肯定不在 localhost
。我注意到 Docker 加载时,它说:
docker is configured to use the default machine with IP 192.168.99.100
所以,我想我会尝试 http://192.168.99.100:5000, but again (confusingly?) ERR_CONNECTION_REFUSED
. Next, I read an interesting article here 并且我能够从建议的命令中确定
docker inspect container_name | grep IPAddress
容器已分配"IPAddress": "172.17.0.2"
所以,我想我会尝试 http://172.17.0.2:5000。现在我们可能真的有所进展,因为我得到的不是 ERR_CONNECTION_REFUSED
,而是一个旋转的沙漏和由此产生的超时。但是还是没有"Hello World!"
我可能遗漏了什么?
事实证明,Web 应用程序 在虚拟机 192.168.99.100
的 IP 地址上 可用,正如所怀疑的那样。 172.17.0.2
显然是某种转移注意力的东西。
真正的问题似乎是容器的默认 "internal" IP 是 0.0.0.0
根据 this posting 的出色建议,我编辑了 Dockerfile 并指定了以下内容:
ENTRYPOINT ["dnx", "web", "--server.urls", "http://0.0.0.0:5000"]
因为...
This will allow our web application to serve requests that come in from the port forwarding provided by Docker which defaults to 0.0.0.0
端口映射对于 link 主机到容器的端口至关重要,但 EXPOSE
命令显然是多余的。现在,当我 运行
docker run -i -t -p 80:5000 container_name
我可以简单地浏览到 http://192.168.99.100(端口 80 是隐含的)
还有中提琴!这是我的 "Hello World!"
除了使用 http://0.0.0.0:5000 你还可以使用 http://*.5000
ENTRYPOINT ["dnx", "web", "--server.urls", "http://*:5000"]
或者您可以将其包含在运行时环境中
"commands": {
"kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:5004"
},
"web": ......
并且 dockerfile 中的入口点可以是
ENTRYPOINT ["dnx","-p","project.json","kestrel"]