Docker 上的 ASP.NET 不向浏览器提供 Web 应用程序

标签 asp.net http docker port

当我的 ASP.NET Web 应用程序在 Docker 中容器化时,我无法让我的浏览器为我的 ASP.NET Web 应用程序提供服务。

我运行的是 Mac,我使用 Visual Studio Code 创建了一个 ASP.NET 网络应用程序。这是一个简单的开箱即用演示,它基于 yo aspnet“空应用程序”。当运行“ native ”(在 Docker 之外)时,此应用程序提供一个“Hello World!”至 http://localhost:5000正好。换句话说,运行 dnx web 会启动 Web 服务器 (Kestrel) 并产生:

Hosting environment: Production 
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

这很好。现在进入 Docker。我似乎已经成功构建了一个包含 Web 应用程序的 Docker 镜像,当我在 Docker 中运行容器时,我从 Kestrel 获得了相同的输出。也很好,但是,我无法再加载“Hello World!”我浏览器中的页面 http://localhost:5000 .相反,我得到一个 ERR_CONNECTION_REFUSED。这是相当明显的,因为由于 Docker 的“间接”,不再有任何东西直接服务于端口 5000。换句话说,我认为转发配置不正确,或者我认为我误解了寻址。

我相信端口转发参与了这个过程。在我的 Dockerfile 中,我使用了一个 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 ,但又一次(令人困惑?) ERR_CONNECTION_REFUSED。接下来,我看了一篇有趣的文章here我能够从建议的命令中确定

docker inspect container_name | grep IPAddress

容器被分配"IPAddress": "172.17.0.2"

所以,我想我会尝试 http://172.17.0.2:5000 .现在我们可能真的有所进展,因为我得到的不是 ERR_CONNECTION_REFUSED,而是旋转的沙漏和由此产生的超时。但是仍然没有“Hello World!”

我可能遗漏了什么?

最佳答案

事实证明,Web 应用程序在虚拟机的 IP 地址192.168.99.100 上可用。 172.17.0.2 显然是某种转移注意力的东西。

真正的问题似乎是容器的默认“内部”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

端口映射对于将主机端口链接到容器端口至关重要,但是 EXPOSE 命令显然是多余的。现在,当我运行时

docker run -i -t -p 80:5000 container_name

我可以简单地浏览到 http://192.168.99.100 (端口 80 是隐式的)

还有中提琴!这是我的“Hello World!”

关于Docker 上的 ASP.NET 不向浏览器提供 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35731548/

相关文章:

asp.net - HTTP 错误 401.3 - 未经授权

asp.net - 如何正确测量 ASP.NET Core 请求持续时间?

Java HttpComponents 不使用原始 URL 进行 GET 请求

html - 使用fmt.Fprintf()发送文本/纯文本

java - 通过java套接字使用HTTP协议(protocol)上传文件

Docker - 服务器命中 EOF

c# - 不同域的登录页面

docker - 如何在具有可见浏览器的 docker 容器中运行 Selenium 测试?

docker - 如何获取schedule:run以在docker容器中与systemd一起使用?

asp.net - 在asp.net中获取绝对Url