容器运行时containerd

containerd 是一个工业级标准的容器运行时,它强调简单性健壮性可移植性,在Linux和window上可以作为一个守护进程运行,它可以管理主机系统上容器的完整的生命周期:镜像传输和存储,容器的执行和监控,低级别的存储和网络

containerd作用如下:

  • 管理容器的生命周期(从创建容器到销毁容器)
  • 拉取/推送容器镜像
  • 存储管理(管理镜像及容器数据的存储)
  • 调用 runC 运行容器(与 runC 等容器运行时交互)
  • 管理容器网络接口及网络

containerd特点:

  • 简洁的基于 gRPC 的 API 和 client library
  • 完整的 OCI 支持(runtime 和 image spec)
  • 同时具备稳定性和高性能的定义良好的容器核心功能
  • 一个解耦的系统(让 image、filesystem、runtime 解耦合),实现插件式的扩展和重用

containerd架构:

Containerd 采用标准的 C/S 架构:服务端通过 GRPC 协议提供稳定的 API;客户端通过调用服务端的 API 进行高级的操作

架构图如下:

containerd安装

下载地址:

官网:  https://containerd.io/downloads/
github: https://github.com/containerd/containerd

1、解压缩并添加到环境变量中,如下:

tar xf containerd-1.7.5-linux-amd64.tar.gz -C /usr/local

2、下载服务托管文件,根据需要修改实际的container地址,如下:

wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
mv containerd.service /lib/systemd/system  #放到服务托管目录

3、重载配置文件并设置开机启动并启动,如下:

systemctl daemon-reload
systemctl enable --now containerd

4、查看containerd的状态,如图:

runc安装

1、下载runc,下载地址如下:

https://github.com/opencontainers/runc/releases

2、执行如下命令安装到/usr/local/bin/目录下,如下:

install -m 755 runc.amd64 /usr/local/sbin/runc

3、运行命令查看runc是否安装成功,如图:

安装CNI插件

1、下载地址如下:

https://github.com/containernetworking/plugins/releases

2、创建目录,解压二进制文件到目录下,如下:

mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

为什么要安装在/opt/cni/bin/下面呢?

因为containerd默认情况下读取的就是此目录下的cni插件,containerd运行后,如果没有指定配置文件,会有一个默认的配置文件,只是在机器上看不到,如果我们需要修改此配置文件,需要先将默认配置文件生成出来,可执行命令如下:

containerd config default > /etc/containerd/config.toml #注意要放在/etc/containerd下

修改此文件即可添加镜像加速器,如下:

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = ["registry.aliyuncs.com/google_containers"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
      endpoint = ["registry.aliyuncs.com/google_containers"]

使用ctr命令

1、拉取镜像,执行命令如下:

ctr images pull --platform linux/amd64 docker.io/library/nginx:latest
  • –platform:指定架构平台,如果有多个用逗号分隔,如:–platform a,b,c
  • docker.io/library:docker hub 仓库地址

2、给镜像打个tag,命令如下:

ctr images tag docker.io/library/nginx:latest nginx:latest

3、查看镜像列表,ctr images ls 命令,如图:

ctr images ls  或者  ctr i ls

4、创建容器,执行命令如下:

ctr run -d --net-host nginx:latest nginx  #默认使用80端口,主机也一样

5、查看创建后的容器,命令如下:

ctr containers ls 或者 ctr c ls

6、进入到容器中,命令如下:

ctr task exec --exec-id $RANDOM -t nginx bash  #bash或者sh都可以
  • $RANDOM:特殊的环境变量,用于生成随机数,--exec-id 参数用于指定在容器内执行的进程的标识符。通过将 $RANDOM 作为 --exec-id 的值,可以保证每次执行命令时都会生成一个不同的随机标识符,避免冲突和重复
  • -t:表示指定一个终端

7、查看容器详细信息,命令如下:

ctr container info nginx 或者  ctr c info nginx # c 是container的简写

8、删除容器,命令如下:

ctr task kill nginx    #杀死容器
ctr task ls            #查看容器状态
ctr task rm nginx      #删除容器

更多用法可使用ctr -h查询或网上搜索

使用nerdctl命令

ctr 命令功能太少,因此 containerd 支持客户端工具扩展,推荐使用 nerdctl,nerdctl使用方法与docker命令的语法基本一致,nerdctl不仅与docker兼容,而且还支持了更多的功能,可作为docker cli的替代品

1、首先下载并安装nerdctl,命令如下:

wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-1.5.0-linux-amd64.tar.gz
tar xf nerdctl-1.5.0-linux-amd64.tar.gz
cp nerdctl /usr/local/bin/

2、查看nerdctl是否安装成功,如图:

3、拉取nginx镜像,执行如下命令:

nerdctl pull nginx   #默认将拉取docker.io/library下的最新的nginx镜像

注意:nerdctl是没有search命令的,因此不能查询镜像

4、查看拉取的镜像,执行命令如下:

nerdctl images

5、运行nginx容器,并查看启动后的容器,如下:

nerdctl run -d --name nginx -p 80:80 nginx   #可根据需要映射端口
nerdctl ps

其他命令与docker命令相差无几,例如:

nerdctl stop nginx                     #停止容器
nerdctl start nginx                    #启动容器
nerdctl exec -it nginx /bin/bash       #进入容器
nerdctl inspect nginx                  #查看容器详细信息
nerdctl logs nginx                     #查看日志消息

更多用法可通过nerdctl –help来查看

注意:containerd是自己实现了namespace功能的,docker是直接使用linux内核提供的namespace功能

标签