最有效方式是显式声明自定义桥接网络子网,需避开宿主机及物理网络常用网段(如192.168.x.x、10.x.x.x、172.16–31.x.x),推荐使用172.20.0.0/16等RFC 1918私有地址,并通过networks.ipam.config.subnet严格配置CIDR格式子网。
直接在 docker-compose.yml 中显式声明自定义桥接网络的子网范围,是防范与线下物理网络冲突最有效、最可控的方式。关键不在于“能不能”,而在于“选对网段”和“写对格式”。
先确认你所在局域网(如公司内网、家庭路由器)实际使用的 IP 段,常见物理网络网段包括:
避开这些范围,推荐选用:172.20.0.0/16、172.21.0.0/16 或更小粒度的 172.20.100.0/24 ——它们属于 RFC 1918 私有地址,又远离 Docker 默认分配的 172.17.0.0/16 和宿主机常见网段。
必须通过 networks 下的 ipam.config.subnet 显式指定 CIDR 表达式,不能只靠服务名或默认行为。示例如下:
version: '3.8'services: web: image: nginx networks: app-net: ipv4_address: 172.20.100.10 db: image: postgres networks: app-net: ipv4_address: 172.20.100.11<p>networks:app-net:driver: bridgeipam:config:</p><ul><li>subnet: 172.20.100.0/24gateway: 172.20.100.1
注意三点:
subnet 是必需字段;gateway 虽非强制,但建议显式设置,便于调试和对接防火墙规则/24),对应 255.255.255.0,可用 IP 数为 254 个ipv4_address)必须落在该子网范围内,否则启动失败部署前执行两步检查:
docker network ls 查看当前所有网络,确认没有其他项目已占用 172.20.100.0/24
ip addr show(Linux)或 ifconfig(macOS)检查宿主机网卡是否使用了同网段 IPdocker network inspect app-net,核对 Subnet 和 Gateway 是否与配置一致若发现冲突,立即换用另一个未被占用的网段(如升至 /23 或切换到 172.21.0.0/24),不要强行复用。
对于多团队共用一台宿主机的场景,可进一步限制 IP 分配池,避免未来扩容时越界:
ip_range 限定容器实际获取 IP 的范围,例如:- subnet: 172.20.100.0/24 ip_range: 172.20.100.32/27(仅开放 32–62 共 30 个地址)"default-address-pools": [{"base":"172.21.0.0/16","size":24}],让所有未指定子网的项目自动落入安全区间