一、containerd简介
官 方 文 档 : https://containerd.io
在 2016 年 12 月 14 日,Docker 公司宣布将containerd 从 Docker 中分离,由开源社区独立发展和运营。Containerd 完全可以单独运行并管理容器,而 Containerd 的主要职责是镜像管理和容器执行。同时,Containerd 提供了 containerd-shim 接口封装层,
向下继续对接 runC 项目,使得容器引擎 Docker Daemon 可以独立升级。
Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。总结一下,它主要负责干以下事情:
• 管理容器的生命周期(从创建容器到销毁容器)
• 拉取/推送容器镜像
• 存储管理(管理镜像及容器数据的存储)
• 调用 runC 运行容器(与 runC 等容器运行时交互)
• 管理容器网络接口及网络
1.docker与containerd之间的关系
Docker 包含 Containerd,Containerd 专注于运行时的容器管理,而 Docker 除了容器管理之外,还可以完成镜像构建之类的功能。
Containerd 提供的 API 偏底层,不是给普通用户直接用的,容器编排的开发者才需要Containerd。
2.Containerd 在容器生态中扮演的角色
Containerd 并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如 Kubernetes等容器编排系统。
Containerd 以 daemon 的形式运行在系统上,通过 unix domain socket 暴露底层的 grpc API,上层系统可以通过这些 API 管理机器上的容器.
containerd不包含runc,但是运行容器需要runc
cri-container不包含cni,但是运行容器也需要cni plugin
cri-container-cni包含runc,包含cni。需要解压到根目录下
K8S 为什么要放弃使用 Docker 作为容器运行时,而使用 containerd 呢?
Docker,Kubernetes 等工具来运行一个容器时会调用容器运行时(CRI),比如 containerd,CRI- O,通过容器运行时来完成容器的创建、运行、销毁等实际工作,Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 docker(
在 k8s1.24 版本之前用,1.24 开始废弃了)、containerd, CRI-O 等多种容器运行时,这些容器运行时都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行
备注:CRI
CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,你需要在集群中的每个节点上都有一个可以正常工作的容器运行时, 这样 kubelet 能启动 Pod 及其容器。容器运行时接口(CRI)是kubelet 和容器运行时之间通信的主要协议。
OCI:
OCI, Open Container Initiative ,是一个轻量级,开放的治理结构(项目),在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。 OCI 项目由 Docker,CoreOS(后来被 Red Hat 收购了,相应的席位被 Red Hat 继承)和容器行业
中的其他领导者在 2015 年 6 月的时候启动。
k8s使用containerd具体原因:
如果你使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 去调用 Docker, 再通过 Docker 去调用containerd。
如果你使用 containerd 作为K8S 容器运行时的话, kubelet 可以直接调用 containerd。
使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的容器运行时,具有大量其他功能)。
调用链
Docker 作为 k8s 容器运行时,调用关系如下:
kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd Containerd 作为 k8s 容器运行时,调用关系如下:
kubelet --> cri plugin(在 containerd 进程中) --> containerd
二、containerd安装
# 1.安装源和依赖软件包(与docker没区别) yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo yum makecache fast # 2.安装containerd yum install containerd -y containerd --version # 查看containerd版本 # 3.启动containerd systemctl start containerd && systemctl enable containerd && systemctl status containerd # 4.修改contianerd配置文件,配置镜像仓库加速地址 # 直接生产默认配置文件:containerd config default > /etc/containerd/config.toml vim /etc/containerd/config.toml
[plugins]
[plugins.cri]
[plugins."io.containerd.grpc.v1.cri"]
# 将镜像下载地址改为阿里云地址
sandbox_image = "registry.cn- hangzhou.aliyuncs.com/google_containers/pause:3.6"
###自有镜像源配置
[plugins.cri.registry]
[plugins.cri.registry.mirrors]
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://pft7f97f.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]
[plugins.cri.registry.mirrors."gcr.io"]
endpoint = [
"https://gcr.mirrors.ustc.edu.cn"
]
[plugins.cri.registry.mirrors."k8s.gcr.io"]
endpoint = [
"https://gcr.mirrors.ustc.edu.cn/google-containers/"
]
[plugins.cri.registry.mirrors."quay.io"]
endpoint = [
"https://quay.mirrors.ustc.edu.cn"
]
systemctl daemon-reload && systemctl restart containerd && systemctl status containerd
# 5.开启包转发功能和修改内核参数 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 参数生效:sysctl -p 查看: lsmod | grep br_netfilter
2.containerd设置私有镜像仓库
#1. 找到.registry.configs增加以下内容
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = ""
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.test.com:6443"]
endpoint = ["https://harbor.test.com:6443"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.test.com:6443".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.test.com:6443".auth]
username = "name"
password = "pass"
systemctl restart containerd
最好不要使用别的端口了直接80快速方便
测试:crictl pull harbor.test.com:6443/app:v1
# 拉取镜像命令 ctr images pull harbor.test.com:6443/tools/centos:centos7.9.2009 --skip-verify 或者 ctr images pull harbor.test.com:6443/tools/centos:centos7.9.2009 --skip-verify --user=admin:harbor123
3.containerd镜像操作
命令介绍:
ctr:是containerd本身的CLI
crictl :是Kubernetes社区定义的专门CLI工具
1.查看本地镜像列表
ctr images list 或者 crictl images
查看导入的镜像
ctr images ls
列表名称:
REF TYPE DIGEST SIZE PLATFORMS LABELS
2.下载镜像命令
ctr images pull docker.io/rancher/mirrored-pause
# 3.上传命令:打标签
ctr images tag docker.io/docker/alpine:latest host/test/alping:v1
或
ctr i tag docker.io/docker/alpine:latest host/test/alping:v1
ctr images pull host/test/alping:v1
# 4.导入/导出本地镜像
ctr images import app.tar
ctr images exporter
[root@node1 ~]# ctr i ls -q docker.io/library/busybox:1.28 docker.io/library/tomcat:8.5-jre8-alpine # 导出 [root@node1 ~]# ctr images export busybox-1.28.tar.gz docker.io/library/busybox:1.28 # 删除 [root@node1 ~]# ctr images rm docker.io/library/busybox:1.28 或 ctr i rm docker.io/library/busybox:1.28 docker.io/library/busybox:1.28 # 导入 [root@node1 ~]# ctr images import busybox-1.28.tar.gz unpacking docker.io/library/busybox:1.28 (sha256:585093da3a716161ec2b2595011051a90d2f089bc2a25b4a34a18e2cf542527c)...done # 查看容器名称列表 [root@node1 ~]# ctr i ls -q docker.io/library/busybox:1.28 docker.io/library/tomcat:8.5-jre8-alpine
# 5.显示运行的容器列表
crictl ps
# 6.删除本地镜像
ctr images ls
crictl rmi # 没生效可以使用下面这个
ctr i rm REF名称
# 7. 查看容器资源情况
crictl stats
# 8.登录容器平台
crictl exec
# 9.容器启动和停止
crictl start/stop
# 10.查看容器日志
crictl logs
[root@master containerd]# ctr image --help
NAME:
ctr images - manage images
USAGE:
ctr images command [command options] [arguments...]
COMMANDS:
check check existing images to ensure all content is available locally
export export images
import import images
list, ls list images known to containerd
mount mount an image to a target path
unmount unmount the image from the target
pull pull an image from a remote
push push an image to a remote
delete, del, remove, rm remove one or more images by reference
tag tag an image
label set and clear labels for an image
convert convert an image
11.查看containerd默认命名空间
[root@moban containerd]# ctr namespace ls
NAME LABELS
default
moby
ctr 有命名空间 namespace 来指定类似于工作空间的隔离区域。使用方法 ctr -n default images ls来查看 default 命名空间的镜像,不加 -n 参数,默认也是使用 default 的命名空间。
12.查看默认名称空间下镜像
[root@moban containerd]# ctr -n=default images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 application/vnd.docker.distribution.manifest.list.v2+json sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db 294.7 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64 -
4.基于containerd运行容器
#基于 containerd 运行一个容器
这里要解释一个概念 containers 和 task ,在 docker 里面 container 概念被弱化 ,将 containers 和 task 整合在一起,基于 docker run 可以运行容器。
ctr 中 containers 是镜像实例化的一个虚拟环境,提供一个磁盘,模拟空间,就好比你电脑处于关机状态一样。
ctr 中 tasks 是将容器运行起来,电脑开机了 ,初始化进程等 ,task 就是的这么个形式。
[root@moban containerd]# ctr image pull docker.io/library/busybox:latest
# 运行容器
[root@moban containerd]# ctr run -d docker.io/library/busybox:latest busybox-v1
# 查看容器在宿主机的PID
[root@moban containerd]# ctr task ls
TASK PID STATUS
busybox-v1 3914 RUNNING
# 进入容器
[root@moban containerd]# ctr task exec --exec-id 3914 -t busybox-v1 sh
/ #
# 删除容器
# 可以先停止容器再删除
[root@moban containerd]# ctr task kill --signal 9 busybox-v1
[root@moban containerd]# ctr task ls
TASK PID STATUS
busybox-v1 4233 STOPPED
# 直接删除
[root@moban containerd]# ctr task rm -f busybox-v1
WARN[0000] task busybox-v1 exit with non-zero exit code 137
# 容器运行停止
[root@moban containerd]# ctr task ls
TASK PID STATUS
# 查看
[root@moban containerd]# ctr c ls
CONTAINER IMAGE RUNTIME
busybox-v1 docker.io/library/busybox:latest io.containerd.runc.v2
# 删除
[root@moban containerd]# ctr c rm busybox-v1
5.上传镜像
# 镜像拉取需要加上参数--all-platform,否则上传时候会出现not found报错 ctr images pull --all-platforms harbor.test.com:6443/tools/busybox:latest # 1.标签 [root@moban containerd]# ctr images tag docker.io/library/busybox:latest harbor96.9you.com:6443/tools/busybox:v1 harbor96.9you.com:6443/tools/busybox:v1 # 上传 [root@moban containerd]# ctr images push harbor.test.com:6443/tools/busybox:v1 --user=admin:harbor123 ctr images push harbor.test.com:6443/tools/busybox:v1 --skip-verify ctr images push harbor.test.com:6443/tools/busybox:v1 --skip-verify --user=admin:harbor123
6.镜像加速器第二种添加方式
# 修改/etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".registry] config_path = "/etc/containerd/certs.d" cd /etc/containerd/certs.d cat hosts.toml [host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"] capabilities = ["pull"] systemctl restart containerd
7.docker与containerd命令比对
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)