Docker镜像及其常用命令
镜像这个词在图形设计领域很好理解,当说把一个图形镜像一下时就像照镜子的效果。在IT领域,作为一名研发人员,则可以将镜像理解为类(Class)——是一个应用程序。
docker镜像呢?首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是Docker Hub——docker hub类似maven远程仓库地址(使用maven,均了解maven可以配置本地库也可以配置远程仓库),但是也存在其他镜像仓库服务。拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。
镜像里是什么呢?Docker应用之创建镜像中通过Dockerfile构建的hello镜像,导出、解压看看这个镜像:
图上如乱码一样的文件夹其实是镜像的一个层(layer)——其包含数据以及必要的元数据(一些Json文件)。镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
知道了镜像内部是怎样之后,在本地Docker是如何储存这些镜像的呢?一起看看吧,如下:
本地存储的镜像数据与层数据在image文件夹中是分库存储的——imagedb保存了本地全部镜像的元数据,同时layer文件夹保存了本地镜像的全部镜像层:
可以把镜像类比为停止运行的容器(类)。实际上,可以停止某个容器的运行,并从中创建新的镜像。在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(runtime)结构,如下图所示:
镜像常用的命令如下:(以pull为例示例,官网中都有详细的说明)
pull命令:docker pull | Docker Documentation。默认情况下,镜像会从 Docker Hub 的仓库中拉取。
参数:
从docker hub拉取一个镜像比如tomcat,如下:
可以看到其镜像为多层,如上图红框部分。对于该命令,有两个问题:
1、如果多个不同的镜像中,同时包含了同一个层,这样重复下载,岂不是导致了存储空间的浪费么?
实际上,Docker 并不会这么傻会去下载重复的层,Docker 在下载之前,会去检测本地是否会有同样 ID的层,如果本地已经存在了,就直接使用本地的就好了。如上tomcat其中一层提示的是Already exists,就没有重复下载。
2、不同仓库中,可能也会存在镜像重名的情况发生, 这种情况咋办?
从严格意义上讲,使用 pull命令时,还需要在镜像前面指定仓库地址(Registry), 如果不指定,则Docker 会使用您默认配置的仓库地址。
以下命令均可通过官网说明操作,后续安装更多软件比如nginx等进行参考:
images命令:docker images | Docker Documentation
save命令:docker save | Docker Documentation,备份镜像
load命令:docker load | Docker Documentation,导入镜像
search命令:docker search | Docker Documentation,搜索镜像
也可以通过Docker Hub Container Image Library | App Containerization可以搜索所需镜像。
inspect命令:docker inspect | Docker Documentation,最简单查看镜像信息的方法是images,inspect查看镜像详细信息。比如前面说到镜像内容与元数据是分开存储的,那么Docker是如何把这些内容整合然后把一个完整镜像显示在用户眼前的呢?以Nginx镜像为例,使用该镜像与此相关信息(rootfs部分)
以上可以看到Docker daemon首先通过image的元数据得知全部layer的ID,再根据layer的元数据梳理出顺序,最后使用联合挂载技术还原容器启动所需要的rootfs和基本配置信息。
history命令:docker history | Docker Documentation,了解一个镜像的历史信息。
tag命令:docker tag | Docker Documentation
rmi命令:docker rmi | Docker Documentation
eg:删除zookeeper镜像
删除成功后回提示untagged的信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)