静态 WEB 容器镜像最小化实践
在现代的 B/S 架构应用中,我们会做前后端分离,某些前端 Web 服务会将编译完成的静态文件放到一个 web 服务器进行部署。例如,我的博客也是基于 Hugo 编译的静态文件来进行部署的。
那在容器化部署模式下,我们需要基于一个 web 服务的基础容器(镜像)将静态文件构建成站点或者 Web 服务的容器镜像来进行部署。在 Docker 开发最佳实践中,我们应该尽量保持镜像足够小(Size 大小)。因此,我们应该尽量选择满足我们需求的 web 服务基础镜像足够小。
大部分情况下,我们会选择 Nginx 作为我们的 web 服务器,一开始我也是这么选择的,因为社区在 Docker Hub 上为我们提供了开箱即用的容器镜像,下面来看看我用来构建静态 web 服务的过程。
Nginx On Alpine
我们知道在容器构建的实践中,我们可以选择基于 AlpineLinux 为分发系统的镜像,其比其他(例如 ubuntu, centos 等)的镜像会小很多。因此一开始我们也是选择基于 Alpine 的 nginx 镜像,例如 nginx:1.22-alpine。
可以看到其大小为 23.5MB 。
基于该惊醒构建我的博客的发布镜像
构建出来而最终交付镜像的大小为 29MB 。
Easyhttpd On Alpine
后来,我发现了一个用 GoLang 编写的轻量级 web 服务器 - easyhttpd,于是我 Fork 了该项目,编写了一个 Dockerfile 来构建该 web 服务器的镜像,具体可查看该文件内容。
镜像我已发布在 mengzyou/easyhttpd。
镜像大小为 13.7MB,比 nginx:alpine 的镜像小了十几 MB。使用该镜像构建来构建我的博客站点
得到的应用镜像大小为 19.1MB ,进一步减少了应用的镜像大小。
BusyBox Httpd
最近看到了一个国外的博客文章,可以构建一个只有 ~155KB 大小的 web 服务器镜像,我非常好奇,向着是否可以进一步减少我的静态站点的镜像大小。
是使用了 BusyBox 内置的 httpd 来静态文件提供 web 服务。于是我也学习该作者创建了一个基于 busybox - httpd 的 web 服务器镜像,将其命名为 bbhttpd,具体的构建内容请参考 Github 仓库 - docker-bbhttpd。
构建的镜像我也发布到 Docker Hub - mengzyou/bbhttpd
镜像大小确实只有 155KB,是不是挺惊人的?使用该镜像来构建我的站点
最终的交付镜像大小只有 1.64MB,几乎也就是 web 服务静态文件的大小。
总结
按照 Docker 容器镜像构建的最佳实践,我们应该尽量保持最小的经销大小,而减少镜像大小的一个方法就是选择足够小的基础镜像。因此我们在构建静态 Web 服务的时候,可以通过自己构建基础镜像的方式,大大减少最终的镜像大小。
nginx:1.22-alpne - 23.5MB
mengzyou/easyhttpd:v0.0.1 - 13.7MB
mengzyou/bbhttpd:1.35 - 155KB
同步发布在 Mengz's Blog
版权声明: 本文为 InfoQ 作者【mengzyou】的原创文章。
原文链接:【http://xie.infoq.cn/article/f0c8e78c499e2900ee46635a1】。文章转载请联系作者。
评论