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 | resolver 127.0.0.11 valid=30s ipv6=off; |
这里有 两个关键点:
gz-api-ios是 Docker 服务名 / 容器名resolve+resolver= 运行期动态解析 DNS
也就是说:
不是 Nginx 启动时解析一次,而是运行过程中不断解析
2.2 不用 127.0.0.11 会怎样
如果你写成这样:
1 | upstream php-upstream-ios { |
问题是:
- Docker 容器 IP 会变(重启、滚动更新)
- Nginx 不会自动重新解析
- 结果:502 / 连接老 IP / 灰度发布直接翻车
127.0.0.11 的作用就是:
让 Nginx 始终拿到“当前活着的容器 IP”
3. 127.0.0.11的工作机制
3.1 DNS 请求流转图(文字版)
1 | Nginx |
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 | nameserver 127.0.0.11 |
这不是你配的,是 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 之前的经典方案