[转帖]containerd命令操作

containerd,命令,操作 · 浏览次数 : 0

小编点评

生成内容时需要带简单的排版,例如以下: 1. 使用 `\n` 等符号换行 2. 使用 `\t` 等符号换换 3. 使用 `\` 等符号换行 4. 使用 `\` 等符号换行 例如以下: ``` FROM alpine:3.13.5 # Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV LANG=C.UTF-8RUN echo \"**** install packages ****\" & ``` 可以换为: ``` FROM alpine:3.13.5 # Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV LANG=C.UTF-8 echo "**** install packages ****" & ``` 这样可以更方便地进行排版。

正文

一、版本信息

内核版本:5.19.12-1.el7.elrepo.x86_64

系统版本:CentOS Linux release 7.9.2009

二、下载文件: 

  1. wget https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64
  2. wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz
  3. wget https://github.com/containerd/containerd/releases/download/v1.6.8/containerd-1.6.8-linux-amd64.tar.gz

上面下载的文件说明

runc.amd64:cri-containerd-cni-1.6.8-linux-amd64.tar.gz 包中包含的 runc 在 CentOS 7 下的动态链接有问题,这里需要从 runc 的 github 上单独下载 runc,并替换安装 containerd 后中的 runc

containerd-1.6.8-linux-amd64.tar.gz:包含containerd和它的containerd-shim以及命令行工具ctr

crictl-v1.25.0-linux-amd64.tar.gz:包含CRI的命令行工具crictl

三、添加相关的模块

1、运行docker时,出现以下信息,我们需要修改存储驱动的默认文件系统

问题原因:

centos系统docker默认使用存储驱动是devicemapper,而这种存储驱动有两种模式loop-lvm和direct-lvm,不巧默认又使用了比较低效的loop-lvm

解决方案一:使用direct-lvm,配置方式网上很多 ,百度一下就行了

解决方案二:使用overlay文件系统,因为这个方案比较简单,

配置步骤如下:

  1. # 添加自开启自动加载模块
  2. cat << EOF > /etc/modules-load.d/containerd.conf
  3. overlay
  4. br_netfilter
  5. EOF
  6. # 如果 containerd 已经运行着,需要删除永久存储的数据
  7. # rm -rf /var/lib/containerd/

另外提示:docker需要修改这个配置

  1. # 如果 docker 已经运行着,需要删除永久存储的数据
  2. # rm -rf /var/lib/docker
  3. vim /usr/lib/systemd/system/docker.service
  4. # ExecStart=/usr/bin/dockerd
  5. ExecStart=/usr/bin/dockerd --storage-driver=overlay -g /opt/docker

2、br_netfilter 模块用于将桥接流量转发至 iptables 链,br_netfilter 内核参数需要开启转发,如果不部署k8s的话,可以不用加载这个模块 

3、手动加载模块 

  1. modprobe overlay
  2. modprobe br_netfilter
  3. # 检查模块情况
  4. lsmod | grep -E 'overlay|br_netfilter'

 

四、部署containerd

  1. mkdir /data/software/containerd
  2. mkdir /etc/containerd
  3. tar zxf containerd-1.6.8-linux-amd64.tar.gz -C /data/software/containerd/
  4. tar zxf crictl-v1.25.0-linux-amd64.tar.gz -C /data/software/containerd/bin/
  5. mv runc.amd64 /data/software/containerd/bin/runc
  6. chmod +x /data/software/containerd/bin/runc
  7. cat > /etc/profile.d/containerd_home.sh <<'EOF'
  8. export CONTAINERD_HOME=/data/software/containerd
  9. export PATH=$PATH:$CONTAINERD_HOME/bin
  10. EOF
  11. source /etc/profile

建立运行时 runc 软链接,不然会报错,说找到这个环境的命令,(个人猜测: 应该是运行时的用户环境不一样,导致在这个用户的环境下找不到该命令: runc) 

ln -s /data/software/containerd/bin/runc /usr/local/bin/

 

 五、生成containerd的默认配置文件/etc/containerd/config.toml

containerd config default > /etc/containerd/config.toml

修改数据永久存储位置、修改拉取镜像默认地址(改为国内源)、改为 systemd 作为管理containerd容器服务

  1. mkdir /data/software/containerd/data
  2. vim /etc/containerd/config.toml
  3. # 大概在第6行
  4. root = "/data/software/containerd/data"
  5. # 大概在第61行
  6. sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

 

  

 

 六、配置/etc/crictl.yaml

不然会报错

  1. cat > /etc/crictl.yaml <<'EOF'
  2. runtime-endpoint: "unix:///run/containerd/containerd.sock"
  3. image-endpoint: "unix:///run/containerd/containerd.sock"
  4. timeout: 0
  5. debug: false
  6. pull-image-on-create: false
  7. disable-pull-on-run: false
  8. EOF
  9. # 或者执行下面的两条命令来生成配置文件
  10. crictl config runtime-endpoint unix:///run/containerd/containerd.sock
  11. crictl config image-endpoint unix:///run/containerd/containerd.sock

七、配置管理 containerd 的 system 配置文件

  1. cat > /usr/lib/systemd/system/containerd.service <<'EOF'
  2. [Unit]
  3. Description=containerd container runtime
  4. Documentation=https://containerd.io
  5. After=network.target local-fs.target
  6. [Service]
  7. ExecStartPre=-/sbin/modprobe overlay
  8. ExecStart=/data/software/containerd/bin/containerd
  9. Type=notify
  10. Delegate=yes
  11. KillMode=process
  12. Restart=always
  13. RestartSec=5
  14. # Having non-zero Limit*s causes performance problems due to accounting overhead
  15. # in the kernel. We recommend using cgroups to do container-local accounting.
  16. LimitNPROC=infinity
  17. LimitCORE=infinity
  18. LimitNOFILE=1048576
  19. # Comment TasksMax if your systemd version does not supports it.
  20. # Only systemd 226 and above support this version.
  21. TasksMax=infinity
  22. OOMScoreAdjust=-999
  23. [Install]
  24. WantedBy=multi-user.target
  25. EOF

 八、启动 containerd 并设置开机自启

systemctl enable containerd --now

 九、测试

  1. systemctl status containerd.service
  2. crictl images

 十、命令差别信息

1、crictl缺少对具体镜像的管理能力,crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互,crictl命令运行的默认 命名空间 是在:k8s.io

2、ctr是containerd自带的CLI命令行工具,ctr命令运行的默认 命名空间 是在:default

3、这里我先验证一下

1)ctr查看命名空间

ctr ns ls

 一、1)不指定 命名空间 拉取镜像。ctr比较严格,需要完整的URL路径:docker.io/library/[镜像名称]:[tag]

ctr image pull docker.io/library/redis:latest

 一、2)命令 crictl 查看镜像情况(查不到上面拉取的镜像)

crictl image ls

 一、3)命令 ctr 查看镜像情况(可以查到上面拉取的镜像)

ctr image ls

 二、1)指定 命名空间 拉取镜像

ctr -n k8s.io image pull docker.io/library/redis:latest

二、2)命令 crictl 查看镜像情况(可以查到 ctr 指定 命名空间 下拉取的镜像)

crictl image ls

 二、3)命令 ctr 查看镜像情况,要指定 命令空间名称 才能查看的到

ctr -n k8s.io image ls

十一、部分命令使用总结

命令docker
查看命名空间
指定命令运行命令
查看镜像docker images
拉取镜像docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
修改镜像标签docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5 172.17.0.10:5000/pause:3.5
推送镜像docker login 172.17.0.42:5000
docker push 172.17.0.10:5000/pause:3.5
导出镜像docker save 172.17.0.10:5000/pause:3.5 -o pause.tar
删除镜像docker rmi 172.17.0.10:5000/pause:3.5
导入镜像docker load -i pause.tar
创建一个新的容器,但不运行docker create
运行一个新的容器docker run
查看运行的容器docker ps
查看容器日志docker logs
查看容器数据信息docker inspect
查看容器资源docker stats
启动/关闭已有的容器docker start/stop
删除容器docker rm
在容器内部执行命令docker exec

命令ctr(containerd)
查看命名空间ctr ns ls
指定命令运行命令ctr -n 命名空间名称(如: k8s.io) 命令(如:image ls)
查看镜像ctr image ls
拉取镜像ctr -n k8s.io image pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
(这里有个问题,如果pull私有仓库,你的私有仓库必须有配置https)
修改镜像标签ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5 172.17.0.10:5000/pause:3.5
推送镜像ctr -n k8s.io image push 172.17.0.10:5000/pause:3.5 --user admin:Harbor12345
(这里有个问题,你的私有仓库必须有配置https)
导出镜像ctr -n k8s.io image export pause.tar 172.17.0.10:5000/pause:3.5
删除镜像ctr -n k8s.io image rm 172.17.0.10:5000/pause:3.5
导入镜像ctr -n k8s.io image import pause.tar
创建一个新的容器,但不运行ctr -n k8s.io task/container create docker.io/library/centos:latest centos(运行容器的名称)
运行一个新的容器ctr -n k8s.io image pull docker.io/library/redis:alpine3.13
ctr -n k8s.io run -d docker.io/library/redis:alpine3.13 redis(运行容器的名称)
查看运行的容器ctr -n k8s.io task/container ls
查看容器日志
查看容器数据信息ctr -n k8s.io task/container info redis(运行容器的名称)
查看容器资源
启动/关闭已有的容器ctr task/container start/kill
删除容器ctr task/container rm
在容器内部执行命令

命令crictl(kubernetes)
查看命名空间
指定命令运行命令
查看镜像crictl images
拉取镜像crictl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5
修改镜像标签
推送镜像
导出镜像
删除镜像crictl rmi 172.17.0.10:5000/pause:3.5(它会把源:registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5一起删了)
导入镜像
创建一个新的容器,但不运行crictl create
运行一个新的容器无(最小单元为pod)
查看运行的容器crictl ps
查看容器日志crictl logs
查看容器数据信息crictl inspect
查看容器资源crictl stats
启动/关闭已有的容器crictl start/stop
删除容器crictl rm
在容器内部执行命令crictl exec

十二、ctr(containerd)命令总结

下载镜像

ctr image pull docker.io/library/redis:alpine3.13

 查看镜像:ctr images ls 可以简写成: ctr i ls

ctr images ls

 运行容器

ctr run -d docker.io/library/redis:alpine3.13 redis

查看容器运行信息

ctr container ls

 

 查看容器运行状态(其实是查看任务,这个跟 ctr container ls 是分开的)

ctr task ls

进入容器(--exec-id redis-sh意思是: 进入容器时的一个名称,是唯一不能重复使用的,如果发送断开再用这个名称就报错了,只能用另外一个名称) 

ctr container exec -t --exec-id redis-sh redis sh

 暂停容器

  1. ctr task pause redis
  2. ctr task ls

 

恢复容器为启动状态

  1. ctr tasks resume redis
  2. ctr task ls

 停止容器

  1. ctr task kill redis
  2. ctr task ls

 

 停止的容器是不能恢复启动状态的

  1. ctr task resume redis
  2. ctr task ls

删除容器

  1. ctr task delete redis
  2. ctr task ls
  3. ctr container ls
  4. ctr container rm redis
  5. ctr container ls

 

只有停止的容器才能删除(所以要先删任务,再来操作删除容器)

十三、代替docker命令的工具(nerdctl)

nerdctl工具包有精简版和全包版,这里只要精简版就可以了

1、通过代理下载 nerdctl 工具

wget https://ghproxy.com/https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-0.23.0-linux-amd64.tar.gz

2、安装 nerdctl 工具

  1. tar zxf nerdctl-0.23.0-linux-amd64.tar.gz
  2. mv nerdctl /usr/local/bin/
  3. rm -f containerd-rootless-setuptool.sh containerd-rootless.sh

3、配置docker命令通用

  1. ln -s /usr/local/bin/nerdctl /usr/local/bin/docker
  2. # 配置tab补全,弄了docke的软链接可以用,但不能用tab去补全相关的参数
  3. echo 'source <(nerdctl completion bash)' >> /root/.bashrc
  4. source /root/.bashrc

4、配置默认命名空间

  1. nerdctl ns ls
  2. nerdctl ps
  3. mkdir /etc/nerdctl/
  4. cat >> /etc/nerdctl/nerdctl.toml <<'EOF'
  5. namespace = "k8s.io"
  6. EOF
  7. nerdctl ps

 

十四、配置容器打包工具(buildkit)

1、通过代理下载 buildkit 工具

wget https://ghproxy.com/https://github.com/moby/buildkit/releases/download/v0.10.5/buildkit-v0.10.5.linux-amd64.tar.gz

 2、安装 buildkit 工具

  1. tar -zxvf buildkit-v0.10.5.linux-amd64.tar.gz -C /data/software/containerd/
  2. ll /data/software/containerd/bin/
  3. # 配置 systemd 管理
  4. cat > /etc/systemd/system/buildkit.socket <<'EOF'
  5. [Unit]
  6. Description=BuildKit
  7. Documentation=https://github.com/moby/buildkit
  8. [Socket]
  9. ListenStream=%t/buildkit/buildkitd.sock
  10. [Install]
  11. WantedBy=sockets.target
  12. EOF
  13. cat > /etc/systemd/system/buildkit.service <<'EOF'
  14. [Unit]
  15. Description=BuildKit
  16. Requires=buildkit.socket
  17. After=buildkit.socketDocumentation=https://github.com/moby/buildkit
  18. [Service]
  19. ExecStart=/data/software/containerd/bin/buildkitd --oci-worker=false --containerd-worker=true
  20. [Install]
  21. WantedBy=multi-user.target
  22. EOF

 3、启动 buildkit 工具并设置开机自启

  1. # 重新加载
  2. systemctl daemon-reload
  3. # 启动并设置开启自启
  4. systemctl enable --now buildkit
  5. # 检查
  6. systemctl status buildkit

4、编写dockerfile

  1. cat > Dockerfile <<'EOF'
  2. FROM alpine:3.13.5
  3. # Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.
  4. ENV LANG=C.UTF-8
  5. RUN echo "**** install packages ****" && \
  6. sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\
  7. ALPINE_GLIBC_BASE_URL="http://192.168.240.189:88/chfs/shared" && \
  8. ALPINE_GLIBC_PACKAGE_VERSION="2.33-r0" && \
  9. ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
  10. ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
  11. ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
  12. apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
  13. echo \
  14. "-----BEGIN PUBLIC KEY-----\
  15. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\
  16. y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\
  17. tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\
  18. m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\
  19. KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\
  20. Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\
  21. 1QIDAQAB\
  22. -----END PUBLIC KEY-----" | sed 's/ */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \
  23. wget \
  24. "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
  25. "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
  26. "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
  27. apk add --no-cache \
  28. "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
  29. "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
  30. "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
  31. \
  32. rm "/etc/apk/keys/sgerrand.rsa.pub" && \
  33. /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \
  34. echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \
  35. \
  36. apk del glibc-i18n && \
  37. \
  38. rm -f "/root/.wget-hsts" && \
  39. apk del .build-dependencies && \
  40. rm \
  41. "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
  42. "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
  43. "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
  44. RUN apk update --no-cache && apk add ca-certificates --no-cache && \
  45. apk add tzdata --no-cache && \
  46. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  47. echo "Asia/Shanghai" > /etc/timezone
  48. EOF

5、测试打包镜像

  1. docker build -t base-alpine .
  2. nerdctl image ls

 

文章知识点与官方知识档案匹配,可进一步学习相关知识

与[转帖]containerd命令操作相似的内容:

[转帖]containerd命令操作

一、版本信息 内核版本:5.19.12-1.el7.elrepo.x86_64 系统版本:CentOS Linux release 7.9.2009 二、下载文件: wget https://github.com/opencontainers/runc/releases/download/v1.1.

[转帖]k3s containerd和docker 命令对比

https://www.cnblogs.com/already/p/12691327.html k3s默认使用container 两者命令对比表: idcontainerd 命令docker 命令备注 1 ctr image ls docker images 获取image信息 2 ctr imag

[转帖]Kubernetes Container、Pod、Namespace内存及CPU限制

https://www.cnblogs.com/punchlinux/p/16625590.html 阅读目录 配额类型 配额管理 Request 和 Limits limit-range配置: Pod未申请resource Pod申请资源 Quota资源限制 对每个命名空间的资源消耗总量提供限制(

[转帖]containerd_v1.6.0+nerdctl+buildkit 二进制安装,支持多CPU并发构建

一、安装containerd # yum install libseccomp -y #下载containerd curl -L https://github.com/containerd/containerd/releases/download/v1.6.0/cri-containerd-cni-

[转帖]Containerd安装与使用

https://www.cnblogs.com/punchlinux/p/16496094.html Containerd 的技术方向和目标 简洁的基于 gRPC 的 API 和 client library 完整的 OCI 支持(runtime 和 image spec) 同时具备稳定性和高性能的

[转帖]containerd_v1.6.0+nerdctl+buildkit 二进制安装,支持多CPU并发构建

一、安装containerd # yum install libseccomp -y #下载containerd curl -L https://github.com/containerd/containerd/releases/download/v1.6.0/cri-containerd-cni-

[转帖]k8s containerd私有仓库配置及常用命令

containerd相关 一、修改containerd配置文件,添加私有仓库配置 查看containerd的默认配置 containerd config default k3s集群配置文件位置: /etc/rancher/k3s/registries.yaml /var/lib/rancher/k3

[转帖]k8s学习-containerd命令行工具crictl使用

在最新k8s的版本中,containerdruntime已经不在使用docker,而是使用containerd了。​containerd是什么?containerd的自我介绍中说它是一个开放、可靠的容器运行时,实际上它包含了单机运行一个容器运行时的功能。 containerd为了支持多种OCI Ru

[转帖]Centos下使用containerd管理容器:5分钟从docker转型到containerd

https://www.cnblogs.com/renshengdezheli/p/16684175.html 目录 一.系统环境 二.前言 三.containerd 四.部署containerd 4.1 安装containerd 4.2 containerd配置文件 4.3 配置container

[转帖]k8s系列-06-containerd的基本操作

https://www.jianshu.com/p/52a2884594f5 上一篇我们介绍了containerd的安装,本篇我们来简单介绍下如何进行使用。 环境 linux服务器 前置安装 躺过的坑,需要安装下面内容,否则执行ctr run的时候会报错如下: ctr: failed to crea