一.什么是Containerd
Containerd(ContainerDaemon)是一个开源的容器运行时,它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由Docker开发团队创建的,并在后来成为一个独立的项目,被纳入了c1oudNativeComputingFoundation(云原生计算基金会CNCF)的解化项目中
以下是containerd的主要特点和功能:
容器生命周期管理: Containerd管理容器的生命周期,包括容器的创建、运行、暂停、恢复、停止和销毁等操作。
标准化接口: Containerd提供了一个标准化的容器运行时接口,使得它可以与多个容器编排系统和工具集成,例如Kubernetes、DockerCompose等
镜像管理:它支持容器镜像的拉取、推送、保存和加载等操作。Containerd使用OCI(OperContainerInitiative)规范定义容器镜像的格式
插件体系结构:Containerd具有可扩展的插件体系结构,允许用户通过插件来扩展其功能,例如存储驱动、网络插件等。
跨平台支持: Containerd可以在不同的操作系统上运行,从而提供了跨平台的支持。
与Kubernetes集成: Containerd作为Kubernetes的默认容器运行时,与Kubernetes紧密集成,为容器工作负载的管理提供了良好的支持。
安全性和隔离:Containerd实现了严格的容器隔离和安全性措施,确保容器之间的隔离性以及对主机系统的安全性。
总体而言,Containerd提供了一个轻量级、高度可定制的容器运行时,为容器生态系统的发展提供个稳定和可靠的基础。它在容器生命周期管理、镜像管理和插件支持等方面为用户提供了丰富的功能
二.架构概述
containerd的架构是modularity(模块化)和可扩展性的体现,他被设计为一个轻量级,高度可定制的容器运行时。
可以看出Containerd采用的也是C/S架构,服务端通过unix domain socket暴露低层的gRPC API接口出去,客户端通过这些API管理节点上的容器,每个Containerd只负责一台机器,pull镜像,对容器的操作(启动,停止),网络,存储都是由Containerd完成。具体运行容器由run负责。
为了解耦,Containerd将系统划分成不同的组件,每个组件都由一个或多个模块协作完成(core部分),每一种类型的模块都以插件的形式集成到Containerd中。
三.核心组件解析
Containerd组件大致分为storage,Metadata和Runtime三个方面。
1.Storage(存储)
Content(内容)
功能:Content存储了容器镜像的实际数据,包括文件系统层和元数据,用于创建和管理容器的基础文件系统。
snapshot(快照)
功能:snapshot存储容器的快照数据,每个容器都可以有一个或多个快照,允许它们共享相同的文件系统层,提高效率。
Diff(差异)
功能:Diff存储容器文件系统层之间的差异。当容器运行时需要修改文件系统时,会在已有的文件系统层窗机一个差异层,已保存变更。
2.Metadata(元数据)
Image(镜像)
功能:Image存储容器镜像的元数据,包括镜像的标签,大小,创建时间等信息。Metadata中的Images组件允许容器对镜像进行管理和操作
Containers(容器)
功能:Containers存储容器的元数据,包括容器的状态,配置信息,网络设置等,这部分元数据使得容器能够有效地管理容器的生命周期。
3.Runtime(运行时)
Tasks(任务)
功能:Tasks包括容器内的进程组,每个容器运行都有关联的task,他负责管理容器内的所有进程。Tasks与Shim一起工作,维护容器的状态。
Events(事件)
功能:Event组件记录了容器的各种事件,如容器的创建,启动,停止。这些事件可以用于监控和日志记录,帮组用户了解容器的运行状况。
四.Containerd的安装
1.配置阿里yum仓库为源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
2.到阿里镜像站,搜索Docker,复制以下内容
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
3.列出可用版本
yum list containerd.io --showduplicates
4.安装最新版Containerd
yum -y install containerd.io
五.配置Containerd
(1)查看配置文件
mkdir -p /etc/contaunterd
cd /etc/contaunterd
containerd config default>config.toml
或
Containerd config default | sudo tee /etc/containerd/config.toml
备注:
sudo tee etc/containerd/config.toml:
tee命令通常用来读取标准输入,并将其内容写入文件和输出到终端
/etc/containerd/config.toml是containerd的配置文件路径,这里指定了配置文件的具体位置
使用containerdconfigdefauit命令获取containerd的默认配置信息
通过管道将这些配置信息传递给tee命令
使用sudotee/etc/containerd/config.toml以管理员权限创建或覆etc/containerd/config.tom文件,开将之前获取的配置信息与入其中
(2)配置镜像加速
vim /etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.config."docker.io"]endpoint = ["https://registry.cn-hangzhou.aliyuncs.com" ,"https://registry-1.docker.io"]
(3)启动服务查看版本
systemctl enable Containerd
systemctl start Containerd
ctr version
六.Containerd基本操作
1.镜像类操作
(1)拉取镜像
ctr images pull 镜像名称:[镜像标签]
ctr Images pull hub.atomgit.com/amd64/nginx:1.25.2-perl
备注:hub.atomgit.com/amd64/nginx:1.25.2-perl可以从https://hub.atomgit.com/获取
(2)查看镜像
ctr images ls
(3)检测本地镜像
主要查看其中ATATUS,complete表示镜像时完整可用的状态
ctr images check
(4)重新命名和打标签
ctr image tag hub.atomgit.com/amd64/nginx:1.25.2-perl nginx:v1
(5)删除镜像
ctr images rm 镜像名称 新镜像名称
ctr images rm nginx:v1
(6)镜像挂载到主机目录
ctr images mount 镜像 挂载点
ctr images mount nginx:v1 /mnt
查看挂载目录
ls -l /mnt
(7)镜像从主机目录卸载
ctr images mount 挂载点
(8)镜像导出
ctr images export --all-platforms 导出的文件名 镜像名称:[镜像标签]
ctr images export --all-platforms nginx_v1.tar nginx:v1
有时候镜像导入导出的时候会有报错,ctr:content digest sha256:xxxxxxx not found
(9)镜像导入
ctr images import 文件名
ctr images import nginx_v1.tar
2.容器类操作
(1)创建容器
ctr containers create nginx:v1 nginx
(2)列出容器
ctr containers ls
(3)查看容器的详细信息
ctr containers info nginx
(4)删除容器
ctr containers rm nginx
3.任务类操作
我们通过container create 命令创建的容器,并没有处于运行状态,只是一个静态的容器(仅仅只是一个创建容器的声明),一个container对象只是包含了运行一个容器所需的资源及相关配置数据,表示namespace,rootfs和容器的配置都已经初始化成功了,只是用户进程还没有启动。
一个容器真正运行起来是由Task任务实现。
(1)启动容器
ctr task start -d nginx
备注:-d放在后台运行
(2)查看容器
ctr task ls
(3)进入容器里面
ctr task exec --exec-id 0 -t nginx sh
(4)停止容器
ctr tack pause nginx
ctr task ls
备注:停止后,查看容器时,字段STATUS会为 PAUSED
(5)恢复容器
ctr task resume 容器名
备注:恢复后,查看容器时,字段STATUS会为RUNNING
(6) 杀死容器
ctr task kill 容器名
ctr task ls
备注:杀死后,查看容器时,字段STATUS会为 STOPPED
(7)删除任务
ctr task rm nginx
备注:删除任务“ctr task rm nginx”虽然已经删除了任务,但是创建容器的时候,也创建了一个同名的快照,即便已经删除了任务,也可以使用“ctr task sart -d nginx”命令,利用此快照将已删除的任务启动起来,使得此容器恢复运行。
(8)删除容器
删除任务
ctr task rm nginx
杀死任务
ctr task kill nginx
删除容器
ctr containers rm nginx
备注: 删除后容器快照也没有了
(9)获取容器的内存,CPU和PID的限额和使用量
ctr task metrics nginx
关键字段解释如下:
(10)查看容器中所有进程在宿主机中的PID
ctr task ps nginx
ps -ef | grep 1947
4.其他操作
(1)插件
查看所有插件
ctr plugins ls
(2)命名空间
查看命名空间
ctr ns ls
创建命名空间
ctr ns create test
删除命名空间
ctr ns rm test
在做一些操作时也有指定命名空间如:拉取镜像,修改镜像名,创建容器等
ctr -n test images pull 镜像名
ctr -n test images tag 原镜像 新名
ctr -n test images ls 查看指定命名空间内的镜像
ctr -n test containers create 镜像名 容器名