Docker容器默认不继承宿主机域名解析配置,需通过--add-host(推荐)、docker-compose extra_hosts或Dockerfile固化hosts三种方式实现内网域名映射,分别适用于单容器调试、多容器协作和离线稳定环境。

Docker容器默认不继承宿主机的域名解析配置,所以直接在容器里访问内网域名(比如 api.internal 或 db.local)经常失败。核心在于让容器“知道”这些域名对应哪个IP——不是靠改DNS顺序,而是靠控制 /etc/hosts 映射或指定可信DNS源。
以下三种方式覆盖从开发调试到生产部署的主流场景,按推荐程度排序:
用 --add-host 启动时注入静态映射
这是最轻量、最安全的入门方案,适合单容器快速验证或CI任务。 - 每个 `--add-host=域名:IP` 会追加一行到容器 `/etc/hosts`,不影响原有条目(如 `localhost`) - IP 可写死,也可用 `host-gateway`(Docker 20.10+),自动解析为当前网络下宿主机的网关地址,对跨环境更友好 - 示例: `docker run --add-host=api.internal:host-gateway --add-host=db.local:172.20.0.5 -it nginx:alpine` - 注意:运行中容器无法动态添加;IP变更需重建容器用 docker-compose 的 extra_hosts 管理多容器映射
面向团队协作和本地开发环境,配置可版本化、可复用。 - 在 `docker-compose.yml` 的 service 下直接声明,语法简洁: `extra_hosts:`` - "auth.local:host-gateway"`
` - "cache.internal:192.168.10.22"` - 支持环境变量替换,便于区分 dev/staging: `- "api.${ENV}.company.com:${API_IP}"` - 验证是否生效:`docker-compose exec web cat /etc/hosts`
构建镜像时固化 hosts(仅限稳定环境)
适用于测试镜像或离线部署,配置随镜像打包,重启不失效。 - 在 Dockerfile 中用 `RUN echo ... >> /etc/hosts` 追加: `RUN echo "10.5.0.3 metrics.internal" >> /etc/hosts` - 更灵活的做法是用构建参数(`--build-arg`)传入IP: `ARG BACKEND_IP``RUN echo "${BACKEND_IP} backend.api" >> /etc/hosts` - 构建命令:`docker build --build-arg BACKEND_IP=192.168.2.100 -t myapp .` - 缺点:IP变动必须重新构建并推送镜像,不适合频繁变更的网络环境
不复杂但容易忽略


















