K8S容器运行时弃用Docker转型Containerd

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: K8S容器运行时弃用Docker转型Containerd

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执行namespacecgroups,挂载root filesystem等操作,OCI参考RunCcontainerd-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,兼容CRIOCI

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官网已经支持containerdCRI-O容器运行时支持 。

Containerd

早期Containerd是在Docker Engine中,目前将containerdDocker中拆分出来,作为一个独立的开源项目,目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的containerd将具有更多的功能,覆盖整个容器运行时的所有需求,提供更强大的支持 。

Containerd是一个工业级标准的容器运行时,它强调简单性、可移植性

Containerd 架构

服务端通过 unix domain socket 暴露低层的 gRPC API 接口出去,客户端通过这些 API 管理节点上的容器,每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runc负责,实际上只要是符合OCI规范的容器都可以支持 。

为了解耦,containerd 将系统划分成了不同的组件,每个组件都由一个或多个模块协作完成(Core 部分),每一种类型的模块都以插件的形式集成到 Containerd 中,而且插件之间是相互依赖的,例如,上图中的每一个长虚线的方框都表示一种类型的插件,包括 Service PluginMetadata PluginGC PluginRuntime Plugin 等,其中 Service Plugin 又会依赖 Metadata PluginGC PluginRuntime Plugin。每一个小方框都表示一个细分的插件,例如 Metadata Plugin 依赖 Containers PluginContent 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 /

上面的文件都是二进制文件,直接移动到对应的目录并配置好环境变量就可以进行使用了。

升级libseccomplibseccomp需要高于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

配置文件这三个地方需要修改:

  1. 修改SystemdCgroup的值为true
  2. 修改endpoint的值为https://registry.cn-hangzhou.aliyuncs.com
  3. 修改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概念, 每个imagecontaine都会在各自的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命令直接的区别

crictlkubernetes cri-tools的一部分,是专门为kubernetes使用containerd而专门制作的,提供了Pod、容器和镜像等资源的管理命令。

ctr功能简单,而且对已经习惯使用docker cli的人来说,ctr并不友好(比如无法像 docker cli 那样)。这个时候nerdctl就可以替代ctr了。nerdctl是一个与docker cli风格兼容的containerdcli工具,并且已经被作为子项目加入了 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

参考资料

https://i4t.com/5435.html

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
17小时前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第20天】 在微服务架构日益普及的今天,Docker作为其重要的实现技术之一,承载着大量应用的运行。然而,随之而来的是对于容器健康状态、资源使用情况以及性能指标的监控需求急剧增加。本文旨在探讨构建一个高效且稳定的Docker容器监控体系,不仅涵盖了监控工具的选择与配置,还详细阐述了监控数据的分析与处理流程。通过精心设计的监控策略和实时响应机制,我们能够确保系统的稳定性,并及时发现及处理潜在的问题。
|
3天前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
3天前
|
Java 虚拟化 Docker
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
|
3天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置
|
3天前
|
Linux Docker 容器
更改docker容器中的时间而不影响宿主机
更改docker容器中的时间而不影响宿主机
|
3天前
|
Ubuntu Linux Go
docker容器启动报错
docker容器启动报错解决
|
4天前
|
Java 数据库连接 Spring
K8S+Docker理论与实践深度集成java面试jvm原理
K8S+Docker理论与实践深度集成java面试jvm原理
|
4天前
|
存储 Java Serverless
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
|
4天前
|
存储 Kubernetes 监控
使用Kubernetes进行容器编排:技术详解与实践
【5月更文挑战第16天】Kubernetes,简称K8s,是开源容器编排系统,用于自动化部署、扩展和管理容器化应用。核心概念包括节点、Pod(最小部署单元)、服务、标签和副本集。其特点有高可用性、可扩展性、自动化和可移植性。实践使用涉及安装配置集群、编写YAML部署清单、应用部署、监控管理和扩展更新。Kubernetes帮助提升应用的可用性、可扩展性和可移植性。
|
5天前
|
Ubuntu Docker 容器
docker容器保存和导入
docker容器保存和导入
35 0

相关产品

  • 容器服务Kubernetes版