无法连接到dotnetcore api的docker容器端口

无法连接到dotnetcore api的docker容器端口,docker,.net-core,asp.net-core-webapi,Docker,.net Core,Asp.net Core Webapi,我可以将localhost:5000卷曲到容器内部,但不能从外部卷曲,即使端口绑定添加为5000:5000 pramodjangam@Pramods-MacBook-Pro:~/code/helloworld$ curl localhost:5000/WeatherForecast curl: (52) Empty reply from server pramodjangam@Pramods-MacBook-Pro:~/code/helloworld$ docker ps CONTAINER

我可以将localhost:5000卷曲到容器内部,但不能从外部卷曲,即使端口绑定添加为5000:5000

pramodjangam@Pramods-MacBook-Pro:~/code/helloworld$ curl localhost:5000/WeatherForecast
curl: (52) Empty reply from server

pramodjangam@Pramods-MacBook-Pro:~/code/helloworld$ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                              NAMES
5f0c986867d9        kitematic/hello-world-nginx:latest   "sh /start.sh"           10 minutes ago      Up 10 minutes       0.0.0.0:32768->80/tcp              hello-world-nginx
1200a6c8c7df        helloworlddotnet                     "/bin/sh -c out/Hell…"   19 minutes ago      Up 19 minutes       0.0.0.0:5000-5001->5000-5001/tcp   great_haslett

pramodjangam@Pramods-MacBook-Pro:~/code/helloworld$ docker exec -it 1200a6c8c7df bash

root@1200a6c8c7df:/# curl localhost:5000

root@1200a6c8c7df:/# curl localhost:5000/WeatherForecast
[{"date":"2019-12-07T19:00:43.0919669+00:00","temperatureC":5,"temperatureF":40,"summary":"Balmy"},{"date":"2019-12-08T19:00:43.0920037+00:00","temperatureC":13,"temperatureF":55,"summary":"Cool"},{"date":"2019-12-09T19:00:43.0920128+00:00","temperatureC":52,"temperatureF":125,"summary":"Warm"},{"date":"2019-12-10T19:00:43.0920303+00:00","temperatureC":-3,"temperatureF":27,"summary":"Balmy"},{"date":"2019-12-11T19:00:43.0920383+00:00","temperatureC":46,"temperatureF":114,"summary":"Balmy"}]root@1200a6c8c7df:/# 
root@1200a6c8c7df:/# exit
exit
在容器内部,
localhost
指的是容器。在容器外部,
localhost
是您的机器,而不是容器。当您想要访问容器外部容器中运行的内容时,需要使用容器的IP地址,而不是
localhost

您可以使用以下方法获取容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_name_here]

我遇到过这样的问题。请确保在docker容器中运行的dotnet应用程序也在侦听所有网络接口

例如,每当我运行Django应用程序(在开发模式下)时,我总是确保看到如下消息:

Starting development server at http://0.0.0.0:8000/
这里的键是
0.0.0.0:8000
,这表示容器内的我的应用程序正在监听所有网络接口


另一种选择是使用主机网络模式运行容器()

我也遇到了同样的问题。这似乎是一个dotnet3.1问题。当我在容器中启动应用程序时,它只绑定到localhost:5000,而不绑定到其他网络接口。问题是localhost始终只能从主机(或者在本例中是容器)本身访问,即使您在docker中向前移植,它也无法工作

我试着加上

.UseUrls("http://0.0.0.0:5000")
发送到hostbuilder,使应用程序侦听所有可用的网络设备,但它不工作,添加:

ENV ASPNETCORE_URLS http://*:5000
将此文件添加到Dockerfile或

environment:
 - ASPNETCORE_URLS=http://*:5000
给码头工人写信

这些选项在Dotnet2中运行良好,但在3.1中没有任何效果。我还尝试了0.0.0.0而不是*似乎什么都不起作用


因此,基本上,dotnet总是在本地主机(甚至在我的开发机器上)上启动服务器,这使得你的应用程序只能从运行它的主机上访问。

这给了我IP地址。但当我尝试使用该IP地址时,会出现超时错误<代码>无法连接到172.17.0.2端口5000:操作超时您无法从Mac主机(或Windows主机,或从未运行Docker守护程序的主机,或在任何使用Docker Machine或Docker Toolbox的环境中)访问此IP地址。您使用的Docker的“风格”(鲸鱼图标)Docker for Mac或Docker工具箱)?容器内的流程是什么?启动时打印什么?(如果它说“监听127.0.0.1:5000”之类的话,那么从容器外部就无法访问。)@DavidMaze它是dotnetwebapi。它说的是
收听:http://localhost:5000
为什么在这种情况下无法访问端口?Docker flavor:Docker desktop community 2.1.0.5我有一个非常详细的答案。我不能谈论.Net的细节,但作为一般规则,您需要将容器内的进程设置为侦听0.0.0.0(“所有接口”),而不是127.0.0.1(“仅可从此容器访问”)。