Class)——是一个应用程序。

首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是Docker Hub——docker hub类似maven远程仓库地址(使用maven,均了解maven可以配置本地库也可以配置远程仓库),但是也存在其他镜像仓库服务。拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。

  镜像里是什么呢?

      

docker compose打包镜像 docker如何打镜像_docker compose打包镜像

docker compose打包镜像 docker如何打镜像_docker compose打包镜像_02

       

docker compose打包镜像 docker如何打镜像_Docker_03

OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。

  知道了镜像内部是怎样之后,在本地Docker是如何储存这些镜像的呢?一起看看吧,如下:

      

docker compose打包镜像 docker如何打镜像_docker compose打包镜像_04

   本地存储的镜像数据与层数据在image文件夹中是分库存储的——imagedb保存了本地全部镜像的元数据,同时layer文件夹保存了本地镜像的全部镜像层:

      

docker compose打包镜像 docker如何打镜像_元数据_05

build-time)结构,而容器可以理解为一种运行时(runtime)结构,如下图所示:

      

docker compose打包镜像 docker如何打镜像_元数据_06

  镜像常用的命令如下:(以pull为例示例,官网中都有详细的说明)

pull命令:docker pull | Docker Documentation。默认情况下,镜像会从 Docker Hub 的仓库中拉取。

    参数:  

      

docker compose打包镜像 docker如何打镜像_docker_07

    从docker hub拉取一个镜像比如tomcat,如下:

        

docker compose打包镜像 docker如何打镜像_元数据_08

    可以看到其镜像为多层,如上图红框部分。对于该命令,有两个问题:

如果多个不同的镜像中,同时包含了同一个层,这样重复下载,岂不是导致了存储空间的浪费么?

      实际上,Docker 并不会这么傻会去下载重复的层,Docker 在下载之前,会去检测本地是否会有同样 ID的层,如果本地已经存在了,就直接使用本地的就好了。如上tomcat其中一层提示的是Already exists,就没有重复下载。

, 这种情况咋办?

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 compose打包镜像 docker如何打镜像_docker compose打包镜像_09

      也可以通过Docker Hub Container Image Library | App Containerization可以搜索所需镜像。

    inspect命令:docker inspect | Docker Documentation,最简单查看镜像信息的方法是images,inspect查看镜像详细信息。比如前面说到镜像内容与元数据是分开存储的,那么Docker是如何把这些内容整合然后把一个完整镜像显示在用户眼前的呢?以Nginx镜像为例,使用该镜像与此相关信息(rootfs部分)

        

docker compose打包镜像 docker如何打镜像_docker compose打包镜像_10

       以上可以看到Docker daemon首先通过image的元数据得知全部layer的ID,再根据layer的元数据梳理出顺序,最后使用联合挂载技术还原容器启动所需要的rootfs和基本配置信息。

    history命令:docker history | Docker Documentation,了解一个镜像的历史信息。

        

docker compose打包镜像 docker如何打镜像_docker compose打包镜像_11

    tag命令:docker tag | Docker Documentation

    rmi命令:docker rmi | Docker Documentation

      eg:删除zookeeper镜像

        

docker compose打包镜像 docker如何打镜像_元数据_12

      删除成功后回提示untagged的信息。