Docker系列之镜像瘦身(五)

本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小,温馨提示:文中大图均可点击放大查看详细信息。

缓存(cache)

Docker的优势之一在于提供了缓存,加速镜像迭代构建,我们知道构建镜像使用docker build命令,也就是说通过docker build的缓存机制实现了镜像的复用,不仅节省镜像存储空间,也为镜像构建节省了大量时间。

 

Docker会由上至下逐步执行Dockerfile中的指令,按顺序执行每个指令,在检查每条指令时,Docker在其缓存中查找现有的中间图像,可能会重用而不是创建新的中间图像,如果缓存无效,则使其无效的指令和后续所有Dockerfile指令都会重新生成新的中间镜像。一旦缓存失效,就可以使用Dockerfile中的其余指令,所以从Dockerfile的顶部开始,如果基础映像(父镜像)已经在缓存中,则重用。然后继续执行下一条指令与从该基础图像导出的高速缓存中所有子镜像进较,比较每个缓存的中间镜像以查看指令是否找到并缓存是否命中,如果高速缓存未命中,则高速缓存无效,如此重复执行以上过程,最终到达Dockerfile的末尾。大多数新指令只是与中间镜像中的指令进行比较,如果匹配,则使用缓存副本。比如,当在Dockerfile中执行RUN pip install -r test.txt指令时,Docker会在其本地缓存的中间图像中搜索相同的指令,但是旧的和新的test.txt文件中的内容不会进行比较。如果我们使用新软件包更新test.txt文件并使用RUN pip install指令希望使用新软件包名称重新运行软件包安装,如果是这种情况可能会出现问题。同时呢,ADD和COPY与其他Docker指令不同,ADD和COPY指令需要Docker查看文件中的内容以确定是否存在缓存命中,Docker将会引用文件内容的校验和与现有中间图像中的校验和进行比较,如果文件内容或元数据已更改,则缓存无效。

 

从如上我们对Dokcer缓存机制的大致讲解,若我们对指令进行了更改,那么该指令的后续每一层可能会经常重建,所以为了更好的利用缓存,我们需要将可能需要更改的指令尽可能的放在比较低的位置。当我们在构建镜像时我们可以指定参数(--no-cache=true)来关闭缓存。当我们需要更新源时,我们通过链式调用apt-get-update和apt-get-install来避免缓存丢失问题。

 

在Docker中我们可以通过命令来监控文件镜像和容器文件大小,我们知道 docker container ls 命令查看容器列表, docker container ls -s 则可以查看容器大小,如下:

Docker系列之镜像瘦身(五)

为了查看镜像构建中中间镜像历史记录,使用命令 docker image history imagename:tag ,为了更清晰看到镜像中每一层的内容,我们可以使用库https://github.com/wagoodman/dive,比如我们上一节所构建的镜像为webapi。我们安装完dive库后,然后查看镜像中的每一层,通过如下命令。

docker run --rm -it \ -v /var/run/docker.sock:/var/run/docker.sock \ quay.io/wagoodman/dive:latest \ webapi:latest

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjzzj.html