想知道如何用最小的 Docker 镜像来托管你的静态网站吗?这篇文章带你一步步探索,从最初的想法到最终的极简方案,让你大开眼界!
为什么要做这么小的镜像?
作者一开始觉得用 Docker 来托管静态网站有点“大材小用”,毕竟 Netlify 或 GitHub Pages 这样的服务已经做得很好。但他的个人服务器“有点孤单”,于是就有了这个探索的念头。
从 thttpd 到 BusyBox httpd
最开始,作者尝试了 thttpd,一个非常小巧的静态文件服务器,最终做到了 186KB 的镜像大小。这已经很棒了,但后来有人推荐了 BusyBox httpd,它不仅小巧,功能还更丰富,于是作者决定继续深挖。
BusyBox 是一个集成了许多常用 Unix 工具的集合,其中就包含了 httpd 这个静态文件服务器。用起来很简单,一行命令就能启动:
busybox httpd -f -v -p 3000
这会在当前目录下启动一个服务器,监听 3000 端口,并将日志输出到标准输出。
官方 BusyBox 镜像的尝试
作者首先使用了官方的 busybox 镜像,构建了一个 1.25MB 的镜像。虽然已经很小了,但作者觉得还可以更进一步,因为官方镜像里包含了太多不必要的工具。
定制 BusyBox:精简的艺术
要让镜像更小,就需要自己编译一个只包含 httpd 功能的 BusyBox。这个过程有点技术含量:
- 下载源码:获取
BusyBox的源代码。 - 配置编译:使用
make allnoconfig生成一个基础配置文件,然后通过make menuconfig精细地选择只保留httpd相关的功能,并确保编译成静态二进制文件。 - 编译安装:编译并安装
BusyBox。
在 Alpine Linux 环境下编译,并且只保留必要的 httpd 功能后,BusyBox 的二进制文件大小竟然只有 177KB!如果再进一步精简 httpd 的一些功能(比如去掉 MD5 支持和 CGI),还能压缩到 149KB。
终极方案:Scratch 镜像 + 多阶段构建
最后一步,就是将这个精简过的 BusyBox httpd 二进制文件打包进一个最小的 Docker 镜像——scratch。scratch 镜像什么都没有,就像一张白纸。
通过多阶段构建,我们可以在一个 alpine 阶段编译好 BusyBox,然后将编译好的二进制文件复制到 scratch 镜像中,再加入我们自己的静态网站文件。
最终的 Docker 镜像大小只有 154KB!这个大小包含了 BusyBox httpd 的二进制文件和你自己的静态文件。
现成的镜像,即拿即用
如果你觉得编译过程有点复杂,作者还贴心地将最终的镜像发布到了 Docker Hub,你可以直接拉取使用:
FROM lipanski/docker-static-website:latest
COPY . .
这样,你就能得到一个 154KB 的单层镜像,里面只有你的网站内容和运行它的极简服务器。
总结
这篇文章用实际行动证明了,用 Docker 高效地打包和托管静态网站是完全可行的。如果你也想让你的静态网站拥有一个超小的 Docker 镜像,不妨试试这个方法!
你对用 Docker 托管静态网站有什么看法?有没有更小的方案?欢迎在评论区分享你的想法!
评论 0 条
暂无评论,来种下第一颗种子。