Docker Compose+Nginx反向代理域名访问异常排查与无hosts配置需求
问题分析与解决方案
让我来帮你排查这个问题的根源,同时给出不需要手动修改hosts文件的恢复方案:
一、为什么之前正常现在失效了?
你之前能不用手动配置hosts就访问*.my-project.localhost,核心是依赖操作系统或浏览器对*.localhost子域的默认解析规则——绝大多数现代系统(Windows 10+、macOS 10.15+)和主流浏览器(Chrome、Firefox)都会自动把所有以.localhost结尾的域名解析到127.0.0.1。现在失效的原因大概率是以下情况之一:
- DNS缓存异常:浏览器或系统的DNS缓存过期、损坏,导致原本的解析规则无法生效。
- 系统/浏览器配置变更:系统更新、浏览器设置调整(比如第三方DNS插件干扰),破坏了
.localhost子域的默认解析逻辑。 - Docker网络波动:虽然Nginx容器内部能正常解析Docker服务名(
api-1、api-2等),但外部请求需要主机把域名解析到127.0.0.1才能转发到Nginx的80端口,若主机侧的DNS解析链路出问题,就会出现“无法找到站点”的错误。
二、无需手动修改hosts的恢复方案
方案1:清除DNS缓存(最快尝试)
先从最简单的缓存清理入手,大概率能解决问题:
- 清除浏览器DNS缓存:
- Chrome:打开
chrome://net-internals/#dns,点击「Clear host cache」 - Firefox:打开
about:networking#dns,点击「Clear DNS Cache」
- Chrome:打开
- 清除系统DNS缓存:
- Windows:打开命令提示符,执行
ipconfig /flushdns - macOS:打开终端,执行
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - Linux(Ubuntu/Debian):执行
sudo systemd-resolve --flush-caches
- Windows:打开命令提示符,执行
清理完成后,尝试重新访问你的域名,看是否恢复正常。
方案2:用DNSmasq容器自动管理域名解析(推荐长期方案)
如果缓存清理无效,可以用一个轻量的DNSmasq容器来自动处理*.my-project.localhost的解析,完全替代手动修改hosts的操作:
- 修改docker-compose.yml,添加dnsmasq服务:
version: "3.2" services: api-1: image: my-companies-docker-registry.api-1 api-2: image: my-companies-docker-registry.api-2 main-front-end: image: my-companies-docker-registry.main-front-end my-project: image: nginx depends_on: - api-1 - api-2 - main-front-end ports: - 80:80 volumes: - type: bind read_only: true source: ./nginx target: /etc/nginx # 新增dnsmasq服务 dnsmasq: image: jpillora/dnsmasq ports: - "53:53/udp" volumes: - type: bind source: ./dnsmasq.conf target: /etc/dnsmasq.conf cap_add: - NET_ADMIN
- 创建dnsmasq.conf配置文件(和docker-compose.yml同目录):
# 把所有.my-project.localhost结尾的域名解析到127.0.0.1 address=/my-project.localhost/127.0.0.1
- 配置主机使用本地DNSmasq服务:
- Windows/macOS:打开系统网络设置,在DNS服务器列表中添加
127.0.0.1(放在最顶部) - Linux:修改
/etc/resolv.conf,添加nameserver 127.0.0.1(注意部分发行版可能需要修改systemd-resolved配置)
- Windows/macOS:打开系统网络设置,在DNS服务器列表中添加
启动所有容器后,api-1.my-project.localhost、my-project.localhost等域名都会自动解析到127.0.0.1,转发到你的Nginx容器。
方案3:利用Docker Desktop内置DNS(仅适用于Docker Desktop用户)
如果你用的是Windows/macOS的Docker Desktop,可以开启它的内置DNS功能:
- 打开Docker Desktop设置 → 「Settings」→ 「Network」
- 开启「Enable DNS server」,记下它显示的DNS地址(通常是
192.168.65.5这类内网地址) - 在系统网络设置中,把这个DNS地址添加到服务器列表顶部
这样Docker会自动处理相关域名的解析,无需额外容器。
验证方法
在尝试方案前,可以先ping一下你的域名,比如:
ping api-1.my-project.localhost
如果返回127.0.0.1的响应,说明解析正常,问题可能出在Nginx或容器状态;如果ping不通,那就是DNS解析的问题,按上面的方案处理即可。
内容的提问来源于stack exchange,提问作者Meberem




