服务公告
docker网络配置-IP主机名hosts配置
发布时间:2026-01-08 00:02
蓝易云:docker-compose 网络配置(IP / 主机名 / hosts)一文打通🙂
在 Compose 里,把网络一次性配置好,核心就三件事:
1)用 自定义网络 做隔离与可控;2)用 服务名DNS 做稳定寻址;3)确实需要固定时再上 静态IP 与 extra_hosts(别一上来就“手搓IP”,后期维护会很痛)。

1)你需要先搞清楚:Compose 的“默认寻址”不是靠 /etc/hosts
- 同一网络内,容器之间默认用 服务名 互相访问(例如
http://db:3306)。这是 Docker 内置 DNS 在发挥作用,比手写 hosts 更稳、更可扩展。 <span style="color:red;">/etc/hosts</span>适合“固定映射”,但它是静态文本:IP 一变就失效,适合少量、明确、不变的映射场景(例如指向宿主机、第三方固定地址)。
2)实战模板:自定义网络 + 静态IP + hostname + hosts 映射 ✅
services:
api:
image: nginx:alpine
hostname: api-01
networks:
app_net:
ipv4_address: 172.30.0.10
aliases:
- backend
extra_hosts:
- "host.docker.internal:host-gateway"
- "legacy-db:10.10.10.20"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: "ChangeMe_123"
hostname: db-01
networks:
app_net:
ipv4_address: 172.30.0.11
networks:
app_net:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/24
gateway: 172.30.0.1
逐段解释(每一行都讲清楚)
services::定义你要交付的业务组件(容器)。api / db::服务名;在同一网络里,它也是默认的 DNS 名称(比如db)。image::镜像来源;这里分别示例 Web 与数据库。hostname::容器内部看到的主机名(影响hostname命令与提示符等),更偏“内部标识”。networks: app_net::把服务加入名为 app_net 的用户自定义网络。ipv4_address::在该网络里给容器分配 静态IP(前提:网络配置了ipam.subnet)。aliases::为同一服务增加“别名DNS”,同网段内可用backend解析到api。extra_hosts::向容器内 /etc/hosts 写入静态映射:"host.docker.internal:host-gateway":把一个固定名字指向“宿主机网关”,容器访问宿主机服务更顺手。"legacy-db:10.10.10.20":把遗留数据库固定到某个 IP(适合对方 IP 不变的情况)。
networks:(顶层):定义网络本身。driver: bridge:最常用的单机桥接网络模式。ipam::IP 地址管理;只有定义了subnet,静态IP才有可控范围。gateway::该网络的网关地址(通常不需要业务侧关心,但建议明确,便于排障)。
3)什么时候该用静态IP?什么时候坚决别用?😄
- 适合:对接“只能认 IP 的老系统”、某些安全设备白名单、必须固定点对点联调。
- 不适合:需要水平扩容(
api起多个副本)、频繁变更环境、追求低维护成本。
更推荐的常态做法是:用 服务名(db、redis、mq)做寻址,这才是 Compose 的“正道”。
4)速查对比表(看完就不会混用)📌
| 能力点 | hostname | container_name | aliases | extra_hosts |
|---|---|---|---|---|
| 作用范围 | 容器内部标识 | Docker 对外容器名 | 同网络 DNS 别名 | 写入 /etc/hosts |
| 是否适合扩容 | 适合 | 不适合(会冲突) | 适合 | 一般不适合 |
| 是否自动跟随IP变化 | 是(不依赖IP) | 不涉及 | 是(DNS解析) | 否(静态文本) |
| 典型用途 | 提示符、日志识别 | 仅少数固定场景 | 多域名/多入口 | 指向宿主机/遗留固定IP |
直白结论:别把 extra_hosts 当“服务发现系统”;它更像“手工刻在石头上的记录”。
5)验证与排错命令(带解释)🔎
docker compose up -d
- 启动并后台运行整套服务;网络会按
networks:配置自动创建并挂载到容器。
docker network inspect <项目名>_app_net
- 查看网络详情:subnet、gateway、已加入的容器与它们的 IP;排查“IP是否按预期分配”最有效。
docker compose exec api cat /etc/hosts
- 进入
api容器读取 hosts 文件,确认 extra_hosts 是否写入成功(这是“落地验收点”)。
docker compose exec api getent hosts db
- 用系统解析库验证
db是否能解析到容器 IP;比ping更贴近真实“解析链路”。
docker compose exec api ping -c 2 backend
- 验证
aliases是否生效;backend应解析到api(同一个服务的别名)。
6)工作流程图(Mermaid,vditor 可用)✅
最后给你一个“务实建议”
如果你是做生产交付:优先把寻址标准化为 服务名 + 网络隔离;只有在“外部系统/合规白名单/设备限制”逼你用固定地址时,再上 静态IP 与 extra_hosts。这样网络方案既专业,也不容易把自己未来逼进维护死胡同。
已经是第一篇啦!
下一篇: 服务器路由命令有哪些常用技巧?