ontainerd容器工具教程

1、Containerd的由来

【Docker名噪一时,捐出runC】2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使用的Brog系统江湖地位受到的威胁,希望Docker公司能够与自己联合打造一款开源的容器运行时作为Docker核心依赖,但Docker公司拒绝了;接着Google公司联合RedHat、IBM等公司说服Docker公司把其容器核心技术libcontainer捐给OCI(Open Container Intiative),并更名为runC。

【CNCF成立,kubernetes被迫开源】为了进一步遏制Docker在未来技术市场影响力,避免在容器市场上Docker一家独大,Google公司带领RedHat、IBM等成立了CNCF(Cloud Native Computing Fundation)基金会,即云原生计算基金会。CNCF的目标很明确,既然在容器应用领域无法与Docker相抗衡,那就做Google更有经验的技术市场——大规模容器编排应用场景。Google公司把自己内部使用的Brog系统开源——Kubernetes,也就是我们今天所说的云原生技术生态。

【Docker妥协,贡献出Containerd】2016年Docker公司推出了Docker Swarm,意在一统Docker生态,让Docker既可以实现容器应用管理,也可以实现大规模容器编排,经过近1年左右时间的市场验证后,发现在容器编排方面无法独立抗衡kubernetes,所以Docker公司于2017年正式宣布原生支持Kubernetes。至此,Docker在大规模容器编排应用市场败下阵来,但是Docker依然不甘心失败,把Docker核心依赖Containerd捐给了CNCF,依此说明Docker依旧是一个PaaS平台。

【k8s宣布不支持Docker,Containerd成为CRI主角】2020年CNCF基金会宣布Kubernetes 1.20版本将不再仅支持Docker容器管理工具,此事的起因主要也与Docker捐给CNCF基金会的Containerd有关,早期为了实现Kubernetes能够使用Docker实现容器管理,专门在Kubernetes组件中集成一个shim技术,用来将Kubernetes 容器运行时接口(CRI,Container Runntime Interface)调用翻译成Docker的API,这样就可以很好地使用Docker了。但是随着Kubernetes在全球技术市场的广泛应用,有更多的容器管理工具的出现,它们都想能够借助于Kubernetes被用户所使用,所以就提出标准化容器运行时接口,只要适配了这个接口就可以集成到Kubernetes生态当中,所以Kubernetes取消了对shim的维护,并且由于Containerd技术的成功,可以实现无缝对接Kubernetes,所以接下来Kubernetes容器运行时的主角是Containerd。

2、Containerd概念

早在2016年3月,Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。

和原先包含在Docker Engine里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。另外独立之后containerd的特性演进可以和Docker Engine分开,专注容器运行时管理,可以更稳定。

Containerd是一个工业标准的容器运行时,重点是它简洁,健壮,便携,在Linux和window上可以作为一个守护进程运行,它可以管理主机系统上容器的完整的生命周期:镜像传输和存储,容器的执行和监控,低级别的存储和网络。

每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。

Containerd和docker不同,containerd重点是集成在大规模的系统中,例如kubernetes、Swarm、Mesos等【对于容器编排服务来说,运行时只需要使用containerd+runC,更加轻量,容易管理。】。Containerd 被设计成嵌入到一个更大的系统中,而不是直接由开发人员或终端用户使用。

Containerd的特点:

简洁的基于 gRPC 的 API 和 client library。

完整的 OCI 支持(runtime 和 image spec)。

同时具备稳定性和高性能的定义良好的容器核心功能。

一个解耦的系统(让 image、filesystem、runtime 解耦合),实现插件式的扩展和重用。

Containerd的作用:

管理容器的生命周期(从创建容器到销毁容器)。

拉取/推送容器镜像。

存储管理(管理镜像及容器数据的存储)。

调用 runC 运行容器(与 runC 等容器运行时交互)。

管理容器网络接口及网络。

使用 bucketbench 对 Docker、crio 和 Containerd 的性能测试结果,包括启动、停止和删除容器,以比较它们所耗的时间,可以发现Containerd 在各个方面都表现良好,总体性能优于 Docker 和 crio。

3、Containerd架构

Containerd 采用标准的 C/S 架构:服务端通过 GRPC 协议提供稳定的 API;客户端通过调用服务端的 API 进行高级的操作。

为了实现解耦,Containerd 将不同的职责划分给不同的组件,每个组件就相当于一个子系统(subsystem)。连接不同子系统的组件被称为模块。

Containerd 被分为三个大块: Storage 、 Metadata 和 Runtime。

Containerd 两大子系统为:

Bundle : 在 Containerd 中,Bundle 包含了配置、元数据和根文件系统数据,你可以理解为 容器的文件系统。而 Bundle 子系统允许用户从镜像中提取和打包 Bundles。

Runtime : Runtime 子系统用来执行 Bundles,比如创建容器。其中,每一个子系统的行为都由一个或多个模块协作完成(架构图中的 Core 部分)。

原文链接:https://blog.csdn.net/qq_41822345/article/details/126677121

4. 安装

在阿里的docker-ce源包含containerd的安装包

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.1 yum安装

yum install containerd.io

文件列表:

[root@test-k8s-master01 containerd]# rpm -ql containerd.io-1.6.24-3.1.el7.x86_64

/etc/containerd

/etc/containerd/config.toml

/usr/bin/containerd

/usr/bin/containerd-shim

/usr/bin/containerd-shim-runc-v1

/usr/bin/containerd-shim-runc-v2

/usr/bin/ctr

/usr/bin/runc

/usr/lib/systemd/system/containerd.service

/usr/share/doc/containerd.io-1.6.24

/usr/share/doc/containerd.io-1.6.24/README.md

/usr/share/licenses/containerd.io-1.6.24

/usr/share/licenses/containerd.io-1.6.24/LICENSE

/usr/share/man/man5/containerd-config.toml.5

/usr/share/man/man8/containerd-config.8

/usr/share/man/man8/containerd.8

/usr/share/man/man8/ctr.8

4.2 二进制文件安装:

https://www.jb51.net/article/252686.htm参考此文章

Containerd有两种安装包:

containerd-xxx:这种包用于单机测试没问题,不包含runC,需要提前安装。

cri-containerd-cni-xxxx:包含runc和k8s里的所需要的相关文件。k8s集群里需要用到此包。虽然包含runC,但是依赖系统中的seccomp(安全计算模式,是一种限制容器调用系统资源的模式。)

5.命令

5.1镜像命令

命名空间

新建

ctr ns create t1

查看

ctr ns ls

下载镜像(前缀主机与路径与后面标签都不能省) i 是images的缩写

ctr i pull docker.io/library/nginx:latest

ctr images pull docker.io/library/centos:centos7

ctr i pull --all-platforms docker.io/library/nginx:alpine

查看镜像

[root@test-k8s-master01 containerd]# ctr image ls

[root@test-k8s-master01 containerd]# ctr images ls

[root@test-k8s-master01 containerd]# ctr i ls

ctr -n=k8s.io i ls

ctr -n k8s.io i ls

命名空间一定写最前面, 因为这个global optoin

挂载查看镜像内容

[root@test-k8s-master01 ~]# ctr i mount docker.io/library/nginx:alpine /mnt

sha256:cebf02a352841cea86bdd49159f44bd8128905c3967676be9763f3dca526122c

/mnt

[root@test-k8s-master01 ~]#

[root@test-k8s-master01 ~]# ls /mnt/

bin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

umount镜像

[root@test-k8s-master01 ~]# umount /mnt

导出镜像

[root@test-k8s-master01 ~]# ctr i export ng.img docker.io/library/nginx:alpine

[root@test-k8s-master01 ~]# ls ng.img

ng.img

[root@test-k8s-master01 ~]# ls -l ng.img

-rw-r--r-- 1 root root 17993728 Mar  1 14:57 ng.img

ctr i export --all-platforms ng02.img docker.io/library/nginx:alpine

导入镜像

[root@test-k8s-master01 ~]# ctr -n t1 i import ng02.img

unpacking docker.io/library/nginx:alpine (sha256:6a2f8b28e45c4adea04ec207a251fd4a2df03ddc930f782af51e315ebc76e9a9)...done

修改镜像tag

ctr -n t1 i tag docker.io/library/nginx:alpine harbor.wens.com.cn/library/nginx:alpine

删除镜像

ctr -n t1 i rm harbor.wens.com.cn/library/nginx:alpine

5.2容器命令

新建一个静态容器(没有马上运行进程)顺序不能变, 最后是容器名字。 c 是containers的缩写

ctr c create docker.io/library/nginx:latest ng01

启运容器

ctr tasks start -d ng01

ctr t start -d ng01

如果是二进制安装没有装runC的话, 启动报错。 yum安装一般不会。

查看容器

ctr c ls

[root@test-k8s-master01 containerd]# ctr c create docker.io/library/centos:centos7 centos7

[root@test-k8s-master01 containerd]# ctr c ls

CONTAINER    IMAGE                              RUNTIME

centos7      docker.io/library/centos:centos7    io.containerd.runc.v2

[root@test-k8s-master01 containerd]# ctr task ls

    TASK    PID    STATUS

5.3 进入容器

ctr task exec --exec-id 1 -t ng03 /bin/sh

5.4 直接运行一个动态容器

ctr run -d --net-host docker.io/library/nginx:latest ng03

-d 代表dameon,后台运行

--net-host

[root@test-k8s-master01 containerd]# ctr run -d docker.io/library/nginx:latest ng03

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS   

ng03    44159    RUNNING

5.5 进入容器

ctr task exec --exec-id $RANDOM -t ng03 /bin/sh

5.6 暂停容器

[root@test-k8s-master01 containerd]# ctr t pause ng03

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS

ng03    44159    PAUSED

5.7 恢复容器

[root@test-k8s-master01 containerd]# ctr t resume ng03

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS

ng03    44159    RUNNING

5.8 停止容器

[root@test-k8s-master01 containerd]# ctr t kill ng03

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS

ng03    44159    STOPPED

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS

ng03    44159    STOPPED

5.8 删除容器任务

[root@test-k8s-master01 containerd]# ctr task rm ng03

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID    STATUS

5.9 删除容器

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS

ng03    69076    RUNNING

删除运行状态的容器会提示出错

[root@test-k8s-master01 containerd]# ctr c rm ng03

ERRO[0000] failed to delete container "ng03"            error="cannot delete a non stopped container: {running 0 0001-01-01 00:00:00 +0000 UTC}"

ctr: cannot delete a non stopped container: {running 0 0001-01-01 00:00:00 +0000 UTC}

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]# ctr t kill ng03

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]# ctr t ls

TASK    PID      STATUS

ng03    69076    STOPPED

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]# ctr c rm ng03

[root@test-k8s-master01 containerd]#

[root@test-k8s-master01 containerd]# ctr c ls

CONTAINER    IMAGE                            RUNTIME

ng01        docker.io/library/nginx:latest    io.containerd.runc.v2

ng02        docker.io/library/nginx:latest    io.containerd.runc.v2

[root@test-k8s-master01 containerd]#

6. Containerd使用私有容器镜像仓库Harbor

在配置文件设置

7. namespace

ctr ns create test.io

ctr namespace create kubemsb

ctr ns rm kubmsb (没有任务的相关数据才能删除)

指定ns创建

ctr -n kubembs images pull docker.io/library/nginx:alpine

指定ns查看

ctr -n default i ls

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容