关于docker:创建最小化的容器镜像二

126次阅读

共计 2178 个字符,预计需要花费 6 分钟才能阅读完成。

引言

这是无关如何制作最小化 Docker 镜像的第二篇文章,在之前的文章中,我谈到了如何创立最小化的 Docker 镜像,然而能够制作镜像的大小其实是有限度的,我概述了一种使增加到 Docker 镜像中的 layer 层变小的办法,但有时可能无奈做到,兴许须要依照特定的程序运行一些额定的步骤。
比方上面这个例子,须要在两头的步骤中增加一个文件:

RUN ...
ADD some_file /
RUN ...

如果我须要在增加文件之前在第一个 RUN 命令中进行一些解决,而后在第二个 RUN 命令中进行一些清理之前进行更多解决,该怎么办?在这种状况下,很不背运的是,Docker 将在每个命令之后创立一个 layer 层,而且可能还会遇到以下辣手的状况:要应用的根底镜像继承自许多其余镜像,并且每个镜像都增加了本人很大的 layer 层。

Docker Squash

Docker 没有提供一种将运行的命令与 layer 层缓存拆散的办法,实践上这能够做到,但这会导致镜像过大。为了缩小层的数量及其大小,能够像压缩 git commit 一样压缩 layer 层。有一个十分酷的工具称为 docker-squash 能够执行此操作,您能够在作者的原始文章中理解无关此内容的更多信息。

Docker squash 将压缩多个镜像 layer 层,以便删除存储在两头步骤中的所有数据,当遇到上述情况时,这真的很棒,或者说如果你想让 Dockerfile 变得不那么简单,就去试一试吧。

Squashing Python

我想看看是否能够放大 docker hub 上的规范 python:2.7.11 图像,从 Dockerfile 中留神到,首先要革除以后装置的 Debian python,而后再下载并编译本人的版本。然而,因为 Debian python 已蕴含在较早的一层中,因而该空间已被咱们的镜像占用,这些镜像还取决于其余几个 Dockerfile,每个 Dockerfile 都增加了本人的层。让咱们看看通过 squashing 能够节俭多少空间。

首先将 python:2.7.11 的镜像 pull 到本地

$ docker pull python:2.7.11
2.7.11: Pulling from library/python
7a01cc5f27b1: Pull complete
3842411e5c4c: Pull complete
...
127e6c8b9452: Pull complete
88690041a8a3: Pull complete
Digest: sha256:590ee32a8cab49d2e7aaa92513e40a61abc46a81e5fdce678ea74e6d26e574b9
Status: Downloaded newer image for python:2.7.11

能够看到该镜像具备很多层,大小约为 676MB。

$ docker images python:2.7.11
REPOSITORY TAG IMAGE ID CREATED
VIRTUAL SIZE
python 2.7.11 88690041a8a3 2 weeks ago
676.1 MB

docker-squash 不容许压缩本地镜像仓库中的镜像,这点令人讨厌。相同,它要求将镜像导出为文件,接下来持续操作,并创立一个新的 squashed 镜像。

$ docker save python:2.7.11 > python-2.7.11.tar
$ sudo bin/docker-squash -i python-2.7.11.tar -o python-squashed-2.7.11.tar

当初能够看到新文件放大了约 75MB。

~$ ls -lh python-*.tar
-rw-rw-r-- 1 ian ian 666M Feb 15 16:32 python-2.7.11.tar
-rw-r--r-- 1 root root 590M Feb 15 16:33 python-squashed-2.7.11.tar

在将其从新加载到本地镜像仓库中之后,再次查看镜像大小发现小了很多:

$ cat python-squashed-2.7.11.tar | docker load
$ docker images python-squashed
REPOSITORY TAG IMAGE ID CREATED
VIRTUAL SIZE
python-squashed latest 18d8ebf067fd 11 days ago
599.9 MB

Virtual Size

你会留神到,只管 docker 向咱们显示了镜像的“虚构大小”,那是因为 Docker 重用了依赖于雷同层的镜像,就像 git commit 的形式以及批改或 squashing 提交的形式一样,这是一个全新的提交形式,docker-squash 将创立一个蕴含所有内容的全新的独立层。

Docker-squash 容许你通过提供 -from 参数来解决这种状况,此参数的默认值是第一个 FROM 层。下面的状况是这样,因为有许多 FROM 层,所以它可能压缩掉一些不必要的数据,但仍从根底镜像来到该层,通过指定此参数,能够决定要应用哪个根底镜像,这样就不用每次都去下载。

$ docker-squash -from 18d8ebf067fd -i ... -o ...

Docker-squash 不是万能药,但的确为你的工具箱增加了一个工具用于治理 Docker 镜像大小。在接下来的两篇文章中,我将探讨一些其余工具和办法来减小 Docker 镜像的大小。

正文完
 0