最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何用Compose配置自定义桥接子网防范与线下物理网络冲突
时间:2026-07-15 19:27:51 编辑:袖梨 来源:一聚教程网
最有效方式是显式声明自定义桥接网络子网,需避开宿主机及物理网络常用网段(如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 段,常见物理网络网段包括:
- 家庭宽带:192.168.1.0/24、192.168.0.0/24、10.0.0.0/24
- 企业办公网:10.10.0.0/16、172.16.0.0/12(注意:Docker 默认常用 172.17–172.31.x.x)
- 云主机 VPC:常为 10.0.0.0/8 或 172.16.0.0/12 的某子集
避开这些范围,推荐选用:172.20.0.0/16、172.21.0.0/16 或更小粒度的 172.20.100.0/24 ——它们属于 RFC 1918 私有地址,又远离 Docker 默认分配的 172.17.0.0/16 和宿主机常见网段。
在 docker-compose.yml 中正确声明子网
必须通过 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虽非强制,但建议显式设置,便于调试和对接防火墙规则 - 子网掩码用 CIDR 表示(如
/24),对应 255.255.255.0,可用 IP 数为 254 个 - 固定 IP(如
ipv4_address)必须落在该子网范围内,否则启动失败
验证是否真正隔离无冲突
部署前执行两步检查:
- 运行
docker network ls查看当前所有网络,确认没有其他项目已占用172.20.100.0/24 - 运行
ip addr show(Linux)或ifconfig(macOS)检查宿主机网卡是否使用了同网段 IP - 启动后执行
docker network inspect app-net,核对Subnet和Gateway是否与配置一致
若发现冲突,立即换用另一个未被占用的网段(如升至 /23 或切换到 172.21.0.0/24),不要强行复用。
生产环境建议加一层防御性配置
对于多团队共用一台宿主机的场景,可进一步限制 IP 分配池,避免未来扩容时越界:
- 用
ip_range限定容器实际获取 IP 的范围,例如:- subnet: 172.20.100.0/24ip_range: 172.20.100.32/27(仅开放 32–62 共 30 个地址) - 禁用默认桥接网络:在 Docker daemon.json 中设
"default-address-pools": [{"base":"172.21.0.0/16","size":24}],让所有未指定子网的项目自动落入安全区间