1.4 镜像的管理

【必知必会】了解镜像的命名及导入、导出镜像。

前面讲了要想创建容器,必须有镜像,本节主要讲解镜像的管理。

1.4.1 镜像的命名

一般情况下,镜像是按如下格式命名的。

如果没有指定tag,则tag默认为latest,比如192.168.26.101/cka/centos:v2,再比如hub.c.163. com/library/mysql:latest。分类也可以不写,比如docker.io/nginx:latest。

在把镜像上传(push)到仓库时,镜像必须按这种格式命名,因为仓库地址就是由镜像前面的IP决定的。如果只是在本机上使用镜像,可以随意命名。

在vms100上查看当前系统有多少个镜像。

在vms101上查看有多少个镜像,可以通过crictl images和nerdctl images命令来查看(现在crictl和nerdctl是在同一个命名空间里的)。

1.4.2 对镜像重新做标签

如果想给本地已经存在的镜像起一个新的名称,可以用tag来做,语法如下。

tag之后,新的镜像名和旧的镜像名是同时存在的。

nerdctl打标签的语法如下。

第1步 给镜像做新标签。

这里是为Nginx重新做个tag,名称为192.168.26.102/cka/nginx:v1。

第2步 再次查看镜像。

可以看到,对某镜像做了标签之后,看似是两个镜像,其实对应的是同一个(这类似于Linux里硬链接的概念,一个文件两个名称而已),镜像ID都是一样的。删除其中一个镜像是不会删除存储在硬盘上的文件的,只有把IMAGE ID所对应的所有名称全部删除,文件才会从硬盘上删除。

1.4.3 删除镜像

如果要删除镜像,需要按如下语法来删除。

nerdctl删除镜像的语法如下。

比如下面要把192.168.26.102/cka/nginx:v1删除。

第1步 删除镜像。

可以看到,这只是简单的一个Untagged操作,并没有任何的Deleted操作。

第2步 查看镜像。

可以看到,f9c14fe76d50对应的本地文件依然是存在的,因为它(ID为f9c14fe76d50)有两个名称,现在只是删除了一个名称而已,所以在硬盘上仍然是存在的。

只有删除最后一个名称,本地文件才会被删除。

第3步 删除镜像。

1.4.4 查看镜像的层结构

我们所用的镜像都是从网上下载下来的,它们在制作过程中都是一点点修改、一步步做出来的。如果要看某镜像的这些步骤,可以使用docker history命令,语法如下。

在nerdctl里查看镜像的结构,语法如下。

查看hub.c.163.com/library/centos这个镜像的结构。

其中,CMD定义的是,使用此镜像生成的容器默认运行的进程为/bin/bash。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。

1.4.5 导出镜像

有一些服务器无法连接到互联网,所以无法从互联网上下载镜像。在没有配置私有仓库的情况下,如何把现有镜像传输到其他机器上呢?这时就需要把本地已经pull下来的镜像导出为一个本地文件,这样就可以很容易地传输到其他机器上。导出镜像的语法如下。

在nerdctl里导出镜像的语法如下。

先查看当前目录里的内容。

第1步 把docker.io/nginx:latest导出为nginx.tar。

使用nerdctl导出docker.io/nginx:latest。

如果要导出多个镜像,语法如下。

不可以使用如下方式。

第2步 导出所有的镜像。

在nerdctl里导出所有的镜像。

第3步 删除所有的镜像。

在nerdctl里删除所有的镜像。

第4步 查看现有镜像。

在nerdctl里查看现有镜像。

1.4.6 导入镜像

既然上面已经把镜像导出为一个文件了,那么我们就需要把这个文件导入,语法如下。

在nerdctl里导入镜像的语法如下。

第1步 在vms100上导入镜像。

第2步 在vms101上用nerdctl导入镜像。