Containerd容器计算详解
Containerd是一个开源的容器运行时,他提供了一种标准化的方式来管理容器的生命周期。该项目最初是由docker开发团队创建的,并在后来成为了一个独立的项目,被纳入了Cioud Native Computing Foundation的孵化项目中。Containerd管理容器的生命周期,包括容器的创建、运行、暂停、恢复、停止和销毁等操作。Containerd提供了一个标准化的容器运行时接口,使得
目录
一:Containerd概述
1:什么是Containerd
Containerd是一个开源的容器运行时,他提供了一种标准化的方式来管理容器的生命周期。该项目最初是由docker开发团队创建的,并在后来成为了一个独立的项目,被纳入了Cioud Native Computing Foundation的孵化项目中。
以下是Containerd的主要特点和功能:
容器生命周期管理:Containerd管理容器的生命周期,包括容器的创建、运行、暂停、恢复、停止和销毁等操作。
标准化接口:Containerd提供了一个标准化的容器运行时接口,使得它可以与多个容器编排系统和工具集成,例如Kubernetes、Docker Compose等。
镜像管理:它支持容器镜像的拉取、推送、保存和加载等操作。Containerd 使用 OCI (OpenContainer Initiative)规范定义容器镜像的格式。插件体系结构:Containerd具有可扩展的插件体系结构,允许用户通过插件来扩展其功能,例如存储驱动、网络插件等。
跨平台支持:Containerd可以在不同的操作系统上运行,从而提供了跨平台的支持。与Kubernetes集成:Containerd作为Kubernetes的默认容器运行时,与Kubernetes紧密集成,为容器工作负载的管理提供了良好的支持。
安全性和隔离:Containerd实现了严格的容器隔离利安全性措施,确保容器之间的隔离性以及对主机系统的安全性。
总体而言,Containerd提供了一个轻量级、高度可定制的容器器运行时,为容器生态系统的发展提供了一个稳定和可靠的基础。它在容器生命周期管理、镜像管理和插件支持等方面为用户提供了丰的功能。
2:Containerd的起源与背景
Containerd的起源可以追溯到Docker项目。Docker 最最初作为一个开源项目推出,旨在简化应用程序的打包、分发和部署过程。Docker引入了容器的概念,将应应用程序和其依赖项打包到一个容器中,使得应用在不同环境中可以一致地运行。
随着Docker的发展,其架构逐渐变得复杂,包含了许多功能,如镜像构建、服务编排等。为了更好地组织和管理这些功能,Docker团队决定将Docker引擎拆分成多个组件,其中一个关键的组件就是Containerd.
Docker 架构拆分:Docker从单一的大型引擎拆分为一系列小型、可复用的组件。这种拆分的目标是提高可维护性、模块化和可扩展性。
Containerd 作为核心运行时:在Docker架构拆分后,contaiinerd被定位为Docker的核心容器运行时。它负责管理容器的生命周期、镜像操作和基本运行时功能。页献给CNCF(云原生基金会):为了推动Containerd的发展Docker团队将containerd的代码捐赠给了Cloud Native Computing Foundation(CNCF),使其成为CNCF的孵化项目。
容器生态系统的标准化:Containerd的设计遵循OpenContainer Initiative(开放容器倡议OCI)规范,这是一个关注容器运行时和镜像格式标准化的开放标准组织。这意味着containerd可以与符合OCI规范的其他容器工具和运行时进行互操作。
独立的容器运行时:containerd不仅仅局限于Docker,它可以作为独立的容器运行时,与多个容器编排系统和工具集成,从而为用户提供更多选择。总体而言,containerd的起源是为了简化容器运行时的管理,并为容器生态系统提供一个开放、标准化的基础。其发展不仅服务于Docker生态系统,还为整个容器领域提供了一个通用的、可扩展的容器运行时。
二:Containerd架构
1:Containerd架构概述
Containerd 的架构设计遵循模块化、分层化的原则,这种设计使得它具有良好的扩展性和灵活性。它作为容器运行时的中间层,上接容器编排工具(如 Kubernetes),下连容器运行时接口(CRI)和底层操作系统,在整个容器生态系统中扮演着 “桥梁” 的角色。
从整体架构来看,Containerd 采用客户端 - 服务器(C/S)模式。服务器端负责管理容器的生命周期,包括镜像的下载、存储、容器的创建、运行和销毁等操作;客户端则提供了一系列命令行工具和 API,方便用户与服务器端进行交互。这种架构模式不仅降低了组件之间的耦合度,还使得 Containerd 能够轻松适配不同的使用场景和需求。
2:核心组件解析
(1)storage(存储)
Content(内容)
功能:Content存储了容器镜像的实际数据。这包括文件系统层和元数据,用于创建和管理容器的基础文件系统
Snapshot(快照)
功能:Snapshot存储容器的快照数据。每个容器都可以有一个或多个快照,允许它们共享相同的文件
系统层,提高效率。
Diff(差异)
功能:Diff存储容器文件系统层之间的差异。当容器运行时需要修改文件系统时,会在已有的文件系统
层上创建一个差异层,以保存变更。
(2)metadata(元数据)
Images(镜像)
功能:Images存储容器镜像的元数据,包括镜像的标签、大小、创建时间等信息。Metadata中的Images组件允许容器对镜像进行管理和操作。
Containers(容器)
功能:Containers存储容器的元数据,包括容器的状态、配置信息、网络设置等。这部分元数据使得容器能够有效地管理容器的生命周期。
(3)runtime(运行时)
Tasks(任务)
功能:Tasks包含容器内的进程组。每个容器运行时都有关联的Task,它负责管理容器内的所有进程。Tasks与Shim一起工作,维护容器的状态。
Events(事件)
功能:Events组件记录了容器的各种事件,如容器的创到建、启动、停止等。这些事件可以用于监控和日志记录,帮助用户了解容器系统的运行状况。
三:安装配置Containerd
1:安装Containerd
#step2:添加软件园信息
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
#列出可用版本
yum list containerd.io --showduplicates
#安装containerd
yum -y install containerd.io
2:配置Containerd
(1)生成配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
或
containerd config default > /etc/containerd/config.toml
备注:
> sudo tee /etc/containerd/config.toml:
> tee命令通常用来读取标准输入,并将其内容写入文件和输出到结瑞
> /etc/containerd/config.toml是containerd的配置文件路径,这里指定了配置文件的具体位置。
> 使用containerd config default命令获取 containerd的默认配置信息
> 通过管道|将这些配置信息传递给tee命令;
> 使用sudotee/etc/containerd/config.toml以管理员权限创建或覆盖
/etc/containerd/config.toml文件,并将之前获取的配置信息写入其中。
(2)配置镜像加速
vim /etc/containerd/config.toml
#首先修改配置文件
[plugins."io.containerd.grpc.v1.cri".registry]
config_path="/etc/containerd/certs.d" # 添加
mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.io
cat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
cat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
(3)启动服务
systemctl restart containerd
systemctl status containerd
[root@localhost ~]# ctr version
四:Containerd基本操作
1:镜像类操作
(1)拉取镜像
使用ctrimagespull命令可以下载镜像
命令格式:
ctrimagespull镜像名称:[镜像标签]
#全平台拉取镜像
[root@localhost ~]# ctr images pull docker.io/library/nginx:latest \
all-platforms \
--hosts-dir=/etc/containerd/certs.d/
#指定平台拉取镜像
[root@localhost ~]# ctr images pull docker.io/library/nginx:latest \
platform linux/amd64 \
--hosts-dir=/etc/containerd/certs.d/
(2)查看镜像
查看本地有哪些镜像可以使用ctrimagesls,默认查看到的的是default命名空间的镜像。
[root@localhost ~]# ctr images ls
查看crictl拉取的镜像:
[root@localhost ~]# ctr -n k8s.io images ls
(3)检测本地镜像
主要查看其中的STATUS,complete表示镜像是完整可用的的状态
命令格式:
ctr images check
[root@localhost ~]# ctr images check
(4)重新打标签
命令格式:
ctrimages tag当前镜像名称新镜像名称 新镜像名称
ctr images tag docker.io/library/nginx:latest nginx:v1
ctr images tag docker.io/library/nginx:latest ngirX:V2
(5)删除镜像
命令格式:
ctrimages rm镜像名称:[镜像标签]
[root@localhost ~]# ctr images rm nginx:v2
(6)镜像挂载到主机目录
Containerd可以把镜像直接挂载到宿主机的某个目录
命令格式:
ctrimagesmount镜像挂载点
[root@localhost ~]# ctr images mount nginx:v1/mnt
[root@localhost ~]# ls -l /mnt/
(7)镜像从主机目录卸载
用于将挂载到宿主机的镜像卸载下来
命令格式:
ctrimages unmount挂载点
[root@localhost ~]# ctr images unmount/mnt/
(8)镜像导出
该命令主要用于把镜像保存成文件
命令格式:
ctrimages export --all-platforms文件名 镜像名称:[镜像标签]
#全平台导出
ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest
#指定平台导出
ctr images export --platform linux/amd64 nginx_latest.tar docker.io/library/nginx:latest
(9)镜像导入
该命令主要用于把文件加载为镜像
命令格式:
ctrimages import 文件名
#全平台导入
ctr images import --all-platform nginx_latest.tar
#指定平台导入
ctr images import --platform linux/amd64 nginx_latestt. tar
2:容器类操作
(1)创建容器
#基于docker.io/library/nginx:latest镜像创建一个叫nginx的容器
[root@localhost ~]# ctr containers create ngirx:v1 nginx
(2)列出容器
[root@localhost ~]# ctr containers ls
(3)查看容器的详细信息
[root@localhost ~]# ctr containers info nginx
(4)删除容器
[root@localhost ~]# ctr containers ls
[root@localhost ~]# ctr containers rm nginx
[root@localhost ~]# ctr containers ls
3:任务类操作
(1)启动容器
#启动任务的时候要先有容器
[root@localhost ~]# ctr containers create ngirx:v1 nginx
[root@localhost ~]# ctr containers ls
#-d放入后台
[root@localhost ~]# ctr task start -d nginx
(2)查看容器
[root@localhost ~]# ctr_task ls
(3)进入容器里面
#进入到容器里面
#不过这里需要注意必须要指定--exec-id参数,这个 id可以随便写,只要唯一就行
[root@localhost ~]# ctr task exec --exec-id 0 -t nginxsh
(4)暂停容器
[root@localhost ~]# ctr task pause nginx
[root@localhost ~]# ctr task ls
(5)恢复容器
[root@localhost ~]# ctr task resume nginx
[root@localhost ~]# ctr task ls
(6)杀死容器
#杀死容器,ctr没有stop容器的功能,只能暂停或者杀死容器
[root@localhost ~]# ctr task kill nginx
[root@localhost ~]# ctr task ls
(7)删除任务
[root@localhost ~]# ctr_task rm nginx
注意:
虽然已经删除了任务,但是创建容器的时候,也创建了一个同名的快照,即便已经删除了任务,也可以使
用"ctr task start-d nginx"命令,利用此快照将已删除的任务启动起来,使得此容器恢复运行。
(8)删除容器
[root@localhost ~]# ctr task kill nginx
[root@localhost ~]# ctr container rm nginx
注意:
删除容器后快照也就没有了
(9)获取容器的内存、cpu、和pid的限额与使用量
获取容器的内存、CPU和PID的限额与使用量
[root@localhost ~]# ctr containers create nginx:v1 nginDX
[root@localhost ~]# ctr task start -d nginx
[root@localhost ~]# ctr task metrics nginx
(10)查看容器中所有进程在宿主机中的pid
#先启动一个容器
[root@localhost ~]# ctr task start -d nginx
#查看所有进程在宿主机的pid
[root@localhost ~]# ctr task ps nginx
4:其他操作
(1)插件
以下是Containerd中的一些常见插件类型:
Shim插件:Shim插件负责管理容器的生命周期。当一个容器任务启动时,Containerd 会调用相
应的Shim插件来创建并监管容器进程。Shim插件负责与容器进程的通信,以及监控容器的状态
Snapshotter插件:Snapshotter插件处理容器的文件系统快照(Snapshots)。它定义了容器
文件系统的结构,支持创建、管理和销毁快照,以及在不同容器之间共享文件系统层
Task插件:Task插件用于管理容器中的任务(Task)。任务考表示容器内运行的一个或多个进程,
它与容器的生命周期直接相关。
Image插件:Image插件负责处理容器镜像的拉取、推送、删除等操作。它定义了容器镜像的存储和元数据结构。
Content Store插件:Content Store 插件管理容器内内容(Content),包括镜像层和元数据
它定义了内容的存储和检索方式。#列出当前所有的插件
[root@localhost ~]# ctr plugins ls
(2)命名空间
以下是Containerd中使用的一些主要命名空间类型:
PID命名空间:它隔离了进程ID空间,使得在不同PID命名空间中的进程看起来像是在独立的
系统中运行一样。这有助于确保容器中的进程无法看到或影响主几系统上的其他进程
Network命名空间:它隔离了网络栈,使得容器内的网络环境独立于主机系统。每个容器可以有自己的网络接口、IP地址和端口等,而不会影响其他容器或主机上上的网络配置。
Mount命名空间:它隔离了文件系统挂载点,使得容器拥有自己已的文件系统视图。这样,每个容器都可以有自己的文件系统,不受其他容器的影响。
UTS命名空间:它隔离了主机名和域名,允许容器具有自己的主机名和域名。
IPC命名空间:它隔离了进程间通信(IPC)资源,使得容器内的进程无法直接与主机系统或其他容
器共享IPC资源。
User命名空间:它隔离了用户和用户组的视图,使得容器中的进程可以在容器内部以不同的用户和组身份运行,而在主机系统上的实际用户和组不受影响。这些命名空间的组合使得容器可以在相对独立的环境中运行,避免了与主机系统或其他容器的干扰。Containerd利用这些命名空间实现容器的隔离和资源管理,确保容器化应用在共享主机资源的同时获得适当的隔离。
#查看都有哪些命名空间
[root@localhost ~]# ctr ns ls#创建命名空间
[root@localhost ~]# ctr ns create test
[root@localhost ~]# ctr ns ls#删除命名空间
[root@localhost ~]# ctr ns rm test#在做操作的时候可以使用-n来指定命名空间,如果不指定表示操作的是默认的命名空间,比如查看k8s.io命名空间的镜像
[root@localhost ~]# ctr -n test images pull docker.io/library/nginx:latest
--platform linux/amd64 \
--hosts-dir=/etc/containerd/certs.d/
[root@localhost ~]# ctr -n test images tag docker.id/library/nginx:latest nginx:vi
[root@localhost ~]# ctr -n test images ls
[root@localhost ~]# ctr -n test containers create 1nginx:v1 nginx03
[root@localhost ~]# ctr -n test containers ls
[root@localhost ~]# ctr -n test task start -d nginx03
[root@localhost ~]# ctr -n test task ls
更多推荐


所有评论(0)