直接修改容器内/etc/hosts可实现静态域名绑定,但重启后失效;推荐使用--add-host参数或docker-compose的extra_hosts配置固化映射。
直接修改容器内的 /etc/hosts 文件可以实现静态域名绑定,但必须配合使用方式和生命周期管理,否则重启后失效。核心原则是:临时修改仅用于调试;生产环境应通过启动参数或编排配置固化映射。
进入运行中容器手动添加(适合快速验证)
适用于已运行的容器,无需重建镜像或重启服务:
- 执行
docker exec -it <容器名或ID> /bin/sh(或/bin/bash,视镜像而定) - 用
vi或sed编辑:echo "192.168.10.5 api.internal" >> /etc/hosts - 验证是否生效:
ping -c 1 api.internal或getent hosts api.internal - ⚠️ 注意:该修改在容器重启后丢失,不适用于长期部署
启动容器时用 --add-host 固化映射(推荐用于单容器)
这是最常用、最可靠的方式,Docker 会在容器初始化阶段自动写入 /etc/hosts,且不受重启影响:
- 命令示例:
docker run -d --add-host=db.local:172.20.0.10 --add-host=cache.local:172.20.0.11 nginx:alpine - 多个映射可重复使用
--add-host参数 - 支持变量注入,如:
docker run --add-host=backend:$BACKEND_IP ... - 注意顺序:建议把
--add-host放在--name之后、镜像名之前,避免解析错误
在 docker-compose.yml 中配置 extra_hosts(推荐用于编排场景)
适合多服务协同、CI/CD 流水线或本地开发环境:
- 在对应 service 下添加:
extra_hosts: - "auth.service:10.0.3.20" - "metrics.service:10.0.3.21"
- 支持环境变量:
- "${MONITOR_HOST}:10.0.3.22" - 启动后所有容器实例自动拥有这些条目,且随
docker-compose up持久生效 - 不依赖容器内是否安装编辑器或 sudo 权限
构建镜像时写入(适合固定映射+不可变基础设施)
仅当域名/IP 在整个镜像生命周期内不会变更时选用:
- Dockerfile 中添加:
RUN echo "192.168.99.100 registry.example.com" >> /etc/hosts - 优点:一次构建,处处可用;缺点:每次 IP 变更都要重构建镜像
- 若需动态性,可结合构建参数:
ARG REGISTRY_IP+RUN echo "$REGISTRY_IP registry.example.com" >> /etc/hosts - 注意:部分精简镜像(如
scratch或distroless)无 shell,无法执行该指令


















