# containerd教程 - 3 镜像管理

在 Docker 中,使用 docker images 来进行镜像管理的操作。

在单机 containerd 环境中,可以使用 ctr images 命令管理镜像,ctr 是 containerd 自带的 CLI 命令行工具。

如果在 K8s 中,使用 crictl 来对 containerd 进行操作,使用 crictl images 命令来管理镜像,crictl 是 K8s 中 CRI(容器运行时接口)的客户端,K8s 使用该客户端与 containerd 进行交互,以实现容器的调度和管理。

在使用 ctr images 的时候,可以使用帮助命令查看有哪些命令:

# 查看ctr命令帮助
ctr --help

# 查看ctr images命令帮助
ctr images --help
1
2
3
4
5

关于镜像操作的命令可以使用:ctr imagesctr imagectr i ,这三个命令是一样的,后面镜像的操作,使用这三个都可以。

# 3.1 下载镜像

containerd 支持OCI标准的镜像,所以可以直接使用 Docker 官方或 Dockerfile 构建的镜像。

需要注意 下载镜像的时候,镜像名不能简写,需要写全了。

举个栗子:

下载一个 Nginx 镜像:

ctr images pull docker.io/library/nginx:latest
1
  • ctr images pull :拉取镜像的命令;
  • docker.io/library/nginx:latest :镜像名称,docker.io 表示使用 dockerhub 上的镜像。

上面的命令没有指定系统平台架构,所以默认会下载和当前系统架构一致的镜像。


也可以指定镜像的平台:

# 指定下载支持linux/amd64架构的镜像
ctr images pull --platform linux/amd64 docker.io/library/nginx:latest

# 指定下载支持linux/arm64架构的镜像
ctr images pull --platform linux/arm64 docker.io/library/nginx:latest

# 下载支持所有架构的镜像,这样下载的镜像会比较大
ctr images pull --all-platforms docker.io/library/nginx:latest
1
2
3
4
5
6
7
8

# 3.2 查看镜像

下载完镜像,可以查看本地有哪些镜像,下面的这些命令都可以:

# 查看本地镜像1
ctr images ls

# 查看本地镜像2
ctr image ls

# 查看本地镜像3
ctr i ls

# 查看本地镜像1
ctr images list

# 查看本地镜像2
ctr image list

# 查看本地镜像3
ctr i list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

举个栗子:

其中各个列的含义如下:

  • REF: 这是镜像的引用。它通常包括镜像的名字和标签。例如:docker.io/library/nginx:latest
  • TYPE: 这描述了镜像的类型。
  • DIGEST: 这是镜像内容的哈希值。它是镜像内容的一个唯一标识,确保在多个位置或系统中,只要 DIGEST 相同,那么镜像的内容就是相同的。
  • SIZE: 这是镜像的总大小。
  • PLATFORMS: 这列出了镜像支持的平台。例如,一个镜像可能支持 linux/amd64linux/arm64
  • LABELS: 这列出了与镜像关联的标签。这些标签可以包含各种元数据,如构建日期、版本、描述等。

# 3.3 镜像挂载

如果要查看镜像中包含了哪些内容,我们可以将镜像挂载到指定的目录,然后就可以进入到目录查看镜像中包含哪些内容了。

举个栗子:

当然首先镜像已经下载到本地了,然后执行挂载:

# 将docker.io/library/nginx:latest镜像挂载到/mnt目录
ctr images mount docker.io/library/nginx:latest /mnt
1
2

挂载后,就可以进入到 /mnt 目录查看镜像的内容了:

# 进入mnt目录
cd /mnt

# 查看镜像内容
ls

# 查看nginx首页的内容
cd usr/share/nginx/html
cat index.html
1
2
3
4
5
6
7
8
9

查看完成,可以取消挂载:

# 取消挂载
umount /mnt
1
2

# 3.4 镜像导出

当我们需要备份、迁移或共享镜像给其他人使用的时候,可以将镜像导出为一个文件,然后在其他主机上进行导入。

导出镜像使用 export 命令。

举个栗子:

# 导出docker.io/library/nginx:latest镜像为nginx.img
ctr images export --platform linux/arm64 nginx.img docker.io/library/nginx:latest
1
2
  • ctr images export :导出命令;
  • --platform linux/arm64 :指定导出的架构;
  • nginx.img :导出的镜像文件名称,自己定义;
  • docker.io/library/nginx:latest :指定导出的镜像;

这里有一个坑,如果你拉取镜像的时候,没有指定镜像的架构平台,那么这里你导出的时候,需要指定你当前的架构平台。否则后面导入的时候,可能报错:

ctr: content digest sha256:xxxxxxx: not found
1

如果你一开始拉取镜像的时候,指定的是 --all-platforms,那么这里可以不指定 --platform 参数,也可以指定。

# 3.5 镜像导入

导出的镜像文件,可以使用 import 命令,将文件导入为一个镜像。

举个栗子:

# 将当前路径下的nginx.img镜像文件导入为镜像
ctr images import --platform linux/arm64 nginx.img 
1
2
  • ctr images import :导入命令;
  • --platform linux/arm64 :指定导入的架构;
  • nginx.img :导入当前目录下的镜像文件名称;

如果一开始导出的时候,指定了架构名称,这里导入的时候,需要与之一致,否则可能报错:

ctr: content digest sha256:xxxxxxx: not found
1

需要注意,如果你上面刚导出镜像,现在导入,那么你导入的镜像和之前已经存在的镜像是一样的,导入是看不到的,所以你需要先将本地已经存在的一样的镜像删除。

导入后,可以查看一下:

# 3.6 镜像删除

如果镜像以后不会再使用了,可以将其从本地删除。

在删除之前先查看一下本地的镜像,然后通过镜像的引用 <REF> 来删除,和 docker 有区别,不能通过ID删除。

举个栗子:

# 删除镜像,除了使用rm命令,还可以使用 delete、del、remove、
ctr image rm docker.io/library/nginx:latest
1
2

# 3.7 添加镜像tag

为什么要添加镜像的 tag

主要是为了更好的管理镜像,在之前学习 docker 的时候,我们将镜像上传到远程镜像仓库,都是要先给镜像添加 tag,因为在 tag 中包含了远程镜像仓库的主机地址和项目路径,这样才可以将镜像推送到远程镜像仓库。


首先本地需要有镜像,然后才能修改。

给镜像打 tag ,举个栗子:

# 修改镜像docker.io/library/nginx:latest为harbor.local/my-lib/nginx:latest 
ctr images tag docker.io/library/nginx:latest harbor.local/library/nginx:1.0.0
1
2
  • ctr images tag :给镜像打标签的命令;
  • docker.io/library/nginx:latest :指定镜像;
  • harbor.local 是我自己搭建的一个私有镜像仓库的主机地址,Harbor教程,点这里 (opens new window)library 是 Harbor 中建的一个项目库,nginx:1.0.0 指定镜像名称和 tag。

给镜像打完 tag,会在本地多一个新的镜像,这是这个新的镜像和之前的镜像是一样的,打标签操作只是在本地修改镜像的引用,并不会改变镜像的实际内容:

这样打完标签后,我们后面可以将新 tag 的镜像推送到 harbor.local 远程镜像仓库了。当然这里你需要根据你自己的远程镜像仓库来修改。

这个地方如果有疑问,可以看看 Docker基础教程 (opens new window)Harbor教程 (opens new window)


生成了新的镜像后,我们可以使用 check 命令查看镜像是否有问题:

ctr images check
1

ctr images check 命令主要用于检查容器镜像的完整性和一致性。这个命令可以用来验证镜像是否受损或篡改,以及检查镜像的相关元数据。