• containerd命令操作


    一、版本信息

    内核版本: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

     

  • 相关阅读:
    Centos 安装 OpenLDAP
    使用ext2fsd将装有Ubuntu的硬盘挂载到Windows后,导致Ubuntu系统无法启动
    你可需要的对象存储中间件《Minio使用》
    电力电子转战数字IC20220818day63——uvm入门实验5
    Google测试之道读后感
    【Docker】Linux网络命名空间
    CUDA环境配置在Ubuntu18
    【高德地图API】JS高德地图API实现多边形绘画,高德获取多边形提交数据
    HarmonyOS—端云一体化组件
    LeetCode第一题完整代码
  • 原文地址:https://blog.csdn.net/moyuanbomo/article/details/127111338