0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Containerd常见命令操作

马哥Linux运维 来源:博客园 作者:: 大数据老司机 2022-08-30 10:08 次阅读

一、概述

作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认的 dockershim。在V1.24起的版本的 kubelet 就彻底移除了dockershim,改为默认使用Containerd了,当然也使用 cri-dockerd 适配器来将 Docker Engine 与 Kubernetes 集成。可以参考官方文档:

https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker

8d9de8e4-27a0-11ed-ba43-dac502259ad0.png

二、Containerd 常见命令操作

更换 Containerd 后,以往我们常用的 docker 命令也不再使用,取而代之的分别是 crictlctr 两个命令客户端。

  • crictl 是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像。
  • ctrcontainerd 的一个客户端工具。
  • ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。
  • 一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。

使用crictl命令之前,需要先配置/etc/crictl.yaml如下:

runtime-endpoint:unix:///run/containerd/containerd.sock
image-endpoint:unix:///run/containerd/containerd.sock
timeout:10
debug:false

也可以通过命令进行设置:

crictlconfigruntime-endpointunix:///run/containerd/containerd.sock
crictlconfigimage-endpointunix:///run/containerd/containerd.sock
命令 docker ctr(containerd) crictl(kubernetes)
查看运行的容器 docker ps ctr task ls/ctr container ls crictl ps
查看镜像 docker images ctr image ls crictl images
查看容器日志 docker logs crictl logs
查看容器数据信息 docker inspect ctr container info crictl inspect
查看容器资源 docker stats crictl stats
启动/关闭已有的容器 docker start/stop ctr task start/kill crictl start/stop
运行一个新的容器 docker run ctr run 无(最小单元为 pod)
标签 docker tag ctr image tag
创建一个新的容器 docker create ctr container create crictl create
导入镜像 docker load ctr image import
导出镜像 docker save ctr image export
删除容器 docker rm ctr container rm crictl rm
删除镜像 docker rmi ctr image rm crictl rmi
拉取镜像 docker pull ctr image pull ctictl pull
推送镜像 docker push ctr image push
登录或在容器内部执行命令 docker exec crictl exec
清空不用的容器 docker image prune crictl rmi --prune

更多命令操作,可以直接在命令行输入命令查看帮助。

docker--help
ctr--help
crictl--help

由于 Containerd 也有 namespaces 的概念,对于上层编排系统的支持,ctr 客户端 主要区分了 3 个命名空间分别是k8s.iomobydefault,以上我们用crictl操作的均在k8s.io命名空间,使用ctr 看镜像列表就需要加上-n 参数。crictl 是只有一个k8s.io命名空间,但是没有-n 参数。

【温馨提示】ctr images pull 拉取的镜像默认放在default,而 crictl pull 和 kubelet 默认拉取的镜像都在 k8s.io 命名空间下。所以通过ctr导入镜像的时候特别注意一点,最好指定命名空间。

#注意-n不能放在命令最后面,下面几行查看的镜像是一样的
ctr-n=k8s.ioimagels
ctr-nk8s.ioimagels

# crictl 没有-n参数,操作都在`k8s.io`命名空间下。
crictlimagels
crictlimages
#crictlimagelist=ctr-n=k8s.ioimagelist
#crictlimagels=ctr-n=k8s.ioimagels
#crictlimages=ctr-n=k8s.ioimagelist
#crictlimages=ctr-n=k8s.ioimagels

#使用ctr命令指定命名空间导入镜像
ctr-n=k8s.ioimageimportdashboard.tar

#查看镜像,可以看到可以查询到了
crictlimages
8dbebd3a-27a0-11ed-ba43-dac502259ad0.png

三、containerd 客户端工具 nerdctl

推荐使用 nerdctl,使用效果与 docker 命令的语法一致,github 下载链接:

https://github.com/containerd/nerdctl/releases

  • 精简 (nerdctl--linux-amd64.tar.gz): 只包含 nerdctl
  • 完整 (nerdctl-full--linux-amd64.tar.gz):包含 containerd, runc, and CNI 等依赖

nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。具体看 nerdctl。

8e0078e2-27a0-11ed-ba43-dac502259ad0.png
延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像

https://icloudnative.io/posts/startup-containers-in-lightning-speed-with-lazy-image-distribution-on-containerd/

1)安装 nerdctl(精简版)

wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
#解压
tar-xfnerdctl-0.22.2-linux-amd64.tar.gz

ln-s/opt/k8s/nerdctl/nerdctl/usr/local/bin/nerdctl

2)安装 nerdctl(完整版,这里不装)

wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz
tar-xfnerdctl-full-0.16.0-linux-amd64.tar.gz-C/usr/local/

cp/usr/local/lib/systemd/system/*.service/etc/systemd/system/

启动服务 buildkit

systemctlenablebuildkitcontainerd--now
systemctlstatusbuildkitcontainerd

3)安装 buildkit 支持构建镜像

buildkit GitHub 地址:

https://github.com/moby/buildkit

使用精简版 nerdctl 无法直接通过 containerd 构建镜像,需要与 buildkit 组全使用以实现镜像构建。当然你也可以安装上面的完整 nerdctl;buildkit 项目是 Docker 公司开源出来的一个构建工具包,支持 OCI 标准的镜像构建。它主要包含以下部分:

  • 服务端 buildkitd,当前支持 runc 和 containerd 作为 worker,默认是 runc;
  • 客户端 buildctl,负责解析 Dockerfile,并向服务端 buildkitd 发出构建请求。

buildkit 是典型的C/S 架构,client 和 server 可以不在一台服务器上。而 nerdctl 在构建镜像方面也可以作为 buildkitd 的客户端。

#https://github.com/moby/buildkit/releases
wgethttps://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz

tar-xfbuildkit-v0.10.4.linux-amd64.tar.gz-C/usr/local/

配置 buildkit 的启动文件,可以从这里下载:

https://github.com/moby/buildkit/tree/master/examples/systemd

buildkit 需要配置两个文件

  • /usr/lib/systemd/system/buildkit.socket
cat>/usr/lib/systemd/system/buildkit.socket<
  • /usr/lib/systemd/system/buildkit.service
cat>/usr/lib/systemd/system/buildkit.service<< EOF
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit
[Service]
#Replaceruncbuildswithcontainerdbuilds
ExecStart=/usr/local/bin/buildkitd--addrfd://
[Install]
WantedBy=multi-user.target
EOF

启动 buildkit

systemctldaemon-reload
systemctlenablebuildkit--now
8e1bef82-27a0-11ed-ba43-dac502259ad0.png

四、实战操作

1)修改 containerd 配置文件

可以参考我之前的文章:

containerdconfigdefault>/etc/containerd/config.toml

配置如下:

[plugins."io.containerd.grpc.v1.cri".registry]
config_path=""

[plugins."io.containerd.grpc.v1.cri".registry.auths]

[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls]
insecure_skip_verify=true#跳过认证
ca_file="/etc/containerd/myharbor-minio.com/ca.crt"
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".auth]
username="admin"
password="Harbor12345"

[plugins."io.containerd.grpc.v1.cri".registry.headers]

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor-minio.com"]
endpoint=["https://myharbor-minio.com"]

937667a0-27a0-11ed-ba43-dac502259ad0.png
重启 containerd

#重新加载配置
systemctldaemon-reload
#重启containerd
systemctlrestartcontainerd

注意:这个配置文件是给crictlkubelet使用,ctr是不可以用这个配置文件的,ctr 不使用 CRI,因此它不读取 plugins."io.containerd.grpc.v1.cri"配置。

2)ctr 拉取推送镜像

#推送镜像到harbor
ctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0--skip-verify--useradmin:Harbor12345

#--namespace=k8s.io指定命名空间,不是必须,根据环境而定
#--skip-verify跳过认证
#--user指定harbor用户名及密码

ctrimagespull--useradmin:Harbor12345--tlscacert=/etc/containerd/myharbor-minio.com/ca.crtmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0

不想-u user:password 每次必须使用 ctr pull/ctr push, 可以使用nerdctl

3)镜像构建

cat>Dockerfile<echo'HelloNerdctlFromContainerd'>/usr/share/nginx/html/index.html
EOF

然后在文件所在目录执行镜像构建命令:

#不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下
nerdctl-nk8s.iobuild-tnginx:nerctl-f./Dockerfile.
###参数解释
#-t:指定镜像名称
# . :当前目录Dockerfile
#-f:指定Dockerfile路径
#--no-cache:不缓存
93885e24-27a0-11ed-ba43-dac502259ad0.png

4)打标签 tag

# crictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。
ctr-nk8s.ioitag
nerdctl-nk8s.iotagnginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl
#ctr-nk8s.iotagnginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl
#查看镜像
nerdctl-nk8s.ioimagesmyharbor-minio.com/bigdata/nginx:nerctl

5)将镜像推送到 Harbor

第一种情况:http方式,配置如下:

#以下两个哪个都可以
#mkdir-p/etc/docker/certs.d/myharbor-minio.com:443
mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443

cat>/etc/containerd/certs.d/myharbor-minio.com:443/hosts.toml<"https://docker.io"

[host."http://myharbor-minio.com:80"]
capabilities=["pull","resolve","push"]
#skip_verify=true
#ca="ca.crt"#相对路径
#ca="/opt/auth/ca.crt"#绝对路径
#ca=["/opt/auth/ca.crt"]
#ca=["ca.crt"]
#client=[["/opt/auth/nginx.cclinux.cn.crt","/opt/auth/nginx.cclinux.cn.key"]]

EOF

第一种情况:https方式,配置如下:

#以下两个哪个都可以
#mkdir-p/etc/docker/certs.d/myharbor-minio.com:443
mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443

cat>/etc/containerd/certs.d/myharbor-minio.com:443/hosts.toml<"https://docker.io"

[host."https://myharbor-minio.com:443"]
capabilities=["pull","resolve","push"]
skip_verify=true
#ca="ca.crt"#相对路径
#ca="/opt/auth/ca.crt"#绝对路径
#ca=["/opt/auth/ca.crt"]
ca=["/etc/containerd/myharbor-minio.com/ca.crt"]
#client=[["/opt/auth/nginx.cclinux.cn.crt","/opt/auth/nginx.cclinux.cn.key"]]
EOF

通过 nerdctl 登录 harbor

echoHarbor12345|nerdctllogin--username"admin"--password-stdinmyharbor-minio.com:443

#nerdctllogin--username"admin"--passwordHarbor12345myharbor-minio.com:443

#登出
#nerdctllogout
93980298-27a0-11ed-ba43-dac502259ad0.png

开始将镜像推送到 harbor

###推送到Harbor
#--insecure-registryskipsverifyingHTTPScerts,andallowsfallingbacktoplainHTTP
nerdctl--insecure-registry--namespace=k8s.iopushmyharbor-minio.com/bigdata/nginx:nerctl
#ctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/nginx:nerctl--skip-verify--useradmin:Harbor12345

#--namespace=k8s.io指定命名空间,跟-n一样,不是必须,根据环境而定
#--skip-verify跳过认证
#--user指定harbor用户名及密码
93aefb24-27a0-11ed-ba43-dac502259ad0.png

Containerd ctr,crictl,nerdctl 客户端命令介绍与实战操作就到这里了,有疑问的小伙伴欢迎给我留言哦!

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    495

    浏览量

    22061
  • 命令
    +关注

    关注

    5

    文章

    684

    浏览量

    22021
  • Docker
    +关注

    关注

    0

    文章

    458

    浏览量

    11853

原文标题:Containerd ctr、crictl、nerdctl 客户端命令介绍与实战操作

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    常见的shell命令之文件操作相关命令

    命令命令:cp英文全拼:copy功能:实现文件的复制操作参数:cp [选项] 源文件/目录目的文件/目录示例:5、mv文件改名移动命令:mv英文全拼:move功能:可以将一个目录移到另
    发表于 08-19 10:01

    常见的shell命令之其他命令

    用户的信息用法:who示例:5、PS查询进程命令命令:ps功能:显示当前操作系统中由该用户运行的进程列表常见参数:用法:示例1:ps示例2:ps -el查看所有进程的详细信息示例3:使
    发表于 08-21 09:49

    嵌入式学习-常见的shell命令之其他命令

    用户的信息用法:who示例:5、PS查询进程命令命令:ps功能:显示当前操作系统中由该用户运行的进程列表常见参数:用法:示例1:ps示例2:ps -el查看所有进程的详细信息示例3:使
    发表于 08-22 09:42

    Linux常见命令有哪些

    摘要:这是对周立功编著的《嵌入式Linux开发教程》的第7期连载。本期刊载内容有关LinuxLinux常见命令中的导航命令、目录命令和文件命令
    发表于 10-28 10:06

    学习常见的Linux命令

    一、学习常见的Linux命令(1)文件操作命令主要包括查看文件命令(ls)、显示文件内容命令(c
    发表于 11-05 08:43

    MongoDB常用操作命令大全

    本文主要是对MongoDB常用操作命令解析。如果你想创建一个“myTest”的数据库,先运行use myTest命令,之后就做一些操作(如:db.createCollection(‘u
    的头像 发表于 02-07 10:15 1961次阅读

    重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准

    重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准11 月 29 日,CNCF containerd 社区正式宣布:两位阿里巴巴工程师正式获得 containerd
    发表于 12-11 17:25 337次阅读

    Git常见的误区和命令行工具等综述

    Git常见的误区和命令行工具等综述
    发表于 08-31 09:51 0次下载

    嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的《嵌入式Linux开发教程》的第7期连载。本期刊载内容有关LinuxLinux常见命令中的导航命令、目录命令和文件命令
    发表于 10-21 13:36 11次下载
    嵌入式Linux开发教程:Linux<b class='flag-5'>常见</b><b class='flag-5'>命令</b>(上篇)

    基础的Linux操作命令

    IC设计是在linux环境下,很多操作需要在Terminal中进行,因此想要学习IC设计,就必须先需要熟悉Linux环境、掌握基础的Linux操作命令;网上也有很多系统的教程,可以系统去学一学,当然
    的头像 发表于 03-15 13:42 1535次阅读

    Containerd控制runC的守护进程

    ./oschina_soft/containerd.zip
    发表于 05-11 10:05 0次下载
    <b class='flag-5'>Containerd</b>控制runC的守护进程

    Containerd的Bug导致容器被重建!如何避免?

    该 issue 在 2022 年 12 月 20 日被提交,RKE2 团队在 2023 年 1 月 6 日紧急合并了 containerd 中修复该 issue 的 commit,发布了 k3s-containerd v1.6.14+k3s1 版本,并发布了新的 rke2
    的头像 发表于 02-10 13:55 1576次阅读

    Containerd基础用法

    从 Docker 1.11 版本开始,Docker 容器运行就不是简单通过 Docker Daemon 来启动了,而是通过集成containerd、runc等多个组件来完成的。 虽然Docker
    的头像 发表于 04-11 10:50 785次阅读

    solidworks基本操作命令的技巧

    在零件设计的过程中,可以随意插入其他特征的零件与之进行操作和修改,有别于装配体中的装配命令,还有当一个实体又很多圆角过渡造型比较复杂的时候,可以用分割的命令将其分成两个部分,然后分别对他们进行造型上的设计,例如,抽壳。
    的头像 发表于 07-26 15:47 1444次阅读

    结构操作系统命令参考

    电子发烧友网站提供《结构操作系统命令参考.pdf》资料免费下载
    发表于 08-28 10:30 0次下载
    结构<b class='flag-5'>操作</b>系统<b class='flag-5'>命令</b>参考