# 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
2
3
4
5
关于镜像操作的命令可以使用:ctr images
、ctr image
、ctr i
,这三个命令是一样的,后面镜像的操作,使用这三个都可以。
# 3.1 下载镜像
containerd 支持OCI标准的镜像,所以可以直接使用 Docker 官方或 Dockerfile 构建的镜像。
需要注意 下载镜像的时候,镜像名不能简写,需要写全了。
举个栗子:
下载一个 Nginx 镜像:
ctr images pull docker.io/library/nginx:latest
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
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
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/amd64
或linux/arm64
。 - LABELS: 这列出了与镜像关联的标签。这些标签可以包含各种元数据,如构建日期、版本、描述等。
# 3.3 镜像挂载
如果要查看镜像中包含了哪些内容,我们可以将镜像挂载到指定的目录,然后就可以进入到目录查看镜像中包含哪些内容了。
举个栗子:
当然首先镜像已经下载到本地了,然后执行挂载:
# 将docker.io/library/nginx:latest镜像挂载到/mnt目录
ctr images mount docker.io/library/nginx:latest /mnt
2
挂载后,就可以进入到 /mnt
目录查看镜像的内容了:
# 进入mnt目录
cd /mnt
# 查看镜像内容
ls
# 查看nginx首页的内容
cd usr/share/nginx/html
cat index.html
2
3
4
5
6
7
8
9
查看完成,可以取消挂载:
# 取消挂载
umount /mnt
2
# 3.4 镜像导出
当我们需要备份、迁移或共享镜像给其他人使用的时候,可以将镜像导出为一个文件,然后在其他主机上进行导入。
导出镜像使用 export
命令。
举个栗子:
# 导出docker.io/library/nginx:latest镜像为nginx.img
ctr images export --platform linux/arm64 nginx.img docker.io/library/nginx:latest
2
ctr images export
:导出命令;--platform linux/arm64
:指定导出的架构;nginx.img
:导出的镜像文件名称,自己定义;docker.io/library/nginx:latest
:指定导出的镜像;
这里有一个坑,如果你拉取镜像的时候,没有指定镜像的架构平台,那么这里你导出的时候,需要指定你当前的架构平台。否则后面导入的时候,可能报错:
ctr: content digest sha256:xxxxxxx: not found
如果你一开始拉取镜像的时候,指定的是 --all-platforms
,那么这里可以不指定 --platform
参数,也可以指定。
# 3.5 镜像导入
导出的镜像文件,可以使用 import 命令,将文件导入为一个镜像。
举个栗子:
# 将当前路径下的nginx.img镜像文件导入为镜像
ctr images import --platform linux/arm64 nginx.img
2
ctr images import
:导入命令;--platform linux/arm64
:指定导入的架构;nginx.img
:导入当前目录下的镜像文件名称;
如果一开始导出的时候,指定了架构名称,这里导入的时候,需要与之一致,否则可能报错:
ctr: content digest sha256:xxxxxxx: not found
需要注意,如果你上面刚导出镜像,现在导入,那么你导入的镜像和之前已经存在的镜像是一样的,导入是看不到的,所以你需要先将本地已经存在的一样的镜像删除。
导入后,可以查看一下:
# 3.6 镜像删除
如果镜像以后不会再使用了,可以将其从本地删除。
在删除之前先查看一下本地的镜像,然后通过镜像的引用 <REF>
来删除,和 docker 有区别,不能通过ID删除。
举个栗子:
# 删除镜像,除了使用rm命令,还可以使用 delete、del、remove、
ctr image rm docker.io/library/nginx:latest
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
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
ctr images check
命令主要用于检查容器镜像的完整性和一致性。这个命令可以用来验证镜像是否受损或篡改,以及检查镜像的相关元数据。