Container研究 - 从头实现系列之四(容器管理)

容器管理

容器描述信息

从头实现系列之三(容器运行时) 中,我们介绍了如何启动容器,也提到一个数据结构 ContainerMeta,这个就是用于保存容器信息的

大部分的信息基本上从变量名中即可看出,所以只简单介绍一下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
type ContainerMeta struct {
	Name        string    `json:"name"`             // 容器名
	ProcessID   int       `json:"processId"`
	ContainerID string    `json:"containerId"`
	Image       string    `json:"image"`
	Command     string    `json:"command"`
	Created     time.Time `json:"created"`
	Status      string    `json:"status"`
	Ports       string    `json:"ports"`            // 容器映射的Port,我们实际没有使用
	Sandbox     string    `json:"sandbox"`
	Overlay     *Overlay  `json:"overlay"`
}

type Overlay struct {
	Working    string `json:"working"`
	Upper      string `json:"upper"`
	MountPoint string `json:"mountPoint"`
}

容器管理命令

基于上述数据结构,我们直接简单的创建一个文件var/container.json,保存一个 ContainerMeta 列表,即可将相关容器信息管理起来。

那么相关的命令就比较简单的:

  • container list: 读取文件var/container.json,打印所有的容器

  • container stop: 从var/container.json找到指定的容器,Kill进程组

    先使用 SIGTERM, 如果5s后进程没有结束,再发送 SIGKILL 命令

  • container rm: 从var/container.json找到指定的容器,停止后,解除挂载,并删除Sandbox目录