【问题标题】:Cannot connect from host to exposed port inside container无法从主机连接到容器内的暴露端口
【发布时间】:2021-11-28 21:33:00
【问题描述】:

我有一个简单的应用程序,它在端口 5001 上侦听 http 请求,并在该端口上收到 http 请求时返回“hello”。 然后我为应用程序构建映像并使用端口映射docker run -dp 5001:5001 --name web-server web-server 运行容器,但是当我转到浏览器并点击 localhost:5001 时,它就不起作用了。 所以,我 ssh 进入容器和curl localhost:5001,这个工作。 你能告诉我可能有什么问题或配置错误吗?

这是我的Dockerfile 文件

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY ./bin/Release/net5.0 .
EXPOSE 5001
ENTRYPOINT ["dotnet", "WebServerFromScratch.dll"]

docker container inspect中的NetworkSettings

"Ports": {
             "5001/tcp": [
             {
               "HostIp": "0.0.0.0",
               "HostPort": "5001"
             },
             {
               "HostIp": "::",
               "HostPort": "5001"
             }]
         },
"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f227d735df3f23edc2f2aaf1a800bdeb70cf60caf50e08dc6b594b94cb38a1fb",
                    "EndpointID": "824ee71d4ed0a7e08080aeb728cf1f6821c5cdd7e2afbd6f1ca0327e68e47d44",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }

【问题讨论】:

  • 不起作用是什么意思? localhost:5001 将命中本地机器端口
  • @viveknuna 它没有像我预期的那样返回“你好”
  • 有什么错误吗?
  • 在哪个 IP/接口上监听容器内的网络服务器? localhost/127.0.0.1/::1 不足以接受来自 172.17.0.0/16 的连接
  • 试试看 ;) 我不能自己尝试。

标签: c# docker docker-network


【解决方案1】:

在来自 Microsoft 的 aspnet docker 映像中,将 ASPNETCORE_URLS 环境变量的值定义为 http://+:80,这使得 docker 化的应用程序默认侦听端口 80。

如果您查看容器中的日志,您应该能够看到一条消息,表明它正在侦听端口 80,如下所示

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80

所以当你运行它时,你应该像这样将你的外部端口映射到内部的 80 端口

docker run -dp 5001:80 --name web-server web-server

那么你应该可以使用curl http://localhost:5001/从主机访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2017-10-12
    • 2021-08-05
    • 2020-01-31
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多