CentOS 7.9 安装 containerd(转载)

containerd 安装及使用

containerd 安装

安装 containerd

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install containerd.io

生成默认配置

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

配置 systemd cgroup 驱动程序

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

配置代理(如果需要则配置,默认无需修改)

这步主要是为了 kubeadm 初始化时能从 k8s.gcr.io 拉取镜像。

vim /usr/lib/systemd/system/containerd.service

# 在 [Service] 段添加以下参数
[Service]
Environment="HTTPS_PROXY=http://代理IP:代理端口"
Environment="NO_PROXY=127.0.0.1/8,172.16.0.0/16"

启动

systemctl daemon-reload
systemctl enable containerd --now
systemctl status containerd

containerd 使用

镜像操作

拉取镜像
$ ctr image pull docker.io/library/nginx:alpine
列出本地镜像
$ ctr image ls
REF                            TYPE                                                      DIGEST                                                                  SIZE    PLATFORMS                                                                                LABELS
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:bead42240255ae1485653a956ef41c9e458eb077fcb6dc664cbc3aa9701a05ce 9.5 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -

$ ctr image ls -q
docker.io/library/nginx:alpine

使用 -q(--quiet) 选项可以只打印镜像名称。

检测本地镜像
$ ctr image check
REF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:bead42240255ae1485653a956ef41c9e458eb077fcb6dc664cbc3aa9701a05ce complete (7/7) 9.5 MiB/9.5 MiB true

主要查看其中的 STATUS,complete 表示镜像是完整可用的状态

重新打标签
$ ctr image tag docker.io/library/nginx:alpine nginx:v1
harbor.k8s.local/course/nginx:alpine

$ ctr image ls -q
docker.io/library/nginx:alpine
nginx:v1
删除镜像
$ ctr image rm harbor.k8s.local/course/nginx:alpine
harbor.k8s.local/course/nginx:alpine

$ ctr image ls -q
docker.io/library/nginx:alpine

加上 --sync 选项可以同步删除镜像和所有相关的资源。

将镜像挂载到主机目录
$ ctr image mount docker.io/library/nginx:alpine /mnt
sha256:c3554b2d61e3c1cffcaba4b4fa7651c644a3354efaafa2f22cb53542f6c600dc
/mnt

$ tree -L 1 /mnt
/mnt
├── bin
├── dev
├── docker-entrypoint.d
├── docker-entrypoint.sh
├── etc
├── home
├── lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var

18 directories, 1 file
将镜像从主机目录上卸载
$ ctr image unmount /mnt
/mnt
将镜像导出为压缩包
$ ctr image export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine
从压缩包导入镜像
$ ctr image import nginx.tar.gz

容器操作

创建容器
$ ctr container create docker.io/library/nginx:alpine nginx
列出容器
$ ctr container ls
CONTAINER    IMAGE                             RUNTIME
nginx        docker.io/library/nginx:alpine    io.containerd.runc.v2

同样可以加上 -q 选项精简列表内容

$ ctr container ls -q
nginx
查看容器详细配置

类似于 docker inspect 功能。

$ ctr container info nginx
删除容器
$ ctr container rm nginx

$ ctr container ls
CONTAINER    IMAGE    RUNTIME

除了使用 rm 子命令之外也可以使用 delete 或者 del 删除容器。

任务

通过 container create 命令创建的容器,并没有处于运行状态,只是一个静态的容器。

一个容器真正运行起来是由 Task 任务实现的,Task 可以为容器设置网卡,还可以配置工具来对容器进行监控等。

启动容器
$ ctr task start -d nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
查看正在运行的容器
$ ctr task ls
TASK     PID     STATUS
nginx    3630    RUNNING
进入容器进行操作
$ ctr task exec --exec-id 0 -t nginx sh
/ #

不过这里需要注意必须要指定 --exec-id 参数,这个 id 可以随便写,只要唯一就行。

暂停容器
$ ctr task pause nginx

暂停后容器状态变成了 PAUSED

$ ctr task ls
TASK     PID     STATUS
nginx    3630    PAUSED
恢复容器:
$ ctr task resume nginx

$ ctr task ls
TASK     PID     STATUS
nginx    3630    RUNNING

不过需要注意 ctr 没有 stop 容器的功能,只能暂停或者杀死容器

杀死容器
$ ctr task kill nginx

$ ctr task ls
TASK     PID     STATUS
nginx    3630    STOPPED
删除 Task
$ ctr task rm nginx
$ ctr task ls
TASK    PID    STATUS
获取容器信息

除此之外我们还可以获取容器的 cgroup 相关信息,可以使用 task metrics 命令用来获取容器的内存、CPUPID 的限额与使用量。

# 重新启动容器
$ ctr task metrics nginx
ID             TIMESTAMP                                  
nginx          2022-12-21 07:27:56.869059839 +0000 UTC    

METRIC                   VALUE                  
memory.usage_in_bytes    2121728                
memory.limit_in_bytes    9223372036854771712    
memory.stat.cache        20480                  
cpuacct.usage            67129078               
cpuacct.usage_percpu     [19767213 47361865]    
pids.current             3                      
pids.limit               0  

还可以使用 task ps 命令查看容器中所有进程在宿主机中的 PID

$ ctr task ps nginx
PID     INFO
3984    -
4029    -
4030    -
4031    -
4032    -
4033    -
4034    -
4035    -
4036    -

$ ctr task ls
TASK     PID     STATUS
nginx    3984    RUNNING

其中第一个 PID 3984 就是我们容器中的 1 号进程。

命名空间

另外 Containerd 中也支持命名空间的概念,比如查看命名空间:

$ ctr ns ls
NAME    LABELS
default

如果不指定,ctr 默认使用的是 default 空间。同样也可以使用 ns create 命令创建一个命名空间:

$ ctr ns create test

$ ctr ns ls
NAME    LABELS
default
test

使用 remove 或者 rm 可以删除 namespace

$ ctr ns rm test
test

$ ctr ns ls
NAME    LABELS
default

有了命名空间后就可以在操作资源的时候指定 namespace,比如查看 test 命名空间的镜像,可以在操作命令后面加上 -n test 选项:

$ ctr -n test image ls
REF TYPE DIGEST SIZE PLATFORMS LABELS

Docker 其实也是默认调用的 containerd,事实上 Docker 使用的 containerd 下面的命名空间默认是 moby,而不是 default,所以假如我们有用 docker 启动容器,那么我们也可以通过 ctr -n moby 来定位下面的容器:

$ ctr -n moby container ls

同样 Kubernetes 下使用的 containerd 默认命名空间是 k8s.io,所以我们可以使用 ctr -n k8s.io 来查看 Kubernetes 下面创建的容器。

Containerd 高级命令行工具 nerdctl

参考文档

参考文档

https://www.jianshu.com/p/2d3ea652da9f
https://www.qikqiak.com/k3s/runtime/usage/#使用
https://www.qikqiak.com/k3s/runtime/nerdctl/

posted @ 2022-12-21 15:35  evescn  阅读(2216)  评论(0编辑  收藏  举报