containerd 容器概述

news2024/11/24 17:08:15

containerd 容器概述

官方文档:

https://containerd.io

在 2016 年 12 月 14 日,Docker 公司宣布将 containerd 从 Docker 中分离,由开源社区独立发展和

运营。Containerd 完全可以单独运行并管理容器,而 Containerd 的主要职责是镜像管理和容器执

行。同时,Containerd 提供了 containerd-shim 接口封装层,向下继续对接 runC 项目,使得容器

引擎 Docker Daemon 可以独立升级。

Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管

理、存储和网络等。总结一下,它主要负责干以下事情

• 管理容器的生命周期(从创建容器到销毁容器)
• 拉取/推送容器镜像
• 存储管理(管理镜像及容器数据的存储)
• 调用 runC 运行容器(与 runC 等容器运行时交互)
• 管理容器网络接口及网络

ctr:containerd 的命令行客户端。

1、Containerd 和 Docker 之间的关系

1、Containerd 和 Docker 之间的关系
Docker 包含 Containerd,Containerd 专注于运行时的容器管理,而 Docker 除了容器管理之
外,还可以完成镜像构建之类的功能。
Containerd 提供的 API 偏底层,不是给普通用户直接用的,容器编排的开发者才需要
Containerd。
2、Containerd 在容器生态中扮演的角色
Containerd 并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如 Kubernetes
等容器编排系统。
Containerd 以 daemon 的形式运行在系统上,通过 unix domain socket 暴露底层的 grpc 
API,上层系统可以通过这些 API 管理机器上的容器。

**互动 1:**K8S 为什么要放弃使用 Docker 作为容器运行时,而使用 containerd 呢?

知道:1

不:2

Docker,Kubernetes 等工具来运行一个容器时会调用容器运行时(CRI),比如 containerd,CRIO,通过容器运行时来完成容器的创建、运行、销毁等实际工作,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 继承)和容器行业中的其他领导者在 20156 月的时
候启动。
如果你使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 去调用 Docker,
再通过 Docker 去调用 containerd。
如果你使用 containerd 作为 K8S 容器运行时的话, kubelet 可以直接调用 containerd。

containerd对比docker优点

使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的
容器运行时,具有大量其他功能)。

调用链

Docker 作为 k8s 容器运行时,调用关系如下:

kubelet --> docker shim (在 kubelet 进程中) --> dockerd --> containerd

Containerd 作为 k8s 容器运行时,调用关系如下:

kubelet --> cri plugin(在 containerd 进程中) --> containerd

containerd 安装和配置

安装 docker 会自动把 containerd 安装出来,也可以通过如下命令直接安装 containerd

需要配置 docker-ce.repo 这个 yum 源:

[root@xianchaomaster1 ~]#yum install yum-utils -y
[root@xianchaomaster1 ~]#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo



[root@xianchaomaster1 ~]# yum install containerd -y
[root@xianchaomaster1 ~]# systemctl enable containerd
[root@xianchaomaster1 ~]# systemctl start containerd

初始化 Containerd 配置

[root@xianchaomaster1 ~]# containerd config default > /etc/containerd/config.toml
[root@xianchaomaster1 ~]# systemctl enable containerd
[root@xianchaomaster1 ~]# systemctl start containerd

替换 containerd 默认的 sand_box 镜像,编辑/etc/containerd/config.toml 文件:

sandbox_image = "k8s.gcr.io/pause:3.2" 替换成 registry.cnhangzhou.aliyuncs.com/google_containers/pause-amd64:3.2

应用配置并重新运行 containerd 服务

[root@xianchaomaster1 ~]# systemctl daemon-reload
[root@xianchaomaster1 ~]# systemctl restart containerd
[root@xianchaomaster1 ~]# systemctl status containerd

[root@xianchaomaster1 ~]# ctr images pull registry.cnhangzhou.aliyuncs.com/google_containers/pause-amd64:3.2

containerd 容器相关操作

#查看 containerd 命名空间
[root@xianchaomaster1 ~]# ctr namespace ls

ctr 有命名空间 namespace 来指定类似于工作空间的隔离区域。使用方法 ctr -n default images ls

来查看 default 命名空间的镜像,不加 -n 参数,默认也是使用 default 的命名空间。

#查看默认名称空间镜像有哪些
[root@xianchaomaster1 ~]# ctr image ls
#查看 k8s 命名空间下的镜像
[root@xianchaomaster1 ~]# ctr -n=k8s.io images ls
#拉取 busybox 镜像
[root@xianchaomaster1 ~]# ctr image pull docker.io/library/busybox:latest
注:必须全路径,从 dockerhub 上下载默认 busybox 镜像。
[root@xianchaomaster1 ~]# ctr images rm 删除镜像
#压缩镜像
[root@xianchaomaster1 ~]# ctr images pull docker.io/library/mysql:latest
[root@xianchaomaster1 ~]# ctr images export mysql.tar.gz 
docker.io/library/mysql:latest
#导出镜像
[root@xianchaomaster1 ~]# ctr images import mysql.tar.gz

image-20230208100457489

互动 1:docker 的镜像和 containerd 镜像通用吗?

答:通用的,docker save -o 生成的镜像文件,可以基于 ctr images import 导出来

基于 containerd 运行一个容器

这里要解释一个概念 containers 和 task ,在 docker 里面 container 概念被弱化 ,将 containers 和

task 整合在一起,基于 docker run 可以运行容器。

ctr 中 containers 是镜像实例化的一个虚拟环境,提供一个磁盘,模拟空间,就好比你电脑处于关机状

态一样。

ctr 中 tasks 是将容器运行起来,电脑开机了 ,初始化进程等 ,task 就是的这么个形式。

创建 task,运行容器

[root@xianchaomaster1 ~]# ctr run -d docker.io/library/busybox:latest busybox-v1
#查看该容器在宿主机的 PID:
[root@xianchaomaster1 ~]# ctr task ls

[root@xianchaomaster1 ~]# ctr task exec --exec-id 3118 -t busybox-v1 sh
#删除 task:
[root@xianchaomaster1 ~]# ctr task rm -f busybox-v1
删除容器:
[root@ xianchaomaster1 ~]# ctr c ls
CONTAINER IMAGE RUNTIME 
busybox-v1 docker.io/library/busybox:latest io.containerd.runc.v2
[root@ xianchaomaster1 ~]# ctr c rm busybox-v1
#查看帮助命令:
[root@xianchaomaster1 ~]# ctr task --help

image-20230208101400674

扩展:ctr 命令练习

列出镜像:
[root@xianchaomaster1 ~]# ctr image ls
给镜像打标签:
[root@xianchaomaster1 ~]# ctr i tag docker.io/library/busybox:latest 
docker.io/library/busybox:v1
注意:如果 docker.io/library/busybox:v1 存在,可以强制替换
[root@xianchaomaster1 ~]# ctr i tag --force docker.io/library/busybox:latest 
docker.io/library/busybox:v1
删除镜像:
[root@xianchaomaster1 ~]# ctr i rm docker.io/library/busybox:v1
查看容器:
[root@xianchaomaster1 ~]# ctr c ls
删除容器:
删除容器之前需要先停掉容器的 task
[root@ xianchaomaster1 ~]# ctr run -d docker.io/library/busybox:latest busybox-v1
[root@xianchaomaster1 ~]# ctr task ls
TASK PID STATUS 
busybox-v1 38486 RUNNING
[root@xianchaomaster1 ~]# ctr c ls
CONTAINER IMAGE RUNTIME 
busybox docker.io/library/busybox:latest io.containerd.runc.v2 
busybox-v1 docker.io/library/busybox:latest io.containerd.runc.v2
停掉 task
[root@xianchaomaster1 ~]# ctr tasks kill --signal 9 busybox-v1
[root@xianchaomaster1 ~]# ctr task ls
TASK PID STATUS 
busybox-v1 38486 STOPPED
[root@xianchaomaster1 ~]# ctr c delete busybox-v1

ctr 和 docker 命令比较

image-20230208101703876

备注: ctr 并没有创建原始镜像的能力,也就是说无法进行 docker 的 build 和 commit 操作。
 docker build 基于 dockerfile 可以构建镜像
 ctr 命令无法构建镜像

配置 containerd 使用 harbor 私有镜像仓库

[root@xianchaomaster1 ~]# vim /etc/containerd/config.toml
修改 containerd 配置文件:
找到[plugins."io.containerd.grpc.v1.cri".registry.configs]这个位置,增加如下内容:
 [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.40.181:80".tls]
 insecure_skip_verify = true # 是否跳过安全认证
 [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.40.181:80".auth]
 username = "admin"
 password = "Harbor12345"

image-20230208101911233

找到[plugins."io.containerd.grpc.v1.cri".registry.mirrors]这个位置,增加如下内容:
 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
 endpoint = ["https://registry.docker-cn.com"]
 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.40.181:80"]
 endpoint = ["http://192.168.40.181:80"]

如下:

image-20230208101942719

修改完配置,重启 containerd:

[root@xianchaomaster1 ~]# systemctl restart containerd

从 harbor 里拉取镜像:

[root@xianchaomaster1 ~]# ctr images pull 192.168.40.181/test/tomcat:v1 --skipverify --user=admin:Harbor12345

把镜像传到 harbor 镜像仓库:

[root@xianchaomaster1 ~]# ctr images pull --all-platforms 
docker.io/library/nginx:latest
[root@xianchaomaster1 ~]# ctr images tag docker.io/library/nginx:latest 
192.168.40.181/test/nginx:v1
[root@xianchaomaster1 ~]# ctr images push 192.168.40.181/test/nginx:v1 --skipverify --user=admin:Harbor12345

chaomaster1 ~]# ctr images pull --all-platforms
docker.io/library/nginx:latest
[root@xianchaomaster1 ~]# ctr images tag docker.io/library/nginx:latest
192.168.40.181/test/nginx:v1
[root@xianchaomaster1 ~]# ctr images push 192.168.40.181/test/nginx:v1 --skipverify --user=admin:Harbor12345


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S-解决报错--总结日记

问题一:etcd和apiserver无法正常启动 问题查看nodes节点发生报错 解决方法/步骤 步骤一:K8S集群节点异常重启后,再终端执行kubectl get nodes命令,出现报错dial tcp 10.200.18.100:6443: connect: connection refused。 步骤二…

elementPlus 二次封装 el-upload

此案例是区分上传的文件还是图片&#xff1b; 需要注意的是 before-upload 事件&#xff0c;如果是返回了 false&#xff0c;也会默认走on-remove&#xff0c;需要在 remove事件里做file 的状态判断。 <template><el-upload class"upload-box" ref"…

python3a 之 循环与加速(for循环,list 简化,iterrows, enumerate )

1. map 的用法&#xff1a; 替代for循环&#xff0c;辅助加速 map(function, list) 简写 map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数 [1, 4, 9, 16, 25] 提供了两个列表&#xff0c;对相同位置的列表数据进行相加 >>> map(lambda x, y: x y, …

做电商数据分析报表做到废?BI平台试过了?

层出不穷的临时分析需求、大量的重复性操作、眨眼流失的时间&#xff0c;那是电商数据分析人员才都懂的感受。每日一问&#xff0c;今天你做电商数据分析报表做到废了吗&#xff1f;怎么改变这种情况&#xff1f;或许BI大数据分析平台可以一试。 BI大数据分析平台&#xff1a;…

activiti和flowable如何迁移到camunda

一、activiti如何迁移到camunda 将 流程引擎Activiti 迁移到工作流平台Camunda 需要考虑以下几个方面&#xff1a; 1、流程定义的兼容性&#xff1a;Camunda 支持 BPMN 2.0 规范&#xff0c;因此 Activiti 定义的流程需要进行检查和调整以确保与 Camunda 兼容。 2、数据库兼容…

什么是ChatGPT,原理是什么?看完这篇还不懂,我直播吃屏!!福利:中文版CHAT GPT镜像纯分享

目录 福利&#xff1a;文末纯分享中文版CHAT GPT镜像&#xff0c;不存在魔法&#xff0c;纯分享免费使用 前言&#xff1a; 1. 概率从何而来&#xff1f; 2、什么是模型 3、类人的任务模型 3、神经网络 4 、机器学习和神经网络的训练 5、神经网络训练的实践与理论 6、嵌…

BGA和QFP有什么区别?引脚设计有哪些方法?

CPU是中央处理器&#xff0c;Central Processing Unit 英文的缩写&#xff0c;电脑中一个最重要&#xff0c;最核心的东西&#xff0c;相当一个人的大脑&#xff0c;是用来思考、分析和计算的。目前市面上比较常见的CPU来自两个品牌&#xff0c;一个是intel公司生产的&#xff…

Layui源码解读之use函数(模块加载)

一、layui.use 用法 layui.use() 函数用于模块加载 layui.use([mods], callback) mods&#xff1a;如果填写(选填)&#xff0c;必须是一个 layui 合法的模块名&#xff08;不能包含目录&#xff09;。 从 layui 2.6 开始&#xff0c;若 mods 不填&#xff0c;只传一个 callbac…

StarRocks案例3: 通过[broadcast] 优化慢SQL

文章目录 一. 问题描述二. 解决方案三. 一些拓展 一. 问题描述 最近在使用StarRocks的时候&#xff0c;发现一个问题 table_a 10W 左右数据&#xff0c;通过where条件过滤数据后 剩下 10行数据。 table_b 5亿左右数据&#xff0c;通过where过滤条件后 剩下 5kw 数据。 table…

java物流快递寄件配送信息管理系统springboot+vue

物流信息管理系统分为管理员功能模块、配送员功能模块和用户功能模块三大部分&#xff0c;下面将对这三大功能模块分别进行介绍。 管理员功能模块&#xff1a;管理员登录后可对系统进行全面管理&#xff0c;管理员登录后主要实现的功能模块包括个人中心、用户管理、配送员管理、…

Deno:下载安装示例和打包为可执行文件

Deno&#xff1a;一个 安全的 JavaScript 和 TypeScript 运行时环境 目录 文档安装DenoHello World将程序打包成可执行程序 文档 官方文档 https://deno.com/manual 安装Deno Deno的解释器是一个可执行的单文件&#xff0c;下载解压即可使用 1、下载Deno 下载地址&#xf…

NFC无源标签协议

1、NFC写图片数据命令 无源NFC接口基于ISO/IEC 14443-3 A类标准&#xff1b; 命令起始地址结束地址数据 11164 67字节,每次写入的命令和地址都是一样的&#xff1b; 第一包数据必须发送该字符串数据"picksmart&M1&H128&W296&S1&C1"&#xff…

【C++】C++ 中的 IO 流

文章目录 一、C语言的输入输出二、什么是流三、C IO 流1、C 标准 IO 流2、C 文件 IO 流 四、stringstream 介绍 一、C语言的输入输出 在C语言中我们使用最频繁的输入输出方式是 scanf () 与 printf()&#xff1a; scanf()&#xff1a;从标准输入设备 (键盘) 读取数据&#xf…

数据库优化之常用的show table status及ALTER TABLE 重建表

文章目录 ⭐️ MySQL优化-碎片优化一、show table status from db_name【 如何判断是否有碎片&#xff1f;】1、碎片查询分析2、产生碎片的原因 二、MySQL 的表空间设置和优化策略【 如何清理碎片&#xff1f;】1、innodb_file_per_table 参数设置为 ON&#xff08;基本上是默认…

从小白到大佬,入门Linux系统收发网络数据包的秘密/

Linux 服务器收到网络数据包&#xff0c;需求经过哪些处置&#xff0c;一步步将数据传给应用进程的呢&#xff1f;应用进程发送数据包时&#xff0c;Linux 又是如何操作将数据包发送进来的呢&#xff1f;今天我们就来聊聊这个话题。 在准备好接纳网络数据包之前&#xff0c;Li…

python---基础小总结

1.常量和布尔值相加 当常量和布尔值相加的时候,如果是True就视为1来和常量相加. 反之,如果是False的话就视为0和常量相加. 但是这样的操作是没有任何意义的! 2.EG:以下情况是会报错的! 3.EG:加不加分号都可以,但是最好不加

相机的格式

图片的格式大体上可以分为yuv格式和RGB格式&#xff0c;以及png,jpg格式&#xff1b; 其中yuv格式对应的摄像头的格式可以是YUYV、UYVV、YVYU、VYUY&#xff1b; rgb格式的图片对应的摄像头格式为RGB,BGR,ARGB8888格式&#xff1b; 一、RGB8888和ARGB8888像素格式如果搞混了…

网站反爬虫策略的分析与研究

随着互联网的发展&#xff0c;爬虫技术也越来越成熟&#xff0c;越来越多的网站开始采取反爬虫策略来保护自己的数据和资源。以下是网站反爬虫策略的分析与研究&#xff1a; IP封禁&#xff1a;网站可以通过封禁某些IP地址来防止爬虫的访问。这种方法比较简单&#xff0c;但是容…

使用ChatGPT设计多选题

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Spring-Retry实现及原理

前言 重试&#xff0c;其实我们其实很多时候都需要的&#xff0c;为了保证容错性&#xff0c;可用性&#xff0c;一致性等。一般用来应对外部系统的一些不可预料的返回、异常等&#xff0c;特别是网络延迟&#xff0c;中断等情况。还有在现在流行的微服务治理框架中&#xff0…