云计算百科
云计算领域专业知识百科平台

别只懂 Docker!深入容器底层:Containerd 才是幕后大佬

容器管理工具Containerd

在这里插入图片描述

一、Containerd介绍

1、前言

  • 起源:2016.3 Docker1.11内置containerd;之后containerd从Docker引擎剥离,独立开源,目标是打造开放稳定的容器运行基础设施,独立后能力覆盖容器运行时全量管理需求。
  • 定位:不是面向普通终端用户,主要供上层编排系统集成使用(K8s、Swarm、Mesos)。
  • 工作形态:以Daemon守护进程运行,对外提供gRPC API,上层系统调用API管理容器。
  • 分工(每个containerd只负责一台机器)
    • containerd:拉取镜像、启停容器、管理网络与存储;
    • runc:真正负责创建、运行容器进程;
    • 支持全部符合OCI规范的容器。
  • 优势:containerd + runc组合轻量,适合容器编排场景;与Docker解耦独立迭代,专注容器运行管理,稳定性更好。
  • 在这里插入图片描述

    2、 containerd前世今生

  • 2013年Docker推出容器产品,Google担心自身Borg系统受到冲击,联合RedHat、IBM说服Docker,将底层容器核心libcontainer捐献给中立社区OCI(开放容器倡议),重命名为runc。
  • Google联合RedHat、IBM成立CNCF云原生计算基金会,把内部Borg系统开源,即Kubernetes,发力大规模容器编排场景。
  • 2016年Docker推出Docker Swarm,试图统一容器生态,实现容器管理与大规模编排;市场验证后发现无法抗衡K8s。
  • 2017年Docker宣布原生支持Kubernetes,在大规模编排市场落败;Docker将核心组件containerd捐献给CNCF,Docker定位转为PaaS平台。
  • 2020年CNCF宣布Kubernetes 1.24不再原生支持Docker。
    • 早期K8s使用Docker时,需要shim垫片,将K8s的CRI(容器运行时接口)翻译为Docker API。
    • 随着容器生态发展,K8s取消维护垫片;containerd可直接无缝对接K8s,成为K8s容器运行时的主流选择。
  • 3、 containerd架构

    Containerd设计的目的是**为了嵌入到Kubernetes中使用**。已经实现大多数容器管理功能,例如:容器生命周期管理、容器镜像传输和管理、容器存储与网络管理等

    3.1 架构图

    在这里插入图片描述

  • containerd采用标准**C/S客户端-服务端架构**。

    • 服务端使用gRPC协议对外提供稳定API。
    • 客户端调用服务端API完成各类容器操作。
  • 解耦设计:将不同的职责划分给不同的组件,每个组件就相当于一个子系统

    (subsystem)。连接不同子系统的组件被称为模块。

  • 两大子系统

    • Bundle:包含配置、元数据、根文件系统数据,可以理解为容器文件系统;支持从镜像提取、打包Bundle。
    • Runtime:执行Bundle,负责创建容器。
  • Containerd Core 核心部分**由多个子系统构成,==子系统依靠一个或多个模块协同工作**==,各类**模块以插件形式集成进 Containerd。插件相互依赖**。

    常见插件:Service Plugin、Metadata Plugin、GC插件、Runtime插件、Snapshot插件、Content插件等。

  • 3.2 常用插件
  • Content Plugin:提供镜像不可变内容的访问,存储镜像静态数据。
  • Snapshot Plugin:管理镜像文件系统快照,镜像每一层解压成文件系统快照,类似Docker的graphdriver。
  • Metrics:暴露各个组件监控指标,用于监控采集。
    在这里插入图片描述
  • 3.3 架构缩略图

    containerd整体划分为三大块:Storage存储、Metadata元数据、Runtime运行时。

    在这里插入图片描述

    • Storage:Content、Snapshot、Diff
    • Metadata:Images、Containers、Tasks、Events
    • 通过gRPC对外提供接口,Metrics采集监控;底层对接操作系统,Runtime对接runc等底层运行时。
    3.4 与其他容器运行时性能对比

    测试维度:容器启动、停止、删除耗时。

    在这里插入图片描述

    结论:containerd综合性能优于Docker、crio。

    二、Containerd安装

    1、 YUM方式安装

  • 实验环境:操作系统为CentOS Stream 8。

  • 安装前置依赖包:yum-utils、device-mapper-persistent-data、lvm2、vim。

    [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim

  • 配置docker-ce软件源,通过yum下载安装containerd。

  • 验证安装:rpm -qa | grep containerd查看是否存在安装包。

  • 启动与开机自启:systemctl start containerd、systemctl enable containerd,systemctl status containerd查看运行状态。

  • 验证containerd版本:使用ctr命令,ctr是containerd自带客户端,用于容器与镜像管理;ctr version查看客户端、服务端版本信息。

  • # 1.获取阿里云YUM源
    [root@localhost ~]# yum-config-manager –add-repo
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    [root@localhost ~]# yum makecache
    # 2.查看YUM源中Containerd软件
    [root@localhost ~]# yum list | grep containerd
    containerd.io.x86_64 1.6.32-3.1.el8
    docker-ce-stable
    # 3.安装Containerd.io软件,即可安装Containerd
    [root@localhost ~]# yum -y install containerd.io
    # 4.使用rpm -qa命令查看是否安装
    [root@localhost ~]# rpm -qa | grep containerd
    containerd.io-1.6.32-3.1.el8.x86_64
    # 5.设置containerd服务启动及开机自启动
    [root@localhost ~]# systemctl enable containerd –now
    [root@localhost ~]# systemctl status containerd
    # 6.验证
    # 安装Containerd时ctr命令亦可使用,ctr命令主要用于管理容器及容器镜像等。
    # 使用ctr命令查看Containerd客户端及服务端相关信息
    [root@localhost ~]# ctr version
    Client:
    Version: 1.6.32
    Revision: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
    Go version: go1.21.10
    Server:
    Version: 1.6.32
    Revision: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
    UUID: 979940af-68e0-4681-a560-189eeaefbdfc

    2、 二进制方式安装

    containerd二进制包分为两种:

    • 第一种:containerd-xxx,用于单机测试,不包含runc,需要手动提前安装runc。
    • 第二种:cri-containerd-cni-xxx,集成系统所需runc、CNI网络插件,K8s集群部署推荐该包。
    2.1 安装步骤:
  • 从github官网下载对应版本的cri-containerd-cni压缩包,上传至服务器。

  • 解压压缩包,解压后目录包含:etc(配置文件)、opt、usr(二进制可执行程序)。

    解压后目录结构与作用:

    • **etc目录:**存放containerd服务管理配置文件、cni虚拟网卡配置文件。

      • etc/systemd/system/containerd.service:systemd服务单元文件,定义containerd服务启动参数。
      • etc/cni/net.d/10-containerd-net.conflist:CNI网络插件配置文件。

      在这里插入图片描述

    • opt目录:存放CNI网络插件二进制程序(bridge、host-local、portmap等),GCE云环境配套配置文件。

      在这里插入图片描述

    • usr/local目录:核心二进制程序,containerd运行时文件,包含runc。

      • bin:containerd主程序、ctr客户端、crictl、containerd-shim容器垫片程序。
      • sbin:内置runc,负责底层创建OCI容器。

      在这里插入图片描述

  • 将解压后的service服务文件复制到/etc/systemd/system/,生成containerd系统服务单元文件。

  • 在这里插入图片描述

  • 生成containerd主配置文件/etc/containerd/config.toml,可自定义镜像仓库、存储、运行时等参数。
    在这里插入图片描述
    在这里插入图片描述

  • 重载systemd配置,启动containerd服务并设置开机自启。

  • 执行ctr version验证安装是否成功。

  • 查看配置文件config.toml

  • 重点:

    • 配置容器默认运行时(runc)、镜像拉取地址、快照器(overlayfs)。
    • 包含CNI网络插件配置、容器日志、权限、镜像仓库相关配置。
    2.2 安装runC:
    • runc负责底层创建OCI容器,由于二进制包中提供的runC默认需要系统中安装seccomp支持,需要单独安装,且不同版本runC对seccomp版本要求一致;
    • 需要单独安装对应版本,解压二进制文件放到/usr/bin,执行runc –version校验。

    # 使用wget下载runc
    [root@localhost ~]# wget https://github.com/opencontainers/runc/releases/download/v1.3.0/runc.amd64

    # 安装runc
    [root@localhost ~]# mv runc.amd64 /usr/sbin/runc

    # 为runc添加可执行权限
    [root@localhost ~]# chmod +x /usr/sbin/runc

    # 使用runc命令验证是否安装成功
    [root@localhost ~]# runc -v
    runc version 1.3.0
    commit: v1.3.0-0-g4ca628d1
    spec: 1.2.1
    go: go1.23.8
    libseccomp: 2.5.6

    3、 两种安装方式对比

  • YUM安装:简单快捷,适合快速测试;版本由yum源提供。
  • 二进制包安装:版本可控,可自定义组件,生产K8s环境常用,推荐cri-containerd-cni完整包。

  • 三、Containerd容器镜像管理

    1、 帮助命令

  • 镜像管理命令区分:
    • Docker:使用docker images管理镜像
    • 单机containerd:使用ctr images,是containerd原生CLI客户端
    • K8s中的containerd:使用crictl images,K8s社区专用CLI工具
  • ctr说明:属于调试管理客户端,不保证版本向后兼容。
  • 全局参数重点:–namespace / -n指定命名空间,默认命名空间default;K8s使用k8s.io命名空间。
  • 查看镜像命令帮助
  • #命令帮助
    [root@localhost ~]# ctr –help

    # 子命令帮助
    [root@localhost ~]# ctr images –help

    ctr images支持list、pull、push、export、import、mount、rm、tag等子命令。

    2、查看镜像

  • 命令:ctr images list,简写 ctr images ls
  • 输出字段:REF(镜像全名)、TYPE、DIGEST(哈希摘要)、SIZE、PLATFORMS(架构)、LABELS。
    在这里插入图片描述
  • 3、下载镜像

    命令:ctr images pull 完整镜像地址

    在这里插入图片描述

  • containerd兼容OCI标准镜像,可以直接使用Docker官方、Dockerfile构建出来的镜像。
  • 重点坑:==ctr images pull不能直接简写镜像名=(不能直接写nginx:alpine),必须写完整镜像地址(带仓库域名)。
  • 拉取完成后,用ctr images ls验证镜像。
  • 4、镜像挂载

  • 作用:直接把镜像挂载到本地目录,不用启动容器就可以查看镜像内部文件内容。
  • 挂载命令:ctr images mount 完整镜像名 /mnt
  • 查看挂载:ls /mnt浏览镜像内文件。
  • 卸载命令:umount /mnt。
  • 5、镜像导出

  • 命令:ctr images export –platform linux/amd64 nginx.tar 完整镜像名
  • –platform:指定导出镜像的平台架构。
  • 功能:将本地镜像打包为tar归档文件,用于离线迁移。
  • 6、镜像删除

  • 命令:ctr images rm 完整镜像名(delete/rm均可)
  • 参数–sync:同步删除镜像以及关联的资源。
  • 删除后执行ctr images ls验证镜像是否移除。
  • 7、镜像导入

  • 命令:ctr images import –platform linux/amd64 nginx.tar
  • 功能:把tar镜像包导入containerd。
  • 导入完成,ctr images ls查看导入后的镜像。
  • 8、修改镜像tag

    命令:ctr images tag

    ctr images tag 原完整镜像名 新完整镜像名

  • 原理:不是复制镜像文件,只是给同一个镜像新增一个引用标签(和docker tag逻辑一致,底层镜像哈希不变)。

  • ⚠️重点考点:ctr tag同样必须写完整镜像名称,不能简写。

    示例:

  • # 把054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest 修改为 nginx:latest
    [root@localhost ~]# ctr images tag 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest nginx:latest

  • 验证:执行ctr images ls,列表里会出现两条 REF,但 DIGEST 摘要完全一样,代表是同一个镜像。

  • 补充:如果不需要旧标签,可以单独ctr images rm 旧镜像引用,只要还有一个 tag 引用存在,镜像本体不会被删除。


  • 简答背诵精简版
  • 管理镜像工具区分:docker用docker images;

    • 单机containerd原生ctr images;

    • K8s节点使用crictl images。

    • ctr支持命名空间,默认default,K8s使用k8s.io。

  • ctr images ls查看本地镜像,显示镜像引用、摘要、大小、架构等信息。

  • containerd兼容OCI镜像;ctr拉取镜像必须填写完整镜像仓库地址,不能简写。

  • ctr images mount挂载镜像,无需启动容器查看内部文件;umount卸载。

  • ctr images export导出镜像为tar包,支持指定平台架构,用于离线迁移。

  • ctr images rm删除镜像,–sync同步清理关联资源。

  • ctr images import导入tar镜像包。


  • 四、containerd容器管理

    核心概念区分:

    container(静态容器) 和 task(动态任务,容器内运行的进程)

    ctr container create只是创建静态容器资源,不会启动进程;必须用 ctr task 管理进程启停。

    1、获取命令帮助

  • ctr –help:查看ctr整体帮助,ctr是调试管理客户端,接口不保证向后兼容。

  • 全局参数:-n / –namespace指定命名空间,默认default,K8s用k8s.io。

  • ctr container –help:容器子命令帮助,create、delete、info、list、label等。

    • 使用ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。
    • 这个container 对象只是**包含了运行一个容器所需的资源及配置的数据结构**,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程还没有启动。需要使用ctr tasks命令才能获取一个动态容器。
  • ctr run –help:run命令帮助,ctr run可以一步创建静态容器并启动task,直接运行容器。

  • 2、查看静态容器

    • 命令:ctr container ls,简写 ctr c ls
    • 作用:列出静态容器(仅资源配置,不一定正在运行)

    3、查看任务task(容器运行进程)

    • 命令:ctr task ls,简写 ctr t ls
    • 作用:查看容器里正在运行的进程任务;只有启动task之后,容器才真正处于运行状态。

    4、创建静态容器

    命令:ctr container create 完整镜像名 容器名

  • 执行create之后,只会生成静态容器对象,包含rootfs、namespace、配置等资源,应用进程并未启动。

  • 查看容器详细信息:

    ctr container info 容器名

    ⚠️重点:静态容器只是一套配置,没有运行中的进程,需要task命令启动。

  • 5、静态容器启动为动态容器

  • 命令:ctr task start -d 容器名,-d后台运行。
  • 执行后task**状态变为RUNNING**,宿主机上可以看到容器对应的进程。
  • 验证:ctr task ls查看状态;ps命令在宿主机上可看到容器进程。
  • 在这里插入图片描述

    6、进入容器内部操作

    命令:ctr task exec –exec-id $RANDOM -t 容器名 /bin/sh

    • –exec-id:必须指定一个唯一id,$RANDOM可以自动生成随机id。
    • -t:分配终端,实现交互式进入容器。

    7、直接运行动态容器(一步到位)

    命令:ctr run -d –net-host 完整镜像名 容器名

  • ctr run = container create + task start,一条命令直接创建并启动容器。
  • –net-host:主机网络模式,容器和宿主机共用网络栈,容器IP就是宿主机IP,等价docker的–net=host。
  • 8、暂停容器

    命令:ctr tasks pause 容器名

    • 暂停容器内进程,task状态变为PAUSED。
    • 验证:ctr task ls查看状态。

    9、恢复容器

    命令:ctr tasks resume 容器名

    • 将PAUSED状态的容器恢复运行,状态变回RUNNING。

    10、停止容器

    命令:ctr task kill 容器名

    • 杀掉容器内运行进程,task状态变为STOPPED。

      注意:kill只是停止task,静态容器对象仍然保留,不会被删除。

    11、删除容器

  • 前提:必须先停止或删除task(kill),才能删除静态容器。
  • 先删除task:ctr task delete 容器名
  • 再删除静态容器:ctr container delete 容器名,简写ctr c rm 容器名
  • 验证:ctr container ls确认容器已经消失。

  • 简答背诵精简版(考试答题)

    ctr –help查看总帮助;ctr container –help容器帮助;ctr run可一步创建并运行容器。

    ctr c ls查看静态容器,静态容器只是资源配置,不代表进程运行。

    ctr t ls查看task任务,task代表容器内运行的进程。

    ctr container create创建静态容器,不会启动进程。

    ctr task start -d启动静态容器的task,让容器进程运行。

    ctr task exec进入容器,–exec-id必须指定唯一标识。

    ctr run -d一步创建并启动容器;–net-host使用主机网络。

    ctr task pause暂停容器进程,状态PAUSED。

    ctr task resume恢复暂停的容器。

    ctr task kill终止容器进程,task状态变为STOPPED,但静态容器还存在。

    删除容器需要先删除task,再删除静态容器;ctr c rm删除静态容器。

    高频考点一句话

    containerd把容器拆成两层:container静态资源,task动态运行进程。docker run是一步封装;ctr需要分开操作,先create,再task start,删除也要先删task,再删container。


    五、Containerd使用私有容器镜像仓库Harbor

    六、Containerd NameSpace管理

    核心作用:namespace用来隔离容器、镜像、任务资源,不同命名空间内的资源互相不可见。

    1、列出已有namespace

    命令:ctr namespace ls

  • containerd默认工作在default命名空间

  • 当主机安装docker时,docker底层使用containerd,docker默认命名空间moby。

    考点:在docker机器上执行ctr ns ls看到的是moby,不是default。

  • 2、创建namespace

    命令:ctr namespace create 命名空间名称

    示例:

    [root@localhost ~]# ctr namespace create myns
    [root@localhost ~]# ctr namespace create testns

    执行创建后,再ctr namespace ls就能看到新增的命名空间。

    3、删除namespace

    命令:ctr namespace rm 命名空间名称

    ⚠️重要前提:命名空间内部所有镜像、容器、task任务必须全部清理干净,否则无法删除。

    4、查看指定namespace中的镜像

    -n 参数用来指定命名空间

    命令:ctr -n 命名空间名称 images ls

    不加-n默认操作default命名空间。

    5、查看指定namespace中运行的进程任务

    命令:ctr -n 命名空间名称 tasks ls

    查看该命名空间下task(容器运行进程),输出TASK名称、PID、状态。

    6、在指定namespace下载容器镜像

    命令:ctr -n 命名空间名称 images pull 镜像完整地址

    镜像只会下载到myns命名空间,default命名空间看不到这个镜像。

    7、在指定namespace创建静态容器

    命令:ctr -n 命名空间名称 create 完整镜像名 新容器名

    在myns命名空间创建静态容器,此时容器进程还未启动。

    8、在指定namespace启动容器、查看容器与任务

  • 查看该命名空间下静态容器:ctr -n 命名空间名称 container ls
  • 启动task(运行容器进程):ctr -n 命名空间名称 task start -d 容器名
  • 查看运行任务:ctr -n 命名空间名称 tasks ls,状态变为RUNNING。

  • 背诵精简考点

    • ctr namespace ls列出命名空间;原生containerd默认default;docker使用moby命名空间。

    • ctr namespace create xxx新建命名空间。

    • ctr namespace rm xxx删除命名空间,命名空间内资源清空才能删除。

    • -n全局参数,用来切换命名空间。

    • 所有镜像、容器、task操作,带上-n 命名空间名,就会在对应的命名空间执行。

    • 资源隔离:A命名空间的镜像/容器,在B命名空间无法直接看到。


    七、nerdctl 实践–管理containerd

    nerdctl:兼容Docker语法的containerd客户端,管理containerd,命令风格几乎和docker一致;nerdctl默认使用moby命名空间。

    1、nerdctl安装

    在这里插入图片描述

  • 下载nerdctl二进制包,解压放到/usr/bin,赋予执行权限。

  • 配套nerdctl需要containerd环境。

  • 可选:安装bash命令补全脚本,实现命令自动提示。

  • 常见报错:bash: nerdctl: command not found

    解决:检查解压路径、环境变量,或者重新source补全脚本。

  • 在这里插入图片描述

  • 镜像加速配置:修改/etc/containerd/config.toml,在配置文件添加镜像仓库地址(华为云镜像源等),重启containerd服务。
  • 2、nerdctl管理镜像

  • nerdctl images=nerdctl image ls:查看本地镜像。

  • nerdctl image pull :拉取镜像,从镜像仓库下载镜像到本地。

    [root@localhost ~]# nerdctl image pull busybox

  • nerdctl image rm 镜像名:删除本地无用镜像。

  • nerdctl tag 源镜像名[:标签] 新镜像名[:标签]:给镜像打标签。

  • nerdctl image save -o 镜像名 压缩包名 :将本地镜像导出为tar压缩包。——image可省略

  • **nerdctl image load -i tar包名 ** :把tar镜像包导入本地镜像库。

  • nerdctl image history 镜像名 :查看镜像构建时的历史命令层次结构。

  • **nerdctl image inspect 镜像名 **:查看镜像详细信息(json格式,包含架构、环境变量、分层信息等)。

  • nerdctl image prune –all –force:删除所有未使用镜像,–force不弹窗确认。

    注意:

    –all(简写 -a):不仅清理悬空镜像,所有不再被任何容器使用的镜像全部删除

    • 不加 –all:只删悬空镜像(标签,构建镜像剩下的垃圾碎片)
    • 加上 –all:范围扩大!所有没被容器使用的镜像全都删掉,包括你自己 pull 下来、有名字有标签,只是现在没有容器在用的镜像。

    –force(简写 -f):跳过交互式确认提示,直接删除,不用手动输入 y 确认

  • 3、nerdctl管理容器

    3.1 ls 查看容器
  • nerdctl container ls(简写 nerdctl ps ):只查看正在运行的容器

  • nerdctl container ls -a(简写 nerdctl ps -a ):查看全部容器(运行+停止Exited)

    参数 -a = all。

  • 常用选项:

    • -a, –all:显示所有容器,默认仅展示正在运行的容器
    • -f, –filter strings:根据指定条件过滤匹配容器
    • –format string:使用 Go 模板格式化输出内容,示例:'{{json .}}'、wide
    3.2 run 创建并运行容器

    语法:nerdctl run [参数] 镜像名 [命令] [参数]

    ​ 等价简写:nerdctl container run

    示例:

    [root@localhost ~]# nerdctl run -it ubuntu

    • -i:保持标准输入打开;-t分配伪终端;组合==-it用于交互式进入容器==。
    • 不加-it启动ubuntu/bash镜像:bash无终端,启动立刻退出,容器状态Exited(0)。
    • 常用参数:
      • –cpu-shares uint:CPU 份额(相对权重,用于 CPU 资源分配)
      • –cpus float:设置可用 CPU 核心数量
      • -d, –detach:后台运行容器,并打印容器 ID
      • –dns strings:自定义 DNS 服务器
      • -e, –env stringArray:设置环境变量
      • -h, –hostname string:设置容器主机名
      • -i, –interactive:保持标准输入打开,即使没有附着终端
      • –ip string:为容器分配 IPv4 地址
      • –mac-address string:为容器指定 MAC 地址
      • -m, –memory string:设置内存资源限制
      • –name string:给容器指定名称
      • –net / –network strings:将容器接入网络,可选模式 bridge / host / none / container:,默认为 bridge 网桥模式
      • –privileged:给容器扩展高级权限
      • –pull string:运行容器前拉取镜像,可选always/missing/never,默认missing(本地没有镜像才拉)
      • –restart string:容器退出时的重启策略,可选no/always/on-failure:n/unless-stopped;默认no
      • –rm:容器退出后自动删除容器
      • –runtime string:为此容器指定运行时
      • –stop-signal string:停止容器使用的信号,默认 SIGTERM
      • –stop-timeout:停止容器的超时时间(单位秒)
      • -t, –tty:分配一个伪终端
      • -v, –volume:挂载数据卷 / 绑定宿主机目录
    3.3 rm 删除容器

    nerdctl container rm 容器ID/容器名

    只能删除停止状态Exited容器;正在运行容器需要加 -f 强制删除:nerdctl rm -f

    3.4 prune 批量清理未运行的容器

    nerdctl container prune –force

    删除所有Exited停止状态容器,–force跳过确认。

    3.5 rename 修改容器名称

    nerdctl container rename 旧名字 新名字

    3.6 stop / start / restart 容器启停
    • nerdctl container stop 容器名:优雅停止运行中的容器
    • nerdctl container start 容器名:启动已经创建、处于停止状态的容器
    • nerdctl container restart 容器名:重启容器(先stop再start)
    3.7 pause / unpause 暂停/恢复容器
    • nerdctl container pause 容器名:暂停容器内所有进程,容器不会停止,只是冻结进程
    • nerdctl container unpause 容器名:解除暂停,恢复容器进程运行
    3.8 kill 强制杀死容器

    nerdctl container kill 容器名 :直接发送SIGKILL信号强制终止容器进程,立刻停止容器。

    3.9 exec 在运行容器内执行命令

    nerdctl container exec -it 容器名 bash

    只能对正在Up运行的容器使用,用来进入容器终端。

    3.10 cp 容器与宿主机之间拷贝文件

    #宿主机文件传到容器
    nerdctl container cp 宿主机路径 容器名:容器内路径
    #容器文件拷贝到宿主机
    nerdctl container cp 容器名:容器内路径 宿主机路径

    3.11 inspect 查看容器详细信息

    nerdctl container inspect 容器名/ID

    输出json,包含容器IP、端口、挂载、状态、命名空间等完整信息。

    3.12 logs 查看容器日志

    nerdctl container logs 容器名

    查看容器控制台输出日志。

    3.13 查看宿主机和容器之间端口映射关系

    nerdctl container port 容器名/ID

    考点:如果容器名称前缀匹配多个容器,会报错multiple IDs found with provided prefix,解决:使用完整容器ID。

    3.14 commit 将容器提交为镜像

    nerdctl container commit 容器ID 新镜像名

    把当前容器的修改,打包生成新镜像。


    考试对比重点(ctr vs nerdctl)
  • ctr:containerd原生客户端,默认default命名空间;创建容器分两步:container create + task start;删除必须先kill task、rm task,再rm container,没有一键强制删除。
  • nerdctl:docker风格客户端,默认moby命名空间;一条run命令直接创建并启动容器;rm -f可以一键强制删除运行容器。
  • 命名空间隔离:不同命名空间资源互相不可见,操作跨命名空间资源,需要用 -n 指定命名空间。


    4、nerdctl 管理网络

    4.1 网络基础原理
  • containerd中的网络与Docker类似,所有网络接口默认都是虚拟接口。
  • 使用nerdctl创建容器时,会自动创建名称为bridge的Linux网桥,网桥内部接口为nerdctl0。
  • 底层使用**Linux虚拟网络技术veth pair(一对虚拟网卡),在宿主机和容器内分别创建虚拟接口,实现两端连通**。
  • containerd预先指定nerdctl0接口的IP地址和子网掩码,宿主机和容器之间依靠网桥互相通信。
  • 4.2 实操案例:查看容器网卡信息
  • 后台启动busybox容器命令:nerdctl run -d busybox — sleep infinity
  • 在这里插入图片描述

    – sleep infinity:容器内执行命令,无限睡眠,让容器保持持续运行不退出。

  • nerdctl container ls:查看正在运行的容器。

  • nerdctl exec 容器名 – ip a:进入容器查看网卡。—-中间一定要空格

    • 容器内网卡格式:eth0@if5,if5代表宿主机端对应的是5号网卡。
  • 宿主机执行ip a查看宿主机网卡。

    • 宿主机veth网卡格式:veth790d9140@if2,if2代表容器内对应的是2号网卡。
  • 宿主机上的nerdctl0网桥就是容器的网关,查看网桥命令:ip addr show nerdctl0

  • 4.3 网络查询相关命令
  • nerdctl network ls:列出所有网络,默认自带bridge、host、none三种网络。

  • nerdctl network inspect bridge:查看bridge网络详细信息,可查看子网subnet、网关gateway。

  • brctl show:查看Linux网桥nerdctl0以及网桥接入的veth端口信息。

    brctl使用前需要安装:

    在这里插入图片描述

  • 4.4 nerdctl network子命令
  • create:创建自定义网络
  • inspect:查看一个或多个网络的详细信息
  • ls:列出所有网络
  • prune:清理所有未被使用的网络
  • rm:删除指定网络
  • –help:查看network模块帮助文档

  • 5、nerdctl管理存储

    5.1 nerdctl volume 子命令
  • create:创建数据卷

  • inspect:查看一个或多个数据卷的详细信息

  • ls:列出所有数据卷

  • prune:删除所有未使用的本地数据卷

  • rm:删除一个或多个数据卷

  • -h, –help:查看volume模块帮助文档

    补充:可以使用nerdctl –help查看全局参数,例如–namespace、–snapshotter、–cgroup-manager

  • 5.2 数据持久化:-v挂载选项
  • nerdctl 创建容器时,使用-v选项,可以**将宿主机本地目录挂载到容器内,实现容器数据持久化**。

  • 示例1:宿主机已有目录挂载

    • mkdir /data 创建宿主机目录
    • nerdctl run -d -v /data:/data busybox — sleep infinity 把宿主机/data挂载到容器/data
    • 在宿主机touch /data/f1,容器内可以查看到f1文件,实现文件共享。
  • 示例2:只写容器内目录,nerdctl自动创建宿主机数据卷

    在这里插入图片描述

    • 数据实际存放路径:/var/lib/nerdctl/xx/volumes/default/xx/_data
  • 示例3:自定义命名的数据卷(推荐写法 卷名:容器内路径)

    在这里插入图片描述

    • 自动创建名为data的数据卷
    • 在容器内touch /data/f3,文件会保存在data卷对应的宿主机目录。

    在这里插入图片描述

  • 5.3 查看数据卷
  • nerdctl volume ls:查看所有数据卷,显示卷名称和宿主机存储目录。
  • 数据卷默认存放路径:/var/lib/nerdctl/…/volumes/default/卷名/_data

  • 6、nerdctl管理命名空间

    6.1 基础说明
  • nerdctl 的 namespace 和 Linux内核namespace、Kubernetes的namespace不是同一个概念。
  • 在这里插入图片描述

  • 命令别名:namespace 可以简写为 ns。

  • 基础语法:nerdctl namespace [flags]

  • 6.2 namespace子命令
  • create:创建新的命名空间
  • inspect:查看一个或多个命名空间的详细信息
  • ls:列出所有containerd命名空间
  • remove:删除一个或多个命名空间
  • update:更新命名空间的标签
  • 6.4 实操示例
  • 查看所有命名空间命令:nerdctl namespace ls
  • 输出字段说明:NAME(命名空间名称)、CONTAINERS(容器数量)、IMAGES(镜像数量)、VOLUMES(数据卷数量)、LABELS(标签)。
  • 默认命名空间名称为default,所有容器、镜像、卷**默认都放在default命名空间**下。

  • 八、crictl 实践

    8.1 crictl命令介绍

  • crictl 是遵循CRI接口规范的命令行工具,用来检查、管理kubelet节点上的容器运行时与镜像。
  • 在**Kubernetes集群中执行kubectl命令时,kubelet代理会自动调用crictl管理镜像和容器。**
  • 手动执行crictl,一般用于直接查看节点上镜像和容器。
  • 8.2 crictl命令安装

  • 配置kubernetes源:编辑/etc/yum.repos.d/kubernetes.repo,写入kubernetes阿里云镜像源配置。
  • 安装软件包:yum install -y cri-tools,cri-tools里面包含crictl工具。
  • 8.3 crictl命令配置

  • 使用crictl前,需要先配置/etc/crictl.yaml文件。

    在这里插入图片描述
    在这里插入图片描述

  • 也可以使用命令行直接设置endpoint

    • crictl config runtime-endpoint unix:///run/containerd/containerd.sock
    • crictl config image-endpoint unix:///run/containerd/containerd.sock
  • 查看config帮助:crictl config –help,可以查看/修改crictl客户端配置项,例如debug、timeout等。

  • 8.4 crictl命令总览(帮助信息)

  • 查看crictl全部子命令,直接输入crictl。
  • 核心子命令分类:容器操作、镜像操作、pod操作、查看版本、日志、资源统计等。
  • 8.5 常用命令分类

  • 镜像命令
    • images / image / img:列出镜像
    • pull:从镜像仓库拉取镜像
    • inspecti:查看镜像详细信息
    • imagefsinfo:查看镜像文件系统信息
    • rmi:删除镜像
  • 容器命令
    • ps:列出容器
    • create:新建容器
    • run:在sandbox内运行新容器
    • inspect:查看容器详细状态
    • info:查看容器运行时信息
    • attach:接入正在运行的容器
    • exec:在运行容器内执行命令
    • logs:获取容器日志
    • update:更新运行中容器配置
    • stats:查看容器资源使用统计
    • checkpoint:容器快照
    • start:启动已创建的容器
    • stop:停止运行的容器
    • rm:删除容器
  • pod命令(K8s的pod沙箱)
    • pods:列出pod
    • runp:运行新pod
    • inspectp:查看pod详情
    • statsp:查看pod资源统计
    • port-forward:端口转发到pod
    • stopp:停止pod
    • rmp:删除pod
  • 其他命令
    • version:查看运行时版本信息
    • config:获取/修改crictl客户端配置
    • completion:生成shell补全代码
    • help / h:查看帮助
  • 8.6 实操案例

  • 拉取镜像:crictl pull 镜像地址
  • 查看本地镜像:crictl images
  • 8.7 命令行对照表(docker/podman/nerdctl/ctr/crictl)

    在这里插入图片描述

  • 重点区别:crictl是面向K8s CRI,有pod(sandbox)相关命令;ctr、nerdctl是containerd原生工具;docker是传统容器工具。
  • 8.8 nerdctl与crictl对比

    nerdctl 和 crictl 都是用于管理和操作容器的命令行工具,但是它们在开发者、设计目的和功能上有所不同。

  • nerdctl
    • 开发者:Akihiro Suda(docker创始人之一,containerd核心贡献者)
    • 设计目标:兼容Docker CLI的containerd CLI,绝大多数docker命令可以直接使用nerdctl执行。
    • 功能:容器生命周期管理、镜像、网络、存储管理。
  • crictl
    • 开发者:Kubernetes社区开发
    • 设计目标:是一个命令行接口,CRI客户端,和所有实现CRI规范的容器运行时交互
    • 功能:主要用于调试,对接CRI接口,管理pod沙箱、容器、镜像,专门适配K8s场景。
  • 总结:nerdctl适合习惯Docker CLI的用户;crictl适合K8s集群调试、排查CRI容器运行时。
  • 补充:可以设置别名alias docker=nerdctl,直接像docker一样使用nerdctl命令。

    rward`:端口转发到pod

    • stopp:停止pod
    • rmp:删除pod
  • 其他命令
    • version:查看运行时版本信息
    • config:获取/修改crictl客户端配置
    • completion:生成shell补全代码
    • help / h:查看帮助
  • 8.6 实操案例

  • 拉取镜像:crictl pull 镜像地址
  • 查看本地镜像:crictl images
  • 8.7 命令行对照表(docker/podman/nerdctl/ctr/crictl)

    [外链图片转存中…(img-yI3D04tK-1789722888467)]

  • 重点区别:crictl是面向K8s CRI,有pod(sandbox)相关命令;ctr、nerdctl是containerd原生工具;docker是传统容器工具。
  • 8.8 nerdctl与crictl对比

    nerdctl 和 crictl 都是用于管理和操作容器的命令行工具,但是它们在开发者、设计目的和功能上有所不同。

  • nerdctl
    • 开发者:Akihiro Suda(docker创始人之一,containerd核心贡献者)
    • 设计目标:兼容Docker CLI的containerd CLI,绝大多数docker命令可以直接使用nerdctl执行。
    • 功能:容器生命周期管理、镜像、网络、存储管理。
  • crictl
    • 开发者:Kubernetes社区开发
    • 设计目标:是一个命令行接口,CRI客户端,和所有实现CRI规范的容器运行时交互
    • 功能:主要用于调试,对接CRI接口,管理pod沙箱、容器、镜像,专门适配K8s场景。
  • 总结:nerdctl适合习惯Docker CLI的用户;crictl适合K8s集群调试、排查CRI容器运行时。
  • 补充:可以设置别名alias docker=nerdctl,直接像docker一样使用nerdctl命令。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 别只懂 Docker!深入容器底层:Containerd 才是幕后大佬
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!