我正在用一个用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://+:5000
、http://0.0.0.0:5000
、http://localhost:5000
、... - 通过 CLI 参数
--urls
/--server.urls
但没有成功。有人看到我做错或遗漏了什么吗?
Now listening on: http://localhost:5000
绑定到本地主机不适用于你的方案。您需要让应用绑定到 0.0.0.0,docker 端口转发才能正常工作。完成此操作后,您应该能够在 VM IP 上访问应用程序,端口 5000
- 确保您的服务使用
http://*:500
或类似方式侦听所有端口(如果它在运行时打印localhost
,它将不起作用(。 - 如果您使用 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,也可以从容器中使用。