暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

容器运行时containerd

运维DevOps 2023-09-16
34

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 = ["https://bqr1dr1n.mirror.aliyuncs.com"]
                      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
                      endpoint = ["https://registry.aliyuncs.com/k8sxio"]

                      使用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功能

                                                文章转载自运维DevOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                评论