docker如何约束自动划分网段
Docker 的自动网络划分,本质由 default-address-pools 控制,而不是 bip / fixed-cidr。
真正决定「自动创建 bridge 网络时每个网络有多大」的,只有两个参数:
base:地址池的母网段size:每个自动分配网络的前缀长度(CIDR 掩码长度)
1.default-address-pools解释
1 | "default-address-pools": [ |
母池:
192.168.248.0/22- 覆盖范围:
192.168.248.0 ~ 192.168.251.255 - 一共 1024 个 IP
- 覆盖范围:
size: 26- Docker 每次自动创建一个 /26 的子网
- 每个子网 64 个 IP(可用 62)
Docker 的切分方式
Docker 会在 /22 里,顺序切出这些网络:
- 192.168.248.0/26
- 192.168.248.64/26
- 192.168.248.128/26
- …
- 192.168.251.192/26
能切多少个?
/22 → /26=2^(26-22) = 16个网络
2.如何限定自动划分为更小的网络段
核心原则只有一句话:
把
size调大
CIDR 越大,子网越小。
2.1 每个 Docker 网络 ≈ 30 台容器(/27)
1 | "default-address-pools": [ |
- 每网段 32 IP(可用 30)
- 32 个子网
- 非常适合微服务 + Compose
2.2 每个 Docker 网络 ≈ 14 台容器(/28)
1 | "default-address-pools": [ |
- 每网段 16 IP(可用 14)
- 64 个子网
- CI / 测试环境非常干净
2.3 极端隔离:每网络 ≈ 6 台容器(/29)
1 | "default-address-pools": [ |
- 每网段 8 IP(可用 6)
- 128 个网络
- 多租户 / 强隔离场景
3.bip 和 fixed-cidr 解释
1 | "bip": "192.168.240.1/23", |
这两行 只控制 docker0 这个默认 bridge,
不影响 docker network create 自动创建的那些网络。
3.1 bip 是什么
bip = Bridge IP
含义是:
- 指定 docker0 网桥自身的 IP 地址
- 同时隐式决定 docker0 的网段大小
1 | docker0 |
这相当于你在宿主机上手动建了一个 bridge:
1 | brctl addbr docker0 |
3.2 fixed-cidr 是什么
fixed-cidr 的意思是:
- 限制容器从哪个子网拿 IP
- 这个子网必须 属于 docker0 的网段
也就是说:
1 | docker0 网络: 192.168.240.0/23 |
如果不写 fixed-cidr:
- Docker 仍然用 docker0
- 但 IP 分配行为更“自由”,容易和别的网络混
3.3为什么这两个经常一起写成一样的
把它们写成同一个 /23,等于在说一句非常严肃的话:
docker0 的网段就是 192.168.240.0/23
容器只能从这里拿 IP
其它地方不许碰
这带来三个效果:
- IP 可预测
- 路由清晰
- 排错时不会出现“幽灵地址”
3.4bip ≠ fixed-cidr 时会发生什么
例如:
1 | "bip": "192.168.240.1/23", |
结果是:
- docker0 是
/23 - 容器只在
/24里 - 一半地址永远用不上
这不是错误,但属于规划失误。
4.bip、fixed-cidr和 default-address-pools 的关系
三者职责分离
bip
→ 只管 docker0fixed-cidr
→ 只管 docker0 里的容器 IPdefault-address-pools
→ 只管 新建 bridge 网络
所以你现在的结构是:
1 | docker0 → 192.168.240.0/23 |
这是一个非常干净的分层设计。
5.修正完毕重启docker服务
# cat /etc/docker/daemon.json
{
"bip": "10.24.240.1/23",
"fixed-cidr": "10.24.240.1/23",
"default-address-pools": [
{
"base": "10.24.24.0/21",
"size": 29
}
],
"registry-mirrors": ["https://jnxt8d8b.mirror.aliyuncs.com"],
"insecure-registries": ["127.0.0.1"],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-opts": {
"max-size": "1024m",
"max-file": "3"
}
}
1 | systemctl restart docker |
注意:
- 不会影响已存在的 Docker 网络
- 只影响 之后新建的网络
查看验证方式
1 | docker network create test_net |
6.总结
- Docker 自动网络大小 =
default-address-pools.size - size 越大 → 子网越小
- /26 是“保守安全”
- /27、/28 是“现代微服务推荐”
- docker0 固定,业务网络碎片化,是长期稳定方案