当 Web 应用程序容器化在 Docker 中时,我无法将 ASP.NET Web 应用程序提供给我的浏览器。
我正在运行 Mac,并使用 Visual Studio Code 创建 ASP.NET Web 应用程序。这是一个简单的、开箱即用的演示,基于yo aspnet
“空的应用程序。”当“本机”运行(在 Docker 之外)时,该应用程序提供“Hello World!”到http://本地主机:5000 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://本地主机:5000 http://localhost:5000。相反,我得到一个ERR_CONNECTION_REFUSED
。这是相当明显的,因为由于 Docker“间接”,不再有任何东西直接服务于端口 5000。换句话说,我认为转发配置不正确,或者我认为我误解了寻址。
我相信这个过程中涉及到端口转发。在我的 Dockerfile 中,我使用EXPOSE 5000
我认为这可以让我使用如下运行命令将本地使用的端口 5000 映射到 Docker 容器的端口 5000:
docker run -i -t -p 5000:5000 container_name
但情况并非如此http://本地主机:5000 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 http://192.168.99.100:5000,但又(令人困惑?)ERR_CONNECTION_REFUSED
。接下来,我读到一篇有趣的文章here https://stackoverflow.com/questions/19897743/exposing-a-port-on-a-live-docker-container我能够从建议的命令中确定
docker inspect container_name | grep IPAddress
容器已分配"IPAddress": "172.17.0.2"
所以,我想我会尝试http://172.17.0.2:5000 http://172.17.0.2:5000。现在我们可能真的有所进展,因为而不是ERR_CONNECTION_REFUSED
,我反而得到一个旋转的沙漏并导致超时。但仍然没有“Hello World!”
我可能会缺少什么?