You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker Compose+Nginx反向代理域名访问异常排查与无hosts配置需求

问题分析与解决方案

让我来帮你排查这个问题的根源,同时给出不需要手动修改hosts文件的恢复方案:

一、为什么之前正常现在失效了?

你之前能不用手动配置hosts就访问*.my-project.localhost,核心是依赖操作系统或浏览器对*.localhost子域的默认解析规则——绝大多数现代系统(Windows 10+、macOS 10.15+)和主流浏览器(Chrome、Firefox)都会自动把所有以.localhost结尾的域名解析到127.0.0.1。现在失效的原因大概率是以下情况之一:

  1. DNS缓存异常:浏览器或系统的DNS缓存过期、损坏,导致原本的解析规则无法生效。
  2. 系统/浏览器配置变更:系统更新、浏览器设置调整(比如第三方DNS插件干扰),破坏了.localhost子域的默认解析逻辑。
  3. Docker网络波动:虽然Nginx容器内部能正常解析Docker服务名(api-1api-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」
  • 清除系统DNS缓存
    • Windows:打开命令提示符,执行 ipconfig /flushdns
    • macOS:打开终端,执行 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
    • Linux(Ubuntu/Debian):执行 sudo systemd-resolve --flush-caches

清理完成后,尝试重新访问你的域名,看是否恢复正常。

方案2:用DNSmasq容器自动管理域名解析(推荐长期方案)

如果缓存清理无效,可以用一个轻量的DNSmasq容器来自动处理*.my-project.localhost的解析,完全替代手动修改hosts的操作:

  1. 修改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
  1. 创建dnsmasq.conf配置文件(和docker-compose.yml同目录):
# 把所有.my-project.localhost结尾的域名解析到127.0.0.1
address=/my-project.localhost/127.0.0.1
  1. 配置主机使用本地DNSmasq服务
    • Windows/macOS:打开系统网络设置,在DNS服务器列表中添加127.0.0.1(放在最顶部)
    • Linux:修改/etc/resolv.conf,添加nameserver 127.0.0.1(注意部分发行版可能需要修改systemd-resolved配置)

启动所有容器后,api-1.my-project.localhostmy-project.localhost等域名都会自动解析到127.0.0.1,转发到你的Nginx容器。

方案3:利用Docker Desktop内置DNS(仅适用于Docker Desktop用户)

如果你用的是Windows/macOS的Docker Desktop,可以开启它的内置DNS功能:

  1. 打开Docker Desktop设置 → 「Settings」→ 「Network」
  2. 开启「Enable DNS server」,记下它显示的DNS地址(通常是192.168.65.5这类内网地址)
  3. 在系统网络设置中,把这个DNS地址添加到服务器列表顶部

这样Docker会自动处理相关域名的解析,无需额外容器。

验证方法

在尝试方案前,可以先ping一下你的域名,比如:

ping api-1.my-project.localhost

如果返回127.0.0.1的响应,说明解析正常,问题可能出在Nginx或容器状态;如果ping不通,那就是DNS解析的问题,按上面的方案处理即可。

内容的提问来源于stack exchange,提问作者Meberem

火山引擎 最新活动