创建自定义bridge网络需显式指定合法CIDR子网(如/16)、Driver设为"bridge"、网络名仅含小写字母数字和连字符;容器固定IP须在子网内且未被占用;删除前须手动断开所有关联容器。

用 docker-go 创建自定义 bridge 网络
Go 程序直接调用 Docker API 管理网络,核心是使用 github.com/docker/docker/api/types/network 和 github.com/docker/docker/client。创建 bridge 网络时,必须显式指定子网(IPAM.Config),否则 Docker 会拒绝请求并返回 Invalid address: invalid CIDR address 错误。
- 子网掩码至少为
/24,如"172.28.0.0/16"合法,"172.28.0.0/32"不合法 -
Driver字段必须设为"bridge",不能省略(默认值不生效) - 网络名不能含大写字母或下划线,只支持小写字母、数字、连字符
networkResp, err := cli.NetworkCreate(ctx, "my-net", types.NetworkCreate{
Driver: "bridge",
IPAM: &network.IPAM{
Config: []network.IPAMConfig{{
Subnet: "172.28.0.0/16",
}},
},
})
给容器指定网络并设置固定 IP
启动容器时绑定到已有网络并分配静态 IP,关键在 NetworkingConfig 中嵌套 EndpointsConfig,且 IP 必须落在该网络的 Subnet 范围内。若 IP 已被占用,容器会启动失败并报错 IP address already in use。
- 必须先创建网络并确认其存在,否则
NetworkCreate返回的ID为空,后续绑定失败 -
EndpointConfig的IPAMConfig中IPv4Address是字符串,不是net.IP - 一个容器可同时加入多个网络,但每个网络需单独配置
EndpointsConfig
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "nginx:alpine",
}, &container.HostConfig{
NetworkingConfig: &network.NetworkingConfig{
EndpointsConfig: map[string]*network.EndpointSettings{
"my-net": {
IPAMConfig: &network.EndpointIPAMConfig{
IPv4Address: "172.28.10.5",
},
},
},
},
}, nil, nil, "my-nginx")
列出网络并过滤内置网络
cli.NetworkList() 默认返回所有网络,包括 bridge、host、none 这些内置网络。实际管理中通常只关心用户创建的网络,需手动过滤 Driver 字段为 "bridge" 且 Scope 为 "local" 的项;Scope 为 "swarm" 表示集群网络,普通单机环境不会出现。
-
NetworkList不支持服务端过滤,必须在 Go 代码中遍历筛选 - 某些网络可能处于
inactive状态(如无容器连接),但依然会被列出 - 字段
Internal为true表示该网络不对外暴露(禁用 NAT),常用于安全隔离场景
networks, _ := cli.NetworkList(ctx, types.NetworkListOptions{})
for _, n := range networks {
if n.Driver == "bridge" && n.Scope == "local" && !n.Internal {
fmt.Printf("Name: %s, ID: %s, Subnet: %s\n",
n.Name, n.ID[:12],
n.IPAM.Config[0].Subnet)
}
}
删除网络前必须断开所有容器
调用 cli.NetworkRemove() 删除网络时,如果仍有容器连接,会立即返回错误:network my-net is busy。Docker 不提供“强制删除”选项,必须先遍历所有容器,检查其 NetworkSettings.Networks 是否包含目标网络名,再逐个断开或停止容器。
立即学习“go语言免费学习笔记(深入)”;
- 断开操作用
cli.NetworkDisconnect(),需传入容器 ID 和网络名 - 不能仅靠
ContainerList查状态,要读取每个容器的详细信息(ContainerInspect)才能确认网络绑定关系 - 批量操作时注意上下文超时,避免因某个容器卡住导致整个流程阻塞
err := cli.NetworkRemove(ctx, "my-net")
if err != nil && strings.Contains(err.Error(), "is busy") {
// 需先执行断开逻辑,再重试 NetworkRemove
}
网络管理中最容易忽略的是:**子网 CIDR 的合法性校验发生在服务端,但错误提示极简,不指明具体哪个字段出问题;而 IP 冲突、容器未断开等运行时问题又没有自动重试或清理机制——这些都得在 Go 代码里自己兜底。**










