上一篇技术总结,我们使用常用的Docker命令创建了容器,并在容器中搭建了Nginx环境、部署了一个静态网页,并成功在宿主机中访问容器中的静态网页,以及使用浏览器在宿主机映射容器的端口上访问到相关静态页面。
PS:本篇中的操作均在之前搭建好的CentOS 7的VMware虚拟机中。

通过之前的学习,我们充分了解了容器的原理及操作。而对于容器而言,其最核心的部分就是Image镜像了,所以本篇我们来学习操作镜像的相关知识。
在开始之前,我们先回顾一下Docker镜像的相关基础知识:
Docker Image镜像是一种使用“联合加载”技术实现的、“层叠”的只读文件系统,它是容器构建的基石:

Docker镜像存储在/var/lib/docker下,我们进入之前安装有Docker的虚拟机中,首先查看一下docker版本:

可以看到,截止发文之前,我使用的是docker的18.06.1-ce,由于不同版本中iamge存放的位置会有所偏差,所以阅读博文的童鞋要注意一下自己安装的docker版本。

使用ls命令,查看一下在var/lib/docker文件夹下有什么文件(这里使用的是root账户,非root账户需使用sudo权限):

我们的镜像文件存储在“image”文件夹下,我们打开该文件夹:

我们可以看到docker在image存储了镜像的相关信息(目前为3个镜像,后面使用images可以验证)。

回顾了镜像的相关知识和存储位置,我们来学习在docker的命令行和接口中来操作这些镜像。

一、列出镜像

(1)指令介绍
列出所有docker中已有的镜像指令:

docker iamges [OPTIONS] [REPOSITORY]

其中[OPTIONS]为相关操作选项,一种有4种:
-a --all=false  显示所有镜像,默认不显示中间层的镜像。
-f --filter=[]  显示镜像时的过滤条件
--no-trunc=false 是指定不使用“截断”的形式来显示数据(默认情况下,使用image命令查到镜像的唯一ID是会被截断的)
-q --quiet=false 只显示镜像的唯一ID

(2)使用指令
下面我们使用images命令查看我们在docker中安装了哪些镜像:

可以看到,当前虚拟机中的docker安装了3个镜像,列头中的REPOSITORY、TAG、IMAGE ID、CREATED以及SIZE分别代表了“镜像所属的仓库名”、“镜像的标签名”、“镜像的唯一ID”、“镜像建立的时间”以及“镜像建立的大小”。
我们可以看到,列表中有“debian”、“centos”、“hello-world”三种REPOSITORY仓库名。
然后TAG都是“latest”最新的,值得注意的是,IAMGE ID为镜像的唯一ID,但此处是被截断的,完整的ID位于前面我们提到的/var/lib/docker/image/overlay2/imagedb/content/sha256下的镜像文件名:

下面我们来详细讨论一下REPOSITORY与TAG。
①REPOSITORY 仓库
REPOSITORY是一系列镜像的集合。一个仓库包含的是一系列关联的镜像,例如centos,它就是一个大的仓库,下面的不同镜像对应的操作系统的不同版本。这里和我们之前讲到的docker组件中的仓库(REGIDTRY)有很大区别。我们之前降到的仓库REGIDTRY提供的是docker镜像的存储服务。它们之间的关系其实就是,REGIDTRY仓库包含了很多REPOSITORY仓库,而在REPOSITORY的仓库中,包含的是一个一个独立的镜像。

②TAG 镜像标签
在仓库中,不同的镜像是以标签的形式来区分的。一个REPOSITORY仓库名+TAG标签名,就构成了一个完整的镜像名,如:
centos:7.02、ubuntu:14.04、debian:latest
这个镜像名就会对应一个镜像的ID。
我们之前在运行镜像时,通常只是指定了centos,并没有指定后面的TAG标签名,在这种情况下,docker会默认使用“latest”标签所对应的镜像。

(3)使用“--no-trunc”查看完整的imageID
我们之前直接使用docker images,查看到的imageID是被截取的,那么我们使用“--no-trunc”参数就可以查看完整的imageID:

可以看到这里显示了完整的iamgeID,和之前我们在镜像存储文件夹/var/lib/docker/image/overlay2/imagedb/content/sha256中看到的文件夹名完全一致。

(4)使用“-a”查看所有的镜像

可以看到这里依然列出了三种镜像,这是因为我虚拟机中暂时没有中间层镜像。当我们使用“-a”指令的时候,会将中间层镜像展示出来,这些镜像是没有REPOSITORY与TAG的。

(5)使用“-q”仅查看所有镜像的imageID

可以看到这里仅列出了docker中所有镜像的iamgeID

(6)通过镜像名搜索相关的镜像
在docker images后添加镜像名称即可查询相关镜像的信息(非模糊查询):

(7)使用inspect命令查看镜像的详细信息
之前我们曾经使用inspect来查看容器的详细信息。所以,inspect命令及支持容器的查看,也支持镜像的查看。有关镜像查看的命令格式如下:

docker inspect [OPTIONS] CONTAINER|IMAGE[CONTAINER|IMAGE...]|

其中[OPTIONS]为相关操作选项,操作有:
-f --format="" 格式化查询结果
而后面可以跟镜像的【REPOSITORY仓库名+TAG标签名】,或镜像的ID来查看
这里我们可以查看“centos”的相关镜像详细信息(这里使用centos:latest查看):

二、删除镜像
docker中删除镜像使用rmi命令:

docker rmi [OPTIONS] IMAGE[IMAGE...]

其中[OPTIONS]为相关操作选项,操作有:
-f --force=false 强制删除镜像(无需询问)
--no-prune=false 保留被删除镜像中未打标签的父镜像

●删除单个镜像
当我们删除单个镜像时,可以在rmi后跟镜像的【REPOSITORY仓库名+TAG标签名】,如:
docker rmi centos:latest
●删除相同iamgeID的多TAG镜像
如果我们需要删除相同iamgeID,但TAG的不同的多个镜像,只需在rmi后直接跟这些镜像的imageID即可:
docker rmi 75835a67d134
这样就可以删除所有该iamgeID的镜像。
●删除多个完全不同的镜像
我们可以在rmi后面列出需要删除的镜像的【REPOSITORY仓库名+TAG标签名】或imageID,以空格连接:
docker rmi centos:7.02 ubuntu:14.04
docker rmi 75835a67d134 4ad67hsdk86s
●删除批量镜像
rmi命令并没有删除批量镜像的命令,但是我们可以在“$()”包裹查询表达式,通过表达式的结果来批量删除镜像。
这里我们需要利用刚才使用的“通过镜像名搜索相关的镜像”(docker images 镜像名)指令来删除相关信息:
docker rmi $(docker images -q centos)
使用“-q”意味着只返回镜像的ID,所以上面的指令会删除所有仓库名为“centos”的镜像。


三、总结

本次学习了:
(1)列出镜像:docker images
(2)镜像标签和仓库:REPOSITORY、TAG
(3)查看镜像:docker inspect
(4)删除镜像:docker rmi

后面将为大家继续介绍docker镜像的获取和推送。

参考资料:
《极客学院Docker学习》教学视频

转载请注明出处https://blog.csdn.net/acmman/article/details/84449092

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐