4小时前
|
|
|
想知道如何用最小的 Docker 镜像来托管你的静态网站吗?这篇文章带你一步步探索,从最初的想法到最终的极简方案,让你大开眼界!
### 为什么要做这么小的镜像?
作者一开始觉得用 Docker 来托管静态网站有点“大材小用”,毕竟 Netlify 或 GitHub Pages 这样的服务已经做得很好。但他的个人服务器“有点孤单”,于是就有了这个探索的念头。
### 从 thttpd 到 BusyBox httpd
最开始,作者尝试了 `thttpd`,一个非常小巧的静态文件服务器,最终做到了 **186KB** 的镜像大小。这已经很棒了,但后来有人推荐了 `BusyBox httpd`,它不仅小巧,功能还更丰富,于是作者决定继续深挖。
`BusyBox` 是一个集成了许多常用 Unix 工具的集合,其中就包含了 `httpd` 这个静态文件服务器。用起来很简单,一行命令就能启动:
```bash
busybox httpd -f -v -p 3000
```
这会在当前目录下启动一个服务器,监听 3000 端口,并将日志输出到标准输出。
### 官方 BusyBox 镜像的尝试
作者首先使用了官方的 `busybox` 镜像,构建了一个 **1.25MB** 的镜像。虽然已经很小了,但作者觉得还可以更进一步,因为官方镜像里包含了太多不必要的工具。
### 定制 BusyBox:精简的艺术
要让镜像更小,就需要自己编译一个只包含 `httpd` 功能的 `BusyBox`。这个过程有点技术含量:
1. **下载源码**:获取 `BusyBox` 的源代码。
2. **配置编译**:使用 `make allnoconfig` 生成一个基础配置文件,然后通过 `make menuconfig` 精细地选择只保留 `httpd` 相关的功能,并确保编译成静态二进制文件。
3. **编译安装**:编译并安装 `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,你可以直接拉取使用:
```dockerfile
FROM lipanski/docker-static-website:latest
COPY . .
```
这样,你就能得到一个 **154KB** 的单层镜像,里面只有你的网站内容和运行它的极简服务器。
### 总结
这篇文章用实际行动证明了,用 Docker 高效地打包和托管静态网站是完全可行的。如果你也想让你的静态网站拥有一个超小的 Docker 镜像,不妨试试这个方法!
你对用 Docker 托管静态网站有什么看法?有没有更小的方案?欢迎在评论区分享你的想法!
🫵 来啊,说点有用的废话!
▲