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
命令用来获取容器的内存、CPU
和PID
的限额与使用量。
# 重新启动容器
$ 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/