Docker部署的Swagger UI无法访问(ERR_CONNECTION_REFUSED)求助
Docker部署的C#程序无法访问Swagger UI(ERR_CONNECTION_REFUSED)
我正在开发一个基于Docker的C#程序,正常启动后会显示Swagger UI,但当前浏览器提示“localhost拒绝连接”,错误码为ERR_CONNECTION_REFUSED。
浏览器给出的排查建议无实际帮助:
- 检查网络连接:检查网线、调制解调器和路由器
- 允许Microsoft Edge通过防火墙或杀毒软件访问网络:若已在允许列表中,尝试移除后重新添加
- 若使用代理服务器:检查代理设置,或咨询组织确认代理状态;无需代理则前往系统代理设置调整
已完成的排查步骤
1. 验证localhost可用性
执行ping -a localhost结果正常,输出如下:
Commandline prompt>ping -a localhost Pinging PORT-DDM.<servername> [::1] with 32 bytes of data: Reply from ::1: time<1ms Reply from ::1: time<1ms Reply from ::1: time<1ms Reply from ::1: time<1ms Ping statistics for ::1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
2. 端口监听检查
发现端口5128无进程监听:
Commandline prompt>netstat -qon | findstr /I "5128" => no result Commandline prompt>netstat -aon | findstr /I "5128" => no result
netstat -aon显示5128附近有其他端口被Docker Desktop Backend(PID 21660)监听。
3. 环境与配置确认
- Docker其他容器运行正常,问题出在Windows更新(版本:Windows 10 Version 21H2 (OS Build 19044.2486))之后
- 已执行
docker-compose -f docker-compose.base.yml up、修复/etc/hosts文件、添加防火墙端口5128规则,问题未解决 - 容器
ASPNETCORE_ENVIRONMENT已设为DEVELOPMENT,无代理设置 - 容器端口映射为
0.0.0.0:5128->80/tcp、0.0.0.0:49154->443/tcp - 容器内无法安装curl,宿主机执行
curl http://localhost:80返回IIS默认页面
解决思路
1. 确认容器内部程序状态
- 查看容器启动日志:执行
docker logs <容器ID/名称>,检查是否存在启动报错(如配置加载失败、依赖缺失等) - 验证容器内端口监听:进入容器执行
netstat -ano | findstr :80(Windows容器)或ss -tulpn | grep :80(Linux容器),确认80端口是否被程序正常监听
2. 排查端口映射失效问题
- 重启Docker Desktop:Windows更新可能导致Docker网络服务异常,重启后重新启动容器测试
- 检查系统端口占用:执行
netsh int ipv4 show excludedportrange protocol=tcp,确认5128端口是否被Windows系统预留占用 - 临时更换映射端口:修改
docker-compose.base.yml,将5128替换为其他未被占用的端口(如5129),重启容器后测试访问
3. 排除宿主机IIS干扰
- 检查容器端口映射配置:确认
docker-compose.base.yml中ports规则是否正确,是否误将宿主机80端口与容器80端口映射(与IIS冲突) - 临时停止宿主机IIS服务:执行
net stop w3svc,重新启动容器后测试访问,验证是否为IIS导致的端口转发异常
4. 重置Windows网络与防火墙规则
- 重置防火墙规则:执行
netsh advfirewall reset,之后重新添加允许Docker端口转发的规则 - 重置网络栈:执行
netsh int ip reset和ipconfig /flushdns,修复Windows更新可能导致的网络配置异常
5. 确认程序启动配置
- 检查程序绑定地址:确认
Program.cs中是否将服务绑定到0.0.0.0(而非仅localhost,否则容器外部无法访问),或通过环境变量ASPNETCORE_URLS设置为http://0.0.0.0:80 - 验证Swagger启用逻辑:确认在
DEVELOPMENT环境下,程序是否正确启用了Swagger中间件
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

