.Net Core WebApi 拒绝 Docker 容器中的连接



我正在用一个用dotnet core编写的小型WebApi试用Docker。

API 似乎工作正常,因为当我用 dotnet run 运行它时,它会正常启动并且可以在端口 5000 上访问。但是当我在 Docker 容器中运行它时,它会启动,但我无法在公开/映射的端口上访问它。我在Windows 10上运行Docker和VirtualBox。

我的 Dockerfile 看起来像这样:

FROM microsoft/aspnetcore-build:latest
COPY . /app
WORKDIR /app
RUN dotnet restore
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet", "run"]

我正在像这样建造捐赠者:

docker build -t api-test:v0 .

并使用以下命令运行它:

docker run -p 5000:5000 api-test:v0

运行命令的输出为:

Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000

我还尝试了绑定 URL 的不同方法:

  • http://+:5000http://0.0.0.0:5000http://localhost:5000、...
  • 通过 CLI 参数--urls/--server.urls

但没有成功。有人看到我做错或遗漏了什么吗?

Now listening on: http://localhost:5000

绑定到本地主机不适用于你的方案。您需要让应用绑定到 0.0.0.0,docker 端口转发才能正常工作。完成此操作后,您应该能够在 VM IP 上访问应用程序,端口 5000

  1. 确保您的服务使用 http://*:500 或类似方式侦听所有端口(如果它在运行时打印localhost,它将不起作用(。
  2. 如果您使用 VirtualBox 设置您的 docker 环境并使用例如 docker-machine,则需要使用运行 docker 容器的虚拟机的 IP 地址。 您可以通过 docker-machine ip default 获取 IP。

我找到了解决这个问题的方法。您需要做的就是编辑 launchSettings.json 更改为您的应用程序设置"applicationUrl": "http://*:5000/"。生成映像。然后在运行后运行映像docker run -d -p 81:5000 aspnetcoreapp获取容器docker exec container_id ipconfig的 IP 地址。然后在浏览器中 http://container_ip:5000/api/values。由于某种原因,它不起作用 http://localhost:81 仍然需要弄清楚为什么会这样。

我最近在 Docker 版本 20.x 上遇到了同样的问题。上面的评论提供了很好的灯光。如果有人遇到同样的问题,这就是我解决的方法:编辑 launchSettings.json 到

"applicationUrl": "http://localhost:5001;http://host.docker.internal:5001",

这将允许你在本地测试 Web API,也可以从容器中使用。

最新更新