自己动手写Docker系列 -- 6.1 ip分配管理

本文档介绍如何自己动手编写一个Docker的IP分配管理工具,详细阐述了源码逻辑,并提供了测试验证。文章主要内容包括IP地址的自动分配、回收和管理,源码托管于Gitee和GitHub,读者可以通过指定版本标签进行查看。
摘要由CSDN通过智能技术生成

简介

在前面的文章中,我们完成了基本的容器操作,容器已经能在无网络情况下运行,接下来的文章中,将开始网络相关的部分,本地是编写一个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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值