Kubernetes社区在2020年7月份发布的版本中已经开始了dockershim的移除计划,在1.20版本中将内置的dockershim进行分离,这个版本依旧还可以使用dockershim,但是在1.24中被删除。从1.24开始,大家需要使用其他受到支持的运行时选项(例如containerd或CRI-O);如果选择Docker Engine作为运行时,则需要使用cri-dockerd
容器进行时调用过程
当Docker要创建一个容器时,需要进行下面的步骤:
Kubelet
通过CRI
接口(gRPC
)调用dockershim
,请求创建一个容器。(CRI即容器运行时接口)dockershim
收到请求后,转换成Docker Daemon
能听懂的请求,发到Docker Daemon
上请求创建容器。Docker Daemon
早在1.12版本中就已经针对容器的操作转移到另外一个进程containerd
,因此Docker Daemon
不会帮我们创建容器,而是要求containerd
创建一个容器Containerd
收到请求后,并不会直接去操作容器,而是创建一个叫做containerd-shim
的进程,让containerd-shim
去操作容器。这是因为容器进程需要一个父进程来做收集状态,而加入这个父进程就是containerd
,那每次containerd
挂掉或者升级,整个宿主机上的容器都会退出。而引用containerd-shim
就避免了这个问题 (containerd和shim并不是父子进程的关系)OCI
(Open Container Initiative
,开放容器标准)。OCI
执行namespace
和cgroups
,挂载root filesystem
等操作,OCI
参考RunC
,containerd-shim
在这一步调用RunC命令行来启动容器。实际上RunC就是一个二进制命令- runC启动完成后本身会直接退出,
containerd-shim
则会为容器进程的父进程,负责收集容器进程的状态,上报给containerd
,并在容器中pid为1的进程退出后接管容器中的子进程进行清理,确保不会出现僵尸进程。
OCI (Open Container Initiative,开放容器标准) runC实际上就是参考OCI实现,OCI实际上就是一个标准文档,主要规定了容器镜像的结构、以及容器需要接收那些操作指令,比如create、start、stop、delete等
Containerd 发展史
在Containerd 1.0
中,对CRI的适配通过了一个单独的进程CRI-containerd
来完成
containerd 1.1
中,砍掉了CRI-containerd
这个进程,直接把适配逻辑作为插件放进了containerd
主进程中
containerd 1.1
中做的事情,实际上Kubernetes
社区做了一个更漂亮的cri-o
,兼容CRI
和OCI
Containerd与Docker区别?
实际上containerd只是一个精简版docker,为了更好的支持Kubernetes而已
哪些容器运行时引擎支持CRI?
容器运行时 |
Kubernetes 平台中的支持 |
优点 |
缺点 |
Containerd |
谷歌 Kubernetes 引擎、IBM Kubernetes 服务、阿里巴巴 |
经过大规模测试,用于所有 Docker 容器。比 Docker 使用更少的内存和 CPU。支持 Linux 和 Windows |
没有 Docker API 套接字。缺少 Docker 方便的 CLI 工具。 |
CRI-O |
红帽 OpenShift,SUSE 容器即服务 |
轻量级,Kubernetes 所需的所有功能,仅此而已。类似 UNIX 的关注点分离(客户端、注册表、构建) |
主要在RedHat平台内使用不易安装在非RedHat操作系统上仅在Windows Server2019及更高版本中支持 |
Kata Containers |
开放堆栈 |
提供基于 QEMUI 的完全虚拟化改进的安全性与 Docker、CRI-O、containerd 和 Firecracker 集成支持 ARM、x86_64、AMD64 |
更高的资源利用率不适合轻量级容器用例 |
AWS Firecracker |
所有 AWS 服务 |
可通过直接 API 或使用 seccomp jailer 的 containerdTight 内核访问来访问 |
新项目,不如其他运行时成熟需要更多手动步骤,开发人员体验仍在不断变化 |
通过下图,我们可以看到这3个的区别,目前Kubernetes
官网已经支持containerd
、CRI-O
容器运行时支持 。
Containerd
早期Containerd
是在Docker Engine
中,目前将containerd
从Docker
中拆分出来,作为一个独立的开源项目,目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的containerd
将具有更多的功能,覆盖整个容器运行时的所有需求,提供更强大的支持 。
Containerd是一个工业级标准的容器运行时,它强调简单性、可移植性
Containerd 架构
服务端通过 unix domain socket
暴露低层的 gRPC API
接口出去,客户端通过这些 API 管理节点上的容器,每个containerd
只负责一台机器,Pull
镜像,对容器的操作(启动、停止等),网络,存储都是由containerd
完成。具体运行容器由runc
负责,实际上只要是符合OCI
规范的容器都可以支持 。
为了解耦,containerd
将系统划分成了不同的组件,每个组件都由一个或多个模块协作完成(Core
部分),每一种类型的模块都以插件的形式集成到 Containerd
中,而且插件之间是相互依赖的,例如,上图中的每一个长虚线的方框都表示一种类型的插件,包括 Service Plugin
、Metadata Plugin
、GC Plugin
、Runtime Plugin
等,其中 Service Plugin
又会依赖 Metadata Plugin
、GC Plugin
和 Runtime Plugin
。每一个小方框都表示一个细分的插件,例如 Metadata Plugin
依赖 Containers Plugin
、Content Plugin
等
Content Plugin: 提供对镜像中可寻址内容的访问,所有不可变的内容都被存储在这里。
Snapshot Plugin: 用来管理容器镜像的文件系统快照,镜像中的每一层都会被解压成文件系统快照,类似于 Docker 中的 graphdriver
对于K8s来说,实际需要Containerd即可,中间的垫片(shim)是完全可以省略,减少调用链
Containerd已经将shim集成到kubelet中,减少了shim,但是如果我们使用containerd,那么将无法使用docker ps或者docker exec命令来获取容器。可以使用docker pull和docker build命令来构建镜像
Containerd 安装
Kubernetes社区在2020年7月份发布的版本中已经开始了dockershim的移除计划,在1.20版本中将内置的dockershim进行分离,这个版本依旧还可以使用dockershim,但是在1.24中被删除。从1.24开始,大家需要使用其他受到支持的运行时选项(例如containerd或CRI-O);如果您选择Docker Engine作为运行时,则需要使用cri-dockerd
本次环境信息
[root@node2 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@node2 ~]# uname -sr Linux 5.18.14-1.el7.elrepo.x86_64 [root@node2 ~]#
下载软件包
github地址:https://containerd.io/downloads/
containerd-1.6.1-linux-amd64.tar.gz 只包含containerd
cri-containerd-cni-1.6.6-linux-amd64.tar.gz 包含containerd以及cri runc等相关工具包,建议下载本包
下载完解压
[root@node2 home]# tar -zxvf cri-containerd-cni-1.6.6-linux-amd64.tar.gz -C /
上面的文件都是二进制文件,直接移动到对应的目录并配置好环境变量就可以进行使用了。
升级libseccomp
,libseccomp
需要高于2.4版本。
[root@node2 home]# rpm -qa | grep libseccomp libseccomp-2.3.1-4.el7.x86_64 [root@node2 home]# rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps [root@node2 home]# wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm [root@node2 home]# rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm 警告:libseccomp-2.5.1-1.el8.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID 8483c65d: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:libseccomp-2.5.1-1.el8 ################################# [100%] [root@node2 home]# rpm -qa | grep libseccomp libseccomp-2.5.1-1.el8.x86_64 [root@node2 home]#
接下来我们为Containerd
设置一个配置文件
[root@node2 home]# mkdir /etc/containerd [root@node2 home]# containerd config default > /etc/containerd/config.toml
- --config,-c可以在启动守护程序时更改此路径
- 配置文件的默认路径位于/etc/containerd/config.toml
默认cri-containerd-cni包中会有containerd启动脚本,我们已经解压到对应的目录,可以直接调用启动
[root@node2 home]# systemctl enable containerd --now Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /etc/systemd/system/containerd.service. [root@node2 home]systemctl status containerd
containerd配置
每个顶级配置块的命名都是plugin."io.containerd.xxx.vxx.xxx"
这种形式,其实每个顶级配置块都代表一个插件,其中io.containerd.xxx.vxx
表示插件类型,vxx
后面的xxx
表示 插件ID。并且可以通过命令ctr
查看到
[root@node2 home]# ctr plugin ls TYPE ID PLATFORMS STATUS io.containerd.content.v1 content - ok io.containerd.snapshotter.v1 aufs linux/amd64 skip io.containerd.snapshotter.v1 btrfs linux/amd64 skip io.containerd.snapshotter.v1 devmapper linux/amd64 error
配置文件这三个地方需要修改:
- 修改SystemdCgroup的值为true
- 修改endpoint的值为https://registry.cn-hangzhou.aliyuncs.com
- 修改sandbox_image的值为registry.aliyuncs.com/google_containers/pause:3.7
Containerd
属于cs
架构需要安装ctr
,通过crt
进行管理控制;ctr
实际上就是containerd
的客户端工具
ctr -->Containerd-->RunC
ctr在我们解压包中已经附带了,直接可以使用
[root@node2 home]# ctr version Client: Version: v1.6.6 Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1 Go version: go1.17.11 Server: Version: v1.6.6 Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1 UUID: 15c09e6d-3bdc-42e2-ba98-a9c0e4685c0e [root@node2 home]# containerd --version containerd github.com/containerd/containerd v1.6.6 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
常用操作
拉取镜像
在containerd中拉取docker的相关镜像也需要补全
ctr i pull docker.io/library/nginx:alpine --all-platforms
拉取镜像添加了--all-platforms会将所有平台都下载下来
并且containerd
相比于docker
, 多了namespace
概念, 每个image
和containe
都会在各自的namespace
下可见, 目前k8s会使用k8s.io
作为命名空间,默认containerd
会使用default
.
[root@node2 home]# ctr ns ls NAME LABELS [root@node2 home]# ctr ns NAME: ctr namespaces - manage namespaces USAGE: ctr namespaces command [command options] [arguments...] COMMANDS: create, c create a new namespace list, ls list namespaces remove, rm remove one or more namespaces label set and clear labels for a namespace OPTIONS: --help, -h show help
如果我们不指定namespace,默认就会使用default
创建 删除namespace
[root@node2 home]# ctr ns create didiplus [root@node2 home]# ctr ns ls NAME LABELS didiplus [root@node2 home]# ctr ns remove didiplus didiplus
接下来我们所有的containerd
中的操作,都可以添加-n ns_namespace
指定到专属的命名空间中 .
[root@node2 containerd]# ctr -n didiplus i pull docker.io/library/nginx:alpine docker.io/library/nginx:alpine: resolved |++++++++++++++++++++++++++++++++++++++| index-sha256:9c2030e1ff2c3fef7440a7fb69475553e548b9685683bdbf669ac0829b889d5f: done |++++++++++++++++++++++++++++++++++++++| manifest-sha256:96a447b9474aff02d4e3b642f5fdb10ff7ff25d409e8132e536c71f494f59617: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:a46fd6a16a7c6563c064f8ad9197db0bcf1191095cc3af29e75fb5e9b007f168: done |++++++++++++++++++++++++++++++++++++++| config-sha256:e46bcc69753105cfd75905056666b92cee0d3e96ebf134b19f1b38de53cda93e: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379cbf2b6501b49c4cab2ccc: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:323a7915bc0486f17181676df748e5c3571103eb8ac38137aa60ea87e9d70b19: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:b5b558620e4027e2a918abda48eb0d3ecae77b6ced0f5244a55d78a02bcea87b: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:b37be0d2bf3c46c2d42cf536fcf0eb53cc8a5b7f8f0ee74abaf3e57610ae3f97: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:ba036c7f95ecc063c84fbe789765b97feefdbc331a31abf90153da5e16fe7264: done |++++++++++++++++++++++++++++++++++++++| elapsed: 19.9s total: 9.7 Mi (500.5 KiB/s) unpacking linux/amd64 sha256:9c2030e1ff2c3fef7440a7fb69475553e548b9685683bdbf669ac0829b889d5f... done: 1.08778507s [root@node2 containerd]# ctr -n didiplus i ls -q docker.io/library/nginx:alpine
查看镜像
[root@node2 containerd]# ctr -n didiplus i ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:9c2030e1ff2c3fef7440a7fb69475553e548b9685683bdbf669ac0829b889d5f 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x - [root@node2 containerd]#
tag重新打标签
[root@node2 containerd]# ctr -n didiplus i tag docker.io/library/nginx:alpine docker.io/library/nginx:v1 docker.io/library/nginx:v1 [root@node2 containerd]# ctr -n didiplus i ls -q docker.io/library/nginx:alpine docker.io/library/nginx:v1 [root@node2 containerd]#
删除镜像
[root@node2 containerd]# ctr -n didiplus i rm docker.io/library/nginx:v1 docker.io/library/nginx:v1 [root@node2 containerd]# ctr -n didiplus i ls -q docker.io/library/nginx:alpine [root@node2 containerd]#
mount 镜像
mount镜像实际上就是可以将我们镜像中的文件,挂载到宿主机的目录中去
[root@node2 home]# mkdir ctr_demo_nginx [root@node2 home]# ctr -n didiplus i ls -q docker.io/library/nginx:alpine [root@node2 home]# ctr -n didiplus i mount docker.io/library/nginx:alpine /home/ctr_demo_nginx sha256:0d78461785798d76ccb9432d71c47dda9b95eec6f6263062647c181774373842 /home/ctr_demo_nginx [root@node2 home]# cd ctr_demo_nginx/ [root@node2 ctr_demo_nginx]# ls bin dev docker-entrypoint.d docker-entrypoint.sh etc home lib media mnt opt proc root run sbin srv sys tmp usr var [root@node2 ctr_demo_nginx]#
mount参数系统为只读状态,只可以读取,不可以写入数据
使用--rw Enable write support on the mount可以开启只读
取消mount挂载
[root@node2 home]# ctr -n didiplus i unmount /home/ctr_demo_nginx /home/ctr_demo_nginx [root@node2 home]# cd ctr_demo_nginx/ [root@node2 ctr_demo_nginx]# ls [root@node2 ctr_demo_nginx]#
导出导入镜像
[root@node2 ctr_demo_nginx]# ctr -n didiplus i export --all-platforms nginx.tar docker.io/library/nginx:alpine ctr: content digest sha256:5a4ddaace7d557dc70582fc1de07cf8ab90bdc847082286322790bac3ecd18f2: not found [root@node2 ctr_demo_nginx]# ls nginx.tar
ctr不支持 build,commit 镜像
创建容器
这里我创建一个nginx容器
[root@node2 ctr_demo_nginx]# ctr -n didiplus c create --net-host docker.io/library/nginx:alpine nginx [root@node2 ctr_demo_nginx]# ctr -n didiplus c ls CONTAINER IMAGE RUNTIME nginx docker.io/library/nginx:alpine io.containerd.runc.v2 [root@node2 ctr_demo_nginx]#
- -n 指定命名空间
- c create 创建容器
- --net-host 使用宿主机网络
- docker.io/xx/xxx:xxx 镜像地址
- nginx 容器名称
可以通过info参数查看容器的相关信息
[root@node2 ctr_demo_nginx]# ctr -n didiplus c info nginx | less
Task任务
在containerd
中有一个task任务的概念,刚刚我们使用containerd
create
创建的容器,这时候并没有running
;在Docker
中可以直接run容器,但是在containerd
是需要先create
在通过task
启动容器。create
容器并不会启动容器,可以理解只是声明了一个container
,并不会启动和执行相关操作 。
在task我们也可以管理容器的网络,以及容器的监控等。实际上就是增强版的docker ps
#可以通过下面的命令进行查看正在运行的容器 [root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS
可以通过使用ctr -n didiplus task help。task可以操作的相关命令
使用task启动容器
[root@node2 ctr_demo_nginx]# ctr -n didiplus task start -d nginx [root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS nginx 2021 RUNNING [root@node2 ctr_demo_nginx]#
现在我们通过ps -ef
就可以看到进程了
[root@node2 ctr_demo_nginx]# ps -ef | grep nginx root 2000 1 0 10:59 ? 00:00:00 /usr/local/bin/containerd-shim-runc-v2 -namespace didiplus -id nginx -address /run/containerd/containerd.sock root 2021 2000 0 10:59 ? 00:00:00 nginx: master process nginx -g daemon off; 101 2058 2021 0 10:59 ? 00:00:00 nginx: worker process
进入容器
[root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS nginx 2021 RUNNING [root@node2 ctr_demo_nginx]# ctr -n didiplus task exec --help NAME: ctr tasks exec - execute additional processes in an existing container USAGE: ctr tasks exec [command options] [flags] CONTAINER CMD [ARG...] OPTIONS: --cwd value working directory of the new process --tty, -t allocate a TTY for the container --detach, -d detach from the task after it has started execution --exec-id value exec specific id for the process --fifo-dir value directory used for storing IO FIFOs --log-uri value log uri for custom shim logging --user value user id or name [root@node2 ctr_demo_nginx]# ctr -n didiplus task exec --exec-id 1 -t nginx sh / #
exec task进入容器操作
--exec-id 设置一个id,唯一即可
-t --tty为container分配一个tty
nginx 容器名称
sh && bash即可
暂停容器
[root@node2 ctr_demo_nginx]# ctr -n didiplus task pause nginx [root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS nginx 2021 PAUSED
有暂停容器当然也有恢复容器
需要注意暂停和恢复容器不等于重启容器
[root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS nginx 2021 RUNNING
如果我们需要停止容器,只能通过kill来进行停止,然后在重新start;在containerd中没有stop和restart参数
[root@node2 ctr_demo_nginx]# ctr -n didiplus task kill nginx [root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS nginx 2021 STOPPED [root@node2 ctr_demo_nginx]# ctr -n didiplus task rm nginx [root@node2 ctr_demo_nginx]# ctr -n didiplus task ls TASK PID STATUS #删除task并不会删除container [root@node2 ctr_demo_nginx]# ctr -n didiplus c ls CONTAINER IMAGE RUNTIME nginx docker.io/library/nginx:alpine io.containerd.runc.v2 [root@node2 ctr_demo_nginx]#
删除容器
[root@node2 ctr_demo_nginx]# ctr -n didiplus c rm nginx [root@node2 ctr_demo_nginx]# ctr -n didiplus c ls CONTAINER IMAGE RUNTIME
task还可以通过metrcis命令,获取到容器内部资源使用情况
Containerd 对接私有镜像仓库 Harbor
首先我们需要将私有镜像仓库配置到 containerd
中去,修改 containerd
的配置文件 /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.k8s.local".tls] insecure_skip_verify = true [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.k8s.local".auth] username = "admin" password = "Harbor12345"
在 plugins."io.containerd.grpc.v1.cri".registry.configs
下面添加对应 harbor.k8s.local 的配置信息,insecure_skip_verify = true 表示跳过安全校验,然后通过 plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.k8s.local".auth 配置 Harbor 镜像仓库的用户名和密码。
Docker ctr nerdctl命令直接的区别
crictl
是kubernetes cri-tools
的一部分,是专门为kubernetes
使用containerd
而专门制作的,提供了Pod
、容器和镜像等资源的管理命令。
ctr
功能简单,而且对已经习惯使用docker cli
的人来说,ctr
并不友好(比如无法像 docker cli
那样)。这个时候nerdctl
就可以替代ctr
了。nerdctl
是一个与docker cli
风格兼容的containerd
的cli
工具,并且已经被作为子项目加入了 containerd
项目中。从nerdctl 0.8
开始,nerdctl
直接兼容了docker compose
的语法(不包含 swarm), 这很大程度上提高了直接将 containerd
作为本地开发、测试和单机容器部署使用的体验。
需要注意的是:安装 nerdctl
之后,要想可以使用 nerdctl
还需要安装 CNI
相关工具和插件。containerd
不包含网络功能的实现,想要实现端口映射这样的容器网络能力,需要额外安装 CNI
相关工具和插件。
另外 nerdctl 也可以使用 -n 指定使用的 namespace。
docker |
crictl |
ctr |
nerdctl |
|
查看容器列表 |
docker ps |
crictl ps |
ctr c ls(查看非 kubernetes 中的容器)ctr -n k8s.io c ls(查看 kubernetes 集群中的容器) |
nerdctl ps(查看非 kubernetes 中的容器)nerdctl -n k8s.io ps(查看 kubernetes 集群中的容器) |
查看容器详情 |
docker inspect |
crictl inspect |
ctr c info |
nerdctl inspect |
查看容器日志 |
docker logs |
crictl logs |
无 |
nerdctl logs |
容器内执行命令 |
docker exec |
crictl exec |
ctr t exec |
nerdctl exec |
挂载容器 |
docker attach |
crictl attach |
ctr t attach |
无 |
显示容器资源使用情况 |
docker stats |
crictl stats |
ctr task metrics |
无 |
创建容器 |
docker create |
crictl create |
ctr c create |
无 |
启动容器 |
docker start |
crictl start |
ctr t start |
nerdctl start |
运行容器 |
docker run |
crictl run |
ctr run |
nerdctl run |
停止容器 |
docker stop |
crictl stop |
ctr t kill |
nerdctl stop |
删除容器 |
docker rm |
crictl rm |
ctr c rm |
nerdctl rm |
查看镜像列表 |
docker images |
crictl images |
ctr i ls |
nerdctl images |
查看镜像详情 |
docker inspect |
crictl inspecti |
无 |
nerdctl inspect |
拉取镜像 |
docker pull |
crictl pull |
ctr i pull |
nerdctl pull |
推送镜像 |
docker push |
无 |
ctr i push |
nerdctl push |
删除镜像 |
docker rmi |
crictl rmi |
ctr i rm |
nerdctl rmi |
查看Pod列表 |
无 |
crictl pods |
无 |
无 |
查看Pod详情 |
无 |
crictl inspectp |
无 |
无 |
启动Pod |
无 |
crictl runp |
无 |
无 |
停止Pod |
无 |
crictl stopp |
无 |
无 |
containerd构建镜像
containerd默认不支持build操作,需要安装插件配置使用
下载buildkit插件
wget https://github.com/moby/buildkit/releases/download/v0.10.3/buildkit-v0.10.3.linux-arm64.tar.gz
解压文件
tar -zxvf buildkit-v0.10.3.linux-amd64.tar.gz -C /usr/local/
创建配置systemd管理文件
#vim /etc/systemd/system/buildkit.service [Unit] Description=BuildKit Documentation=https://github.com/moby/buildkit [Service] ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true [Install] WantedBy=multi-user.target
安装nerdctl
下载安装包
https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
解压到指定目录下
tar xf nerdctl-0.22.2-linux-amd64.tar.gz -C /usr/local/bin/
配置环境变量
#vi /etc/profile #在最后添加下面语句 alias docker='nerdctl --namespace k8s.io' alias docker-compose='nerdctl compose' source <(nerdctl completion bash)
启动
systemctl enable buildkit --now
参考资料