用 Docker 自定义网络可实现容器名直接通信,无需改代码或额外服务;核心是启用内置 DNS(127.0.0.11),必须使用用户定义网络(默认 bridge 不支持),并确保 resolv.conf 首行为 nameserver 127.0.0.11、禁用 --dns 参数、合理配置 search 域及可信上游 DNS。
用 docker 自定义网络就能让容器通过名字直接通信,不用改代码、不装额外服务,核心就是启用内置 dns(127.0.0.11)并确保它真正生效。
必须用用户定义网络(不能用默认 bridge)
默认的 bridge 网络不支持容器名自动注册和解析,这是硬性限制。所有服务发现功能只在你主动创建的网络中可用。
- 创建网络:
docker network create app-net - 启动容器时显式指定:
docker run -d --name db --network app-net postgres - 另一容器也加入同一网络:
docker run -it --network app-net alpine ping db—— 这时能通,说明网络和基础解析已就位
确认容器走的是 127.0.0.11 内置 DNS
进容器检查 /etc/resolv.conf,第一行必须是:
如果不是,说明被以下任一方式覆盖了:
- 启动时用了
--dns参数(会完全屏蔽内置 DNS) - 全局配置了
/etc/docker/daemon.json中的"dns"字段(新建容器会继承,但自定义网络下仍可被覆盖) - 用了
docker-compose.yml里写了dns:字段
只要删掉这些显式 DNS 配置,Docker 就会自动注入 127.0.0.11 并启用服务发现。
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
合理设置 search 域,避免卡顿
短名(如 db)会被自动补全为 db.<search>。每试一个 domain 失败就要等超时(默认几秒),多个 search 会明显拖慢请求。
- 只设一个最常用内网域,例如:
docker run --dns-search dev.local ... - Compose 中写死:
dns_search: ["dev.local"] - 跨网络访问时,直接用完整域名,比如
db.app-net,跳过 search 补全
上游 DNS 必须能解析内部域名
内置 DNS(127.0.0.11)本身只管容器名,查不到时会转发给“上游 DNS”。如果上游是 8.8.8.8,查 api.dev.local 就会超时卡住。
- 上游 DNS 应该是公司内网 DNS 服务器,比如
192.168.10.5 - 可通过修改
/etc/docker/daemon.json统一配置:"dns": ["192.168.10.5"],然后重启 Docker - 严禁混搭公网+内网 DNS,第二个永远要等超时才轮到,实际等于失效
验证是否真正生效
别只看 nslookup db 能不能返回 IP,要测响应时间:
- 运行:
time getent hosts db—— 正常应在 5ms 内返回 - 如果
nslookup db要 800ms,但nslookup db.dev.local只要 5ms,说明 search 域配错了,正在无效重试 - 用
dig @127.0.0.11 db.app-net可直连内置 DNS 测试解析逻辑

















