简介
在前面的文章中,我们完成了基本的容器操作,容器已经能在无网络情况下运行,接下来的文章中,将开始网络相关的部分,本地是编写一个ip分配工具
源码说明
同时放到了Gitee和Github上,都可进行获取
本章节对应的版本标签是:5.2,防止后面代码过多,不好查看,可切换到标签版本进行查看
代码实现
在本篇中将实现一个ip分配管理工具
主要的思路如下:
1 给定一个网段,能自动分配未使用的IP地址
2 能回收IP地址,提供给下次使用
IP地址需要一个存储,目前如书中所说,简单采用字符串进行记录,一个位置就是一个IP标识位
IP地址分配管理
下面的代码包含了IP地址的分配,回收和再分配
const ipamDefaultAllocatorPath = "/var/run/mydocker/network/ipam/subnet.json"
// IPAM 存放IP地址分配信息
type IPAM struct {
// 分配文件存放位置
SubnetAllocatorPath string
// 网段和位图算法的数组map,key是网段,value是分配的位图数组
Subnets *map[string]string
}
// 初始化一个IPAMd对象
var ipAllocator = &IPAM{
SubnetAllocatorPath: ipamDefaultAllocatorPath,
}
// 加载网段地址分配信息
func (ipam *IPAM) load() error {
if _, err := os.Stat(ipam.SubnetAllocatorPath); err != nil {
if os.IsNotExist(err) {
return nil
}
return err
}
subnetConfigFile, err := os.Open(ipam.SubnetAllocatorPath)
defer subnetConfigFile.Close()
if err != nil {
return err
}
subnetJson := make([]byte, 2000)
n, err := subnetConfigFile.Read(subnetJson)
if err != nil {
return err
}
err = json.Unmarshal(subnetJson[:n], ipam.Subnets)
if err != nil {
return fmt.Errorf("dump allocation info err: %v", err)
}
log.Infof("load ipam file from: %s", subnetConfigFile.Name())
return nil
}
// 存储网段地址分配信息
func (ipam *IPAM) dump() error