写点什么

静态 WEB 容器镜像最小化实践

作者:mengzyou
  • 2022-11-21
    四川
  • 本文字数:1622 字

    阅读完需:约 5 分钟

静态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

docker image pull nginx:1.22-alpine
docker image ls | grep nginxnginx 1.22-alpine 23.5MB
复制代码

可以看到其大小为 23.5MB 。

基于该惊醒构建我的博客的发布镜像

FROM mengzyou/hugo:0.106 AS builderCOPY --chown=hugo:hugo . /home/hugo/appRUN hugo
FROM nginx:1.22-alpineCOPY --from=builder /home/hugo/app/public/ /usr/share/nginx/html
复制代码


docker build -t myblog:nginx .
docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myblogmyblog nginx 29MB
复制代码

构建出来而最终交付镜像的大小为 29MB 。

Easyhttpd On Alpine

后来,我发现了一个用 GoLang 编写的轻量级 web 服务器 - easyhttpd,于是我 Fork 了该项目,编写了一个 Dockerfile 来构建该 web 服务器的镜像,具体可查看该文件内容。

镜像我已发布在 mengzyou/easyhttpd

docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep easyhttpdmengzyou/easyhttpd      v0.0.1  13.7MB
复制代码

镜像大小为 13.7MB,比 nginx:alpine 的镜像小了十几 MB。使用该镜像构建来构建我的博客站点

...FROM mengzyou/easyhttpd:v0.0.1COPY --from=builder --chown=http:www /home/hugo/app/public/ /srv/www
复制代码


docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myblogmyblog  nginx   29MBmyblog  ehttpd  19.1MB
复制代码

得到的应用镜像大小为 19.1MB ,进一步减少了应用的镜像大小。

BusyBox Httpd

最近看到了一个国外的博客文章,可以构建一个只有 ~155KB 大小的 web 服务器镜像,我非常好奇,向着是否可以进一步减少我的静态站点的镜像大小。

是使用了 BusyBox 内置的 httpd 来静态文件提供 web 服务。于是我也学习该作者创建了一个基于 busybox - httpd 的 web 服务器镜像,将其命名为 bbhttpd,具体的构建内容请参考 Github 仓库 - docker-bbhttpd

构建的镜像我也发布到 Docker Hub - mengzyou/bbhttpd

docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep bbhttpdmengzyou/bbhttpd        1.35    155kB
复制代码

镜像大小确实只有 155KB,是不是挺惊人的?使用该镜像来构建我的站点

...FROM mengzyou/bbhttpd:1.35COPY --from=builder --chown=www:www /home/hugo/app/public/ /home/www/html
复制代码


docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myblogmyblog  nginx   29MBmyblog  ehttpd  19.1MBmyblog  bbhttpd 5.64MB
复制代码

最终的交付镜像大小只有 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

发布于: 刚刚阅读数: 3
用户头像

mengzyou

关注

还未添加个人签名 2015-07-29 加入

还未添加个人简介

评论

发布
暂无评论
静态WEB容器镜像最小化实践_DevOps_mengzyou_InfoQ写作社区