Docker容器可Ping通但无法通过容器名解析访问服务求助
问题分析与解决办法
核心原因
你遇到的ERR_NAME_NOT_RESOLVED错误本质是浏览器不在Docker网桥网络内:
- 前端代码是在你本地Windows的浏览器里执行的,而非
frontend容器内部,浏览器无法识别Docker网桥网络里的容器名position-provider,自然解析失败。 - 容器内部能ping通
position-provider是因为两个容器处于同一Docker自定义网桥网络中,Docker内置的DNS服务可以正常解析容器名,但这个DNS服务只对容器内部生效。
解决方案
1. 直接使用localhost映射端口(最简易方案)
修改前端代码里的请求地址,把http://position-provider:5000/api替换为http://localhost:5000/api。
因为你的position-provider容器已经通过5000:5000把端口映射到了Windows主机,浏览器通过localhost就能访问到该服务。
2. 配置本地DNS映射(保留服务名调用)
如果想继续用position-provider作为主机名调用,可以修改Windows的hosts文件:
- 打开
C:\Windows\System32\drivers\etc\hosts文件(需要管理员权限)。 - 添加一行:
127.0.0.1 position-provider。 - 保存后刷新DNS(执行命令
ipconfig /flushdns),此时浏览器就能把position-provider解析到本地主机,配合端口映射即可正常访问服务。
3. 开发环境反向代理(进阶统一域名)
如果有多个服务需要统一域名访问,可以用Nginx做反向代理:
- 新增一个Nginx容器,配置反向代理规则,把
position-provider的请求转发到对应的容器。 - 前端代码用Nginx的域名(比如
http://localhost/api)发起请求,由Nginx路由到目标服务。不过这种方案在简单开发场景下略显复杂。
验证建议
修改前端请求地址后,重新启动前端容器,在浏览器控制台查看请求是否正常,同时可以通过curl http://localhost:5000/api验证服务本身是否正常对外提供接口。
内容的提问来源于stack exchange,提问作者Asaf tchstud21a3204
相关产品推荐
相关产品推荐

