首页 > 其他分享 >全网首套完整containerd容器工具教程

全网首套完整containerd容器工具教程

时间:2024-03-04 16:12:00浏览次数:38  
标签:教程 master01 ctr containerd 全网 test k8s root

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

  1. 安装
    在阿里的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]#

  1. Containerd使用私有容器镜像仓库Harbor
    在配置文件设置

  2. 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

标签:教程,master01,ctr,containerd,全网,test,k8s,root
From: https://www.cnblogs.com/tok8s/p/18052020

相关文章

  • matlab教程_台大lecture1基本操作和矩阵输入
    matlab教程视频matlabascalculatorcommendline直接用命令行计算部分ans是结果运算法则和平时一样((),^乘除加减)onlinehelpeg:helpsin&直接搜索嵌套式公式sin(cos(pi))==cos(pi)sin(ans)其中,ans是第一个的结果变量可以用who查看变量,whos详细信息一些保留......
  • containerd 导入镜像
    containerd导入镜像 containerd而非docker,需要离线导入镜像 解决原理https://segmentfault.com/a/1190000019534913ctr--namespace=k8s.ioimagesls获取到你需要的镜像名称和版本之后(参见后面的排查技巧)dockerpullmirrorgooglecontainers/$imageName:$imageVe......
  • AntSK:打造你的本地AI知识库——离线运行详细教程
        亲爱的读者朋友们,今天我要给大家介绍一个强大的开源工具——AntSK。这个工具能让您在没有Internet连接时依然能使用人工智能知识库对话和查询,想象一下,即使在无网络的环境中,您也能与AI进行愉快的交流!项目地址:https://github.com/xuzeyu91/AntSK    AntSK......
  • Taurus.MVC WebMVC 入门开发教程7:部分视图和页面片段(结束篇)
    本系列的目录大纲为:Taurus.MVCWebMVC入门开发教程1:框架下载环境配置与运行Taurus.MVCWebMVC入门开发教程2:一个简单的页面呈现Taurus.MVCWebMVC入门开发教程3:数据绑定ModelTaurus.MVCWebMVC入门开发教程4:数据列表绑定List<Model>Taurus.MVCWebMVC入门开发教程5......
  • 全网通实验
    实验一:两个网段连通配置目标:通过在路由器上配置静态路由,实现PC1能ping通PC2(即10.1.0.0/24和10.5.0.0/24网段能通)实验分析:要想实现10.1.0.0/24和10.5.0.0/24网段能通,就是中间涉及到的三层设备R1R2R3R4都有到这两个网段(10.1.0.0/24、10.5.0.0/24)的正确路由。配置步骤:连线配置PC的......
  • Office tool plus 下载&安装教程
    part1下载1在浏览器中搜索Officetoolplus,并且找到官网如图:点击下载你会看到以下界面:图:我们可以选择山东大学镜像站的下载链接这里需要看你的电脑是64位,还是32位我们可以回到桌面,右键此电脑或者是计算机点击属性,就可查看。注意:x64就是64位操作系统,x86就是......
  • PyQt入门教程(版本1)
    第1章PyQt5开发环境搭建和配置PyQt5工具可以快速实现简单的界面开发,包括界面设计、布局管理以及业务逻辑实现(信号与槽)。简单说就是使用PyQt5工具可以快速画一个控件摆放整齐、界面整洁有序、布局合理的界面。本文内容本文主要第1节PyQt5环境搭建和配置。主要内容包括:[!TIP......
  • MediaTek Filogic 系列路由器串口救砖教程
    感谢蝈蝈大佬开发的mtk_uartboot工具,这样就可以随便刷砖了适用系列:MediaTekMT7622、MT7981、MT7986、MT7988SoC1.下载工具地址:https://github.com/981213/mtk_uartboot/releasesWindows用户选择mtk_uartboot-x86_64-pc-windows-msvc.zipLinux用户选择mtk_uartboot-......
  • 【Python入门教程】Python实现鸡兔同笼
    ​        今天跟大家分享一下很久之前自己做的鸡兔同笼求解问题的小游戏,使用公式和基本的判断语句即可实现,可以用来当练手或者消磨时间用。    大家在编代码的时候最重要就是先理清逻辑思路,例如应该套几层循环、分几个模块等等。然后在编码时可以先随意一点,变......
  • Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射
    前言:在本篇Taurus.MVCWebMVC入门开发教程的第六篇文章中,我们将讨论如何配置路由并映射到控制器和操作方法。路由是决定应用程序如何响应客户端请求的重要组成部分,因此在Web开发中非常重要。我们将继续使用Taurus.Mvc命名空间,并探讨如何在应用程序中配置路由。步骤1:了......