随笔 - 303  文章 - 0  评论 - 3  阅读 - 15万

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的信息。

  

posted on   池塘里洗澡的鸭子  阅读(681)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示