我正在尝试使用我用dotnet核心编写的小型WebApi来实现Docker .
Api似乎运行正常,因为当我使用 dotnet run
运行它时它正常启动并且可以在端口5000上访问 . 但是当我在Docker容器中运行它时它会启动,但我无法在暴露/映射端口上访问它 . 我正在使用VirtualBox在Windows 10上运行Docker .
我的Dockerfile看起来像这样:
FROM microsoft/aspnetcore-build:latest
COPY . /app
WORKDIR /app
RUN dotnet restore
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet", "run"]
我正在建造这样的dontainer:
docker build -t api-test:v0 .
并使用此命令运行它:
docker run -p 5000:5000 api-test:v0
run命令的输出是:
Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000
我也尝试了不同的绑定URL的方法:
-
as
http://+:5000
,http://0.0.0.0:5000
,http://localhost:5000
,... -
通过CLI参数
--urls
/--server.urls
但没有成功 . 有谁看到我做错了什么或错过了什么?
3 回答
绑定到localhost将不适用于您的方案 . 您需要将应用程序绑定到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仍然需要找出原因 .