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.4/runc.amd64
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz
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文件系统,因为这个方案比较简单,

配置步骤如下:

# 添加自开启自动加载模块
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

# 如果 containerd 已经运行着,需要删除永久存储的数据
# rm -rf /var/lib/containerd/

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

# 如果 docker 已经运行着,需要删除永久存储的数据
# rm -rf /var/lib/docker

vim /usr/lib/systemd/system/docker.service
# ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --storage-driver=overlay -g /opt/docker

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

3、手动加载模块 

modprobe overlay
modprobe br_netfilter

# 检查模块情况
lsmod | grep -E 'overlay|br_netfilter'

 

四、部署containerd

mkdir /data/software/containerd
mkdir /etc/containerd
tar zxf containerd-1.6.8-linux-amd64.tar.gz -C /data/software/containerd/
tar zxf crictl-v1.25.0-linux-amd64.tar.gz -C /data/software/containerd/bin/
mv runc.amd64 /data/software/containerd/bin/runc
chmod +x /data/software/containerd/bin/runc

cat > /etc/profile.d/containerd_home.sh <<'EOF'
export CONTAINERD_HOME=/data/software/containerd
export PATH=$PATH:$CONTAINERD_HOME/bin
EOF

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容器服务

mkdir /data/software/containerd/data
 
vim /etc/containerd/config.toml

# 大概在第6行
root = "/data/software/containerd/data"

# 大概在第61行
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

 

  

 

 六、配置/etc/crictl.yaml

不然会报错

cat > /etc/crictl.yaml <<'EOF'
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 0
debug: false
pull-image-on-create: false
disable-pull-on-run: false
EOF


# 或者执行下面的两条命令来生成配置文件
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

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

cat > /usr/lib/systemd/system/containerd.service <<'EOF'
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/data/software/containerd/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

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

systemctl enable containerd --now

 九、测试

systemctl status containerd.service

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

 暂停容器

ctr task pause redis
ctr task ls

 

恢复容器为启动状态

ctr tasks resume redis
ctr task ls

 停止容器

ctr task kill redis
ctr task ls

 

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

ctr task resume redis
ctr task ls

删除容器

ctr task delete redis
ctr task ls
ctr container ls
ctr container rm redis
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 工具

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

3、配置docker命令通用

ln -s /usr/local/bin/nerdctl /usr/local/bin/docker

# 配置tab补全,弄了docke的软链接可以用,但不能用tab去补全相关的参数
echo 'source <(nerdctl completion bash)' >> /root/.bashrc

source /root/.bashrc

4、配置默认命名空间

nerdctl ns ls
nerdctl ps
mkdir /etc/nerdctl/

cat >> /etc/nerdctl/nerdctl.toml <<'EOF'
namespace = "k8s.io"
EOF

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 工具

tar -zxvf buildkit-v0.10.5.linux-amd64.tar.gz -C /data/software/containerd/

ll /data/software/containerd/bin/

# 配置 systemd 管理
cat > /etc/systemd/system/buildkit.socket <<'EOF'
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock

[Install]
WantedBy=sockets.target
EOF

cat > /etc/systemd/system/buildkit.service <<'EOF'
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socketDocumentation=https://github.com/moby/buildkit

[Service]
ExecStart=/data/software/containerd/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target
EOF

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

# 重新加载
systemctl daemon-reload

# 启动并设置开启自启
systemctl enable --now buildkit

# 检查
systemctl status buildkit

4、编写dockerfile

cat > Dockerfile <<'EOF'
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
RUN echo "**** install packages ****" && \
    sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories &&\
    ALPINE_GLIBC_BASE_URL="http://192.168.240.189:88/chfs/shared" && \
    ALPINE_GLIBC_PACKAGE_VERSION="2.33-r0" && \
    ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
    echo \
        "-----BEGIN PUBLIC KEY-----\
        MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\
        y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\
        tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\
        m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\
        KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\
        Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\
        1QIDAQAB\
        -----END PUBLIC KEY-----" | sed 's/   */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \
    wget \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
    apk add --no-cache \
        "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
    \
    rm "/etc/apk/keys/sgerrand.rsa.pub" && \
    /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \
    echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \
    \
    apk del glibc-i18n && \
    \
    rm -f "/root/.wget-hsts" && \
    apk del .build-dependencies && \
    rm \
        "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"


RUN apk update --no-cache && apk add ca-certificates --no-cache && \
    apk add tzdata --no-cache && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone
EOF

5、测试打包镜像

docker build -t base-alpine .
nerdctl image ls

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值