docker内dns转发器127.0.0.11

1. 127.0.0.11 是什么

1.1 本质定义
127.0.0.11 是 Docker 内置的 DNS Stub Resolver(本地 DNS 转发器)
它只存在于 Docker 容器的网络命名空间内部,不是宿主机的 DNS,也不是公网 DNS。

1.2 出现的前提条件
只要满足以下任一条件,Docker 就会启用 127.0.0.11:

  • 使用 Docker 自定义网络(bridge / overlay / swarm)
  • docker-compose 创建的 network
  • 容器之间需要通过 服务名/容器名 相互访问

2. 为什么 Nginx 要写 resolver 127.0.0.11

2.1 你这段配置在干什么

1
2
3
4
5
resolver 127.0.0.11 valid=30s ipv6=off;

upstream php-upstream-ios {
server gz-api-ios:9000 resolve;
}

这里有 两个关键点

  • gz-api-iosDocker 服务名 / 容器名
  • resolve + resolver = 运行期动态解析 DNS

也就是说:
不是 Nginx 启动时解析一次,而是运行过程中不断解析

2.2 不用 127.0.0.11 会怎样
如果你写成这样:

1
2
3
upstream php-upstream-ios {
server gz-api-ios:9000;
}

问题是:

  • Docker 容器 IP 会变(重启、滚动更新)
  • Nginx 不会自动重新解析
  • 结果:502 / 连接老 IP / 灰度发布直接翻车

127.0.0.11 的作用就是:
让 Nginx 始终拿到“当前活着的容器 IP”


3. 127.0.0.11的工作机制

3.1 DNS 请求流转图(文字版)

1
2
3
4
5
6
7
8
9
Nginx
|
| DNS query: gz-api-ios
v
127.0.0.11 (Docker 内置 DNS)
|
| 查 Docker 网络元数据
v
当前 gz-api-ios 容器 IP

3.2 Docker 内部实际做了什么

  • Docker 维护了一张 服务名 → 容器 IP 的内存表
  • 127.0.0.11 只是一个“转发入口”
  • 你看到的是 loopback,本质是 Docker 网络栈钩子

4. valid=30s 是什么含义

4.1 精准解释

1
resolver 127.0.0.11 valid=30s;

含义是:

  • DNS 解析结果缓存 30 秒
  • 30 秒后强制重新向 Docker DNS 查询

4.2 为什么这是一个经验值

  • 太小(1s):DNS 查询风暴,Nginx CPU 飙升
  • 太大(5m):滚动发布期间可能命中已下线 IP

生产推荐区间

  • Web / PHP-FPM:10s ~ 30s
  • 高并发 API:5s ~ 10s

5. 和 /etc/resolv.conf 的关系

5.1 容器里的 resolv.conf
在容器内你会看到类似:

1
2
nameserver 127.0.0.11
options ndots:0

这不是你配的,是 Docker 自动注入的。

5.2 Nginx 为什么要显式 resolver
原因只有一个:
Nginx 不会自动读取系统 DNS 配置

所以必须手动声明:

1
resolver 127.0.0.11;

否则 resolve 指令是无效的。


6. 什么时候不该用 127.0.0.11

6.1 明确不适用场景

  • network_mode: host
  • 裸机部署 Nginx
  • 直接写固定 IP(反模式,但有时不得不用)

6.2 host 网络下的正确做法

1
resolver 114.114.114.114 223.5.5.5 valid=30s;

因为 127.0.0.11 只存在于 Docker 网络


7.总结

  • 127.0.0.11 = Docker 内置 DNS
  • 只服务于 容器间服务发现
  • 搭配 resolve = Nginx 支持容器 IP 动态变化
  • 是 docker-compose / swarm / k8s 之前的经典方案