Docker中指定非默认bridge网段(容器子网IP范围)

在 Docker 中,指定默认网段(子网 IP 范围) 主要是为了解决默认 bridge 网络和现有网络冲突的问题。


1.修改 Docker Daemon 配置(推荐方式)

1.1.编辑配置文件(通常为 /etc/docker/daemon.json

1
2
3
{
"bip": "192.168.100.1/24"
}

1.2.参数解释

  • bip(Bridge IP):指定默认 bridge 网络的 IP 网段;
  • 示例中 192.168.100.1/24 表示 Docker 默认网络网段为 192.168.100.0/24,网关是 192.168.100.1

1.3.示例完整配置

1
2
3
4
5
6
7
8
9
10
{
"bip": "172.30.0.1/16",
"fixed-cidr": "172.30.0.0/24", //docker run容器分配的IP池
"default-address-pools": [ //compose分配的子网
{
"base": "172.31.0.0/16",
"size": 24
}
]
}

字段解释

"bip": "172.30.0.1/16"
  • bip = bridge IP:指定 Docker 默认 bridge 网络(即 docker0)的子网和网关。

  • 172.30.0.1/16 意思是:

    • 子网:172.30.0.0/16(65536 个地址)
    • 网关:172.30.0.1

⚠️ 如果你不显式指定,Docker 默认使用 172.17.0.1/16 作为 bridge 网络。


"fixed-cidr": "172.30.0.0/24"
  • 限制 Docker 容器 IP 分配范围172.30.0.0/24(256 个地址)。

  • 即使整个 docker0 网段是 /16,Docker 只会在 /24 中分配容器 IP。

  • 好处:

    • 避免占用整个 /16 造成地址浪费。
    • 更容易路由/隔离。
    • 与上游网络策略(如 VPC)兼容。

"default-address-pools"

用于控制 Docker 用户自定义网络(比如 docker network create)使用的默认地址池。

1
2
3
4
5
6
"default-address-pools": [
{
"base": "172.31.0.0/16",
"size": 24
}
]
  • 每次用户执行 docker network create(未指定子网)时,Docker 自动从 172.31.0.0/16 中分配一个 /24 子网。
  • 第一网段为:172.31.0.0/24,下一个是 172.31.1.0/24,依此类推。

它避免了不同项目间创建自定义网络时发生 IP 冲突。


1.4. 如下自定义网络

  1. docker0 网桥:使用 172.30.0.1/16

  2. 容器 IP 只从 172.30.0.0/24 里分配,例如:172.30.0.2

  3. 用户自定义网络:

    1
    docker network create mynet1

    会自动获得:172.31.0.0/24
    再建一个 mynet2
    会获得:172.31.1.0/24


1.5.注意事项

  • 所有这些地址段 都不能与宿主机实际网段冲突
  • 若系统已有 172.30.*.* 的网卡或路由,启动 Docker 守护进程时会失败。
  • 如用于 K8s 环境(containerd/Calico/flannel),需配合考虑网络规划。

2.使用 default-address-pools 控制 Docker 子网分配

这是新方式,适合 docker network create 时按池分配子网:

1
2
3
4
5
6
7
8
{
"default-address-pools": [
{
"base": "172.20.0.0/16",
"size": 24
}
]
}

这会使 Docker 在每次创建网络时,从 172.20.0.0/16 中按 /24 分配子网。


3.重启 Docker 生效

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker