--fixed-cidr 是 docker daemon 配置项,需写入 /etc/docker/daemon.json 并重启生效,用于限定 bridge 网络中容器自动分配 ip 的地址池范围,须与 bip 配置一致且仅影响动态分配。

不能直接用 --fixed-cidr 启动 Docker daemon,它不是运行时参数,而是 daemon 配置项,需写入 Docker 的守护进程配置文件(/etc/docker/daemon.json)后重启生效。它的作用是限定 bridge 网络(包括默认 bridge 和未显式指定子网的自定义 bridge 网络)中容器自动获取 IP 的地址池范围。
确认当前默认 bridge 网络子网
先查看当前 docker0 桥接网络实际使用的子网:
docker network inspect bridge | grep -A 3 Subnet
若输出类似 "Subnet": "172.17.0.0/16",说明 Docker 正在使用默认随机分配的私有网段——这正是 fixed-cidr 要覆盖的对象。
修改 daemon.json 并指定 fixed-cidr
编辑或创建 /etc/docker/daemon.json,加入 fixed-cidr 字段(注意:必须配合 bip 设置 docker0 网桥自身 IP):
-
bip:指定 docker0 网桥的 IP 和掩码(即宿主机侧网关地址) -
fixed-cidr:指定容器从该子网中动态分配 IP(必须与bip所在网段一致或为其子集)
示例配置(强制所有自动分配容器落在 10.200.0.0/24 内):
{
"bip": "10.200.0.1/24",
"fixed-cidr": "10.200.0.0/24"
}
⚠️ 注意:fixed-cidr 仅影响动态分配行为,不改变已存在的自定义网络;也不影响 --ip 显式指定的静态 IP。
重启 Docker 并验证效果
保存配置后执行:
sudo systemctl restart docker
再启动一个未指定网络的容器:
docker run -d --name test-alpine alpine sleep infinity
检查其 IP:
docker inspect test-alpine | grep IPAddress
结果应为 10.200.0.x 范围内的地址(如 10.200.0.2),说明 fixed-cidr 已生效。
常见误区与补充说明
以下情况 fixed-cidr 不起作用:
- 容器使用了自定义 bridge 网络且已通过
--subnet明确设定了子网——此时以该子网为准 - 容器运行在
host、none或macvlan等非 bridge 模式下 - 配置写错格式(如漏掉引号、逗号缺失)导致 daemon 启动失败,可用
sudo dockerd --validate提前校验
若还需为不同网络划分独立地址池,可配合 default-address-pools 使用,例如:
"default-address-pools": [
{"base":"10.201.0.0/16","size":24},
{"base":"10.202.0.0/16","size":24}
]
这样后续创建的自定义 bridge 网络在未指定 --subnet 时,会轮询从这些池中取一个 /24 子网自动分配。











