如何在本地Docker中运行.NET Core Web API并通过浏览器访问?
配置操作步骤
容器启动日志显示服务本身运行正常,无法访问是缺了以下必要配置,按顺序配置即可:
1. 启动容器时必须配置端口映射
从容器日志可以明确看到,服务在容器内部监听的是80端口(不是你本地Visual Studio调试用的5000端口,这是微软官方ASP.NET Core基础镜像的生产环境默认配置),启动容器时如果不指定端口映射,宿主机网络无法访问容器内的服务端口。
如果之前启动过同名测试容器,先执行命令删除旧容器:
正确启动命令示例(将容器80端口映射到宿主机8080端口):docker rm -f test-api
参数说明:docker run -d -p 8080:80 --name test-api test-d:让容器在后台运行-p 宿主机端口:容器端口:后半段的容器端口必须填日志里显示的80,不要填本地调试用的5000;前半段的宿主机端口可以自定义,比如要映射到宿主机5000端口就写-p 5000:80
启动后执行docker ps,看到PORTS列显示0.0.0.0:8080->80/tcp类似的记录,就说明端口映射已经生效。
注意:Dockerfile里的
EXPOSE 80只是镜像的说明性标注,不写也不影响端口映射,实际端口转发完全靠run命令的-p参数,不用为了端口问题反复调整Dockerfile的EXPOSE配置。2. 解决Swagger生产环境默认禁用的问题
日志里明确显示当前容器内的运行环境是Production,而ASP.NET Core默认项目模板里,Swagger文档中间件只在Development环境下才会加载,就算端口通了,直接访问/swagger路径也会返回404,两种解决方法二选一即可:- 临时测试用:启动容器时添加环境变量,将运行环境改为开发环境,命令如下:
docker run -d -p 8080:80 -e ASPNETCORE_ENVIRONMENT=Development --name test-api test - 生产环境部署用:修改项目里的
Program.cs(.NET 6+版本)或Startup.cs(.NET 5及以下版本)代码,去掉Swagger中间件外层的if (app.Environment.IsDevelopment())环境判断,允许生产环境也加载Swagger相关服务,重新执行docker build -t test .构建新镜像后再启动即可。
- 临时测试用:启动容器时添加环境变量,将运行环境改为开发环境,命令如下:
3. 使用正确的地址访问
端口映射完成、Swagger配置生效后,不要访问本地调试用的http://localhost:5000/swagger/index.html,要根据你映射的宿主机端口访问,比如前面示例映射到8080端口,就访问:http://localhost:8080/swagger/index.html
特殊情况排查
如果以上配置都完成还是访问不了,执行docker inspect test-api找到容器的内部IPAddress字段值,直接访问http://<容器内部IP>:80/swagger/index.html,如果能正常打开,说明是宿主机防火墙拦截了你映射的端口,给对应端口添加入站放行规则即可。
内容的提问来源于stack exchange,提问作者Bhav
相关产品推荐
相关产品推荐

