线上 dockerd 版本: Docker version 19.03.12, build 48a66213fe

实验使用的 dockerd 版本:v20.10.9

目的

为了加速容器的启动,docker pull 做为其中的一环,调研一下如何加速 docker pull。

局域网环境问题下,docker pull 里面的解压的时间占了大头。Lz4 的解压速度比当前 Docker 默认的 gzip 要快不少,我们就在 Docker 里面实际测下看效果。

准备 dockerd 编译环境

dockered 项目现在是在 (https://github.com/moby/moby)[https://github.com/moby/moby],我没有找到如何编译,自己瞎试,始终过不去依赖这个坎。

后来老板给了一个(说明文档)[https://github.com/moby/moby/blob/master/docs/contributing/set-up-dev-env.md],才照着搞定了。

不过还是觉得这个依赖环境有点奇怪,不是现在的 go mod 风格,还要把 moby 文件夹映射到 docker/docker 下面。总觉得不太方便。

效果

对一个1.4的文件夹做压缩 (是整个Centos系统的 Overlay2 目录)

gzip: 90秒,680M lz4: 5秒,830M

解压:

root@VMS137224 /tmp/t $ time pigz -c -d a.tar.gz | tar xf -

real    0m7.363s
user    0m8.513s
sys     0m3.739s


root@VMS137224 /tmp/t $  time gunzip -c a.tar.gz | tar xf -

real    0m13.477s
user    0m12.601s
sys     0m3.276s



root@VMS137224 /tmp/t $ time lz4 -d -c a.tar.lz4 | tar -xf -

real    0m4.013s
user    0m1.619s
sys     0m3.276s

Lz4 的效果还是好很多的。省 CPU,少时间。

这里要说明一点的是,这个 Lz4 应该是 C 实现的吧,可能是因为这个,比我们后面 Docker 里面的 Golang 的实现要快。

docker pull 效果

pigz: 下载 5 秒,解压 10 秒。 lz4: 下载 6 秒,解压 9 秒,总时间持平。

看上面 pigz 解压的 real/usr/sys 时间,好像是使用了 2 核 ?反正不会把多核 的 CPU 打满就好了,否则可能会引起 throttle 吧。

结论

lz4 总的时间和 pigz 差不多。但 lz4 还是有更多好处,比如说使用更高压缩率的参数,830M 可以变成730M。可以省下一点时间和宽带(解压时间几乎不变)

但这个没办法推广,因为 (OCI Spec)[https://github.com/opencontainers/image-spec/blob/main/manifest.md] 里面写了,layer mediatype 还没有对 lz4 的支持,只能自己 Hack 玩一下。

对于如何启用 pigz,dockerd 19 是安装好 pigz 之后,重启 dockerd 就好了,重启初始化的时候会检查 pigz 是不是装了。 dockerd 20 是安装好 pigz 就行,不用重启了,它会运行时检查 pigz 是不是装好了,更优秀一些。

另外提一下,虽然 (OCI Spec)[https://github.com/opencontainers/image-spec/blob/main/manifest.md] 里面还没有明确支持 lz4,但也没有明确说不行。 像 dockerd 就会自己检查 layer 是什么压缩格式,而不是看 mediatype 里面的定义(虽然这样不好。。。)

如果没有明确规定,允许实现自己检查压缩格式的话,那我们使用 lz4 压缩,然后使用 application/vnd.oci.image.config.v1+json 好像也行。但兼容性可能无法保证。