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

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测监控 Prometheus 版,每月50GB免费额度
简介: 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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
22天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
6天前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
75 35
|
5天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
11天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
74 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
8天前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
62 19
|
17天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
43 3
实战~如何组织一个多容器项目docker-compose
|
23天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
9天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
1天前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
11天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
39 4

相关产品

  • 容器服务Kubernetes版