在 docker-compose.yml 中可同时配置 hostname 和静态 IP:需先定义带 ipam 的自定义 bridge 网络(如 subnet: 172.20.0.0/16),再在服务 networks 下指定 ipv4_address,并单独设置 hostname 字段;二者不冲突,但静态 IP 仅在自定义 bridge 网络中生效。

在 docker-compose.yml 中同时配置主机名(hostname)和静态 IP 地址,关键在于:**主机名作用于容器内部的 /etc/hostname 和网络解析,而静态 IP 必须通过自定义 bridge 网络 + ipam + ipv4_address 显式指定**。两者不冲突,但需配合使用,且静态 IP 仅在自定义网络中生效。
1. 创建带子网的自定义 bridge 网络
默认的 docker-compose 自动创建的网络不支持静态 IP 分配,必须显式定义一个带 ipam 配置的网络:
- 使用
driver: bridge - 在
ipam.config中指定唯一子网(如172.20.0.0/16)和网关(可选) - 确保子网不与宿主机或其他 Docker 网络重叠(例如避开
172.17.0.0/16默认 bridge)
2. 为服务指定 hostname 和 ipv4_address
每个服务需同时声明:
-
hostname:设置容器内hostname命令返回值及/etc/hostname内容(不影响 DNS 解析) -
networks.<网络名>.ipv4_address:在对应自定义网络中分配固定 IPv4 地址 -
networks列表中必须包含该自定义网络名
示例片段:
version: "3.9"
services:
web:
image: nginx:alpine
hostname: web-server
networks:
mynet:
ipv4_address: 172.20.0.10
<p>db:
image: postgres:15
hostname: pg-db
networks:
mynet:
ipv4_address: 172.20.0.11</p><p>networks:
mynet:
driver: bridge
ipam:
config:</p><ul><li>subnet: 172.20.0.0/16
gateway: 172.20.0.1
3. 注意事项与常见问题
静态 IP 不是“绑定到容器”,而是“绑定到该容器在指定网络中的网络接口”。务必注意:
- 分配的 IP 必须落在
subnet范围内,否则启动失败 - 同一网络中多个服务不能分配相同 IP,否则冲突报错
-
hostname不影响服务间通信——服务仍优先通过服务名(如db)或别名解析,而非依赖静态 IP - 若需外部访问该静态 IP,还需配合
ports映射;IP 本身只在 Docker 内部网络有效 - 不要在
host或none网络模式下尝试ipv4_address,它仅对bridge有效
4. 验证是否生效
启动后可快速验证:
- 进入容器:
docker-compose exec web sh - 检查主机名:
hostname应输出web-server - 检查 IP:
ip addr show eth0 | grep 'inet '应含172.20.0.10/16 - 从另一容器 ping:
docker-compose exec db ping web或ping 172.20.0.10都应通


















