Docker容器需显式配置域名解析而非自动发现:可用--add-host或docker-compose的extra_hosts注入静态映射,构建时固化hosts适用于稳定IP,避免修改nsswitch.conf或挂载完整hosts文件。

在 Docker 中让容器自动解析域名,关键不是“自动发现”,而是明确告诉它哪些域名对应哪些 IP。Docker 容器默认不继承宿主机的 /etc/hosts,也不自动读取本地 DNS 配置,所以必须显式配置映射或指定解析路径。
用 --add-host 启动时注入静态映射
这是最常用、最轻量的方式,适合开发测试和单容器场景:
- 命令中直接添加:
docker run --add-host=api.dev:192.168.1.50 --add-host=db.internal:172.19.0.3 -it nginx - 每个
--add-host添加一行到容器的/etc/hosts,格式为域名:IP - 值可写
host-gateway(Docker 20.10+),自动填入当前网络下宿主机的网关地址,不用硬编码 - 不能动态更新,改了就得重启容器;但不会覆盖
localhost等系统保留条目
用 docker-compose 的 extra_hosts 批量管理
多容器协作时更清晰、易维护,推荐用于项目级部署:
- 在
docker-compose.yml中为服务配置:
extra_hosts:
- "auth.local:10.5.0.8"
- "cache.local:172.23.0.6" - 支持环境变量替换,比如
- "${AUTH_HOST}:10.5.0.8",配合.env文件灵活切换环境 - 启动后可用
docker-compose exec web cat /etc/hosts验证是否写入成功 - 比拼长命令更安全,也方便 Git 版本管理
构建镜像时固化 hosts(仅限稳定 IP 场景)
适用于测试镜像或 IP 极少变动的内部服务:
- Dockerfile 中追加:
RUN echo "192.168.2.100 monitor.internal" >> /etc/hosts - 也可用构建参数动态注入:
ARG MONITOR_IP+RUN echo "${MONITOR_IP} monitor.internal" >> /etc/hosts - 构建时传参:
docker build --build-arg MONITOR_IP=192.168.2.100 -t myapp . - 注意:一旦 IP 变更,必须重建镜像;不适合云环境或 DHCP 分配的地址
别碰 /etc/nsswitch.conf 和挂载完整 hosts 文件
这两类操作看似“彻底控制”,实际风险高、收益低:
- 修改
/etc/nsswitch.conf中的hosts: files dns顺序,可能让getent、curl等命令异常,基础镜像通常不支持也不建议改 - 用
-v ./my-hosts:/etc/hosts:ro完全替换 hosts,会丢掉 Docker 自动生成的容器名、localhost条目,容易导致健康检查失败或网络诊断失灵 - 真要精细控制 DNS 行为(比如内网域名走 CoreDNS、公网走 114.114.114.114),应使用
--dns和--dns-search参数,而不是动解析顺序


















