docker如何约束自动划分网段

Docker 的自动网络划分,本质由 default-address-pools 控制,而不是 bip / fixed-cidr

真正决定「自动创建 bridge 网络时每个网络有多大」的,只有两个参数:

  • base:地址池的母网段
  • size每个自动分配网络的前缀长度(CIDR 掩码长度)

1.default-address-pools解释

1
2
3
4
5
6
"default-address-pools": [
{
"base": "192.168.248.0/22",
"size": 26
}
]
  • 母池: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
2
3
4
5
6
"default-address-pools": [
{
"base": "192.168.248.0/22",
"size": 27
}
]
  • 每网段 32 IP(可用 30)
  • 32 个子网
  • 非常适合微服务 + Compose

2.2 每个 Docker 网络 ≈ 14 台容器(/28)

1
2
3
4
5
6
"default-address-pools": [
{
"base": "192.168.248.0/22",
"size": 28
}
]
  • 每网段 16 IP(可用 14)
  • 64 个子网
  • CI / 测试环境非常干净

2.3 极端隔离:每网络 ≈ 6 台容器(/29)

1
2
3
4
5
6
"default-address-pools": [
{
"base": "192.168.248.0/22",
"size": 29
}
]
  • 每网段 8 IP(可用 6)
  • 128 个网络
  • 多租户 / 强隔离场景

3.bipfixed-cidr 解释

1
2
"bip": "192.168.240.1/23",
"fixed-cidr": "192.168.240.1/23"

这两行 只控制 docker0 这个默认 bridge
不影响 docker network create 自动创建的那些网络。

3.1 bip 是什么

bip = Bridge IP

含义是:

  • 指定 docker0 网桥自身的 IP 地址
  • 同时隐式决定 docker0 的网段大小
1
2
3
4
docker0
└── IP: 192.168.240.1
└── Netmask: /23
└── Subnet: 192.168.240.0 – 192.168.241.255

这相当于你在宿主机上手动建了一个 bridge:

1
2
brctl addbr docker0
ip addr add 192.168.240.1/23 dev docker0

3.2 fixed-cidr 是什么

fixed-cidr 的意思是:

  • 限制容器从哪个子网拿 IP
  • 这个子网必须 属于 docker0 的网段

也就是说:

1
2
docker0 网络: 192.168.240.0/23
容器 IP 范围:192.168.240.0/23

如果不写 fixed-cidr

  • Docker 仍然用 docker0
  • 但 IP 分配行为更“自由”,容易和别的网络混

3.3为什么这两个经常一起写成一样的

把它们写成同一个 /23,等于在说一句非常严肃的话:

docker0 的网段就是 192.168.240.0/23
容器只能从这里拿 IP
其它地方不许碰

这带来三个效果:

  • IP 可预测
  • 路由清晰
  • 排错时不会出现“幽灵地址”

3.4bipfixed-cidr 时会发生什么

例如:

1
2
"bip": "192.168.240.1/23",
"fixed-cidr": "192.168.241.0/24"

结果是:

  • docker0 是 /23
  • 容器只在 /24
  • 一半地址永远用不上

这不是错误,但属于规划失误


4.bip、fixed-cidr和 default-address-pools 的关系

三者职责分离

  • bip
    → 只管 docker0
  • fixed-cidr
    → 只管 docker0 里的容器 IP
  • default-address-pools
    → 只管 新建 bridge 网络

所以你现在的结构是:

1
2
docker0            → 192.168.240.0/23
user-defined net → 10.24.24.0/22 切 /29

这是一个非常干净的分层设计


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
2
docker network create test_net
docker network inspect test_net | grep Subnet

6.总结

  • Docker 自动网络大小 = default-address-pools.size
  • size 越大 → 子网越小
  • /26 是“保守安全”
  • /27、/28 是“现代微服务推荐”
  • docker0 固定,业务网络碎片化,是长期稳定方案