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

news2024/11/23 13:18:26

在现代的B/S架构应用中,我们会做前后端分离,某些前端Web服务会将编译完成的静态文件放到一个web服务器进行部署。例如,我的博客也是基于Hugo编译的静态文件来进行部署的。

那在容器化部署模式下,我们需要基于一个web服务的基础容器(镜像)将静态文件构建成站点或者Web服务的容器镜像来进行部署。在Docker开发最佳实践中,我们应该尽量保持镜像足够小(Size大小)。因此,我们应该尽量选择满足我们需求的web服务基础镜像足够小。

static-webserver-container

大部分情况下,我们会选择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 nginx
nginx    1.22-alpine    23.5MB

可以看到其大小为 23.5MB

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

FROM mengzyou/hugo:0.106 AS builder
COPY --chown=hugo:hugo . /home/hugo/app
RUN hugo

FROM nginx:1.22-alpine
COPY --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 myblog
myblog  nginx   29MB

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

Easyhttpd On Alpine

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

镜像我已发布在mengzyou/easyhttpd。

$ docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep easyhttpd
mengzyou/easyhttpd      v0.0.1  13.7MB

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

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

$ docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myblog
myblog  nginx   29MB
myblog  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 bbhttpd
mengzyou/bbhttpd        1.35    155kB

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

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

docker image ls --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myblog
myblog  nginx   29MB
myblog  ehttpd  19.1MB
myblog  bbhttpd 5.64MB

最终的交付镜像大小只有 1.64MB,几乎也就是web服务静态文件的大小。

总结

按照Docker容器镜像构建的最佳实践,我们应该尽量保持最小的经销大小,而减少镜像大小的一个方法就是选择足够小的基础镜像。因此我们在构建静态Web服务的时候,可以通过自己构建基础镜像的方式,大大减少最终的镜像大小。

基础镜像nginx:1.22-alpnemengzyou/easyhttpd:v0.0.1mengzyou/bbhttpd:1.35
Size23.5MB13.7MB155KB

同步发布在 Mengz’s Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js:什么是编译时和运行时

编译时 源代码编译为机器可执行的二进制码。 编译过程中一般会识别你代码中的语法错误等问题,这个错误就叫编译时错误,做的一些检查也叫做编译时类型检查或者静态类型检查,因为静态就意味着代码还没有放到内存里去运行,只是把代…

九.STM32F030C8T6 MCU开发之电源掉电数据保存案例

九.STM32F030C8T6 MCU开发之电源掉电数据保存案例 0.总体功能概述 使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。 1.掉电数据保存背景 掉电保存数据的时间内 电源稳定。也就是数据保存时间要尽量短,电源稳定要尽量长。 第一种,采用备用电池的方法来实现,增加了电池和更…

DFS搜索和输出所有路径

文章目录1、DFS搜所有路径2、用栈记录和输出路径3、例题3.1 C代码3.2 Python代码4、真题4.1 C代码4.2 Python代码2022.12将出版蓝桥杯大赛用书《蓝桥杯大赛-程序设计竞赛专题挑战教程》,作者:蓝桥杯组委会、罗勇军。   这本书解析了蓝桥杯大赛的常见考…

PLC学习笔记(二):PLC结构(1)

目录: PLC学习笔记(一):概述 PLC学习笔记(二):PLC结构(1) PLC学习笔记(三):PLC结构(2) 🦁&…

嵌入式FreeRTOS学习十一,深入理解任务调度机制

一.任务调度机制 可抢占:高优先级的任务先运行时间片轮转:同优先级的任务轮流执行空闲任务礼让:如果有同是优先级为0的其他就绪任务,空闲任务主动放弃一次运行机会函数调用vTaskDelay( xDelay5ms )可以主动放弃任务执行&#xff…

大学物理·第8章【电磁感应、电磁场】

from now on, 以后的篇幅我都不会写太多了。因为效果也不一定有,还很浪费时间。 感应电动势 那个奥特曼变身器的符号是 磁链 看看划线公式即可 动生电动势:dξ vB dl 例 如果,到时候复习的时候觉得简单的话,就删掉好了 自感、互…

【HTML5】登录页面制作简易版

刚开始学习Java。文件的命名,讲道理应该以英文为主,但是英语又不好,所以只好用拼音,最痛苦的应该算是那些英语又不好,又想秀一下的程序员,一半英语一半拼音,如mainFangFa~~~你说看了糟心不糟心。…

山东大学线性代数-1-矩阵-1

目录 1.2 几种特殊的矩阵 1.2.1 方阵 1.2.2 零矩阵 1.2.3 对角矩阵 1.2.4 单位矩阵 1.2.5 数量矩阵 1.2.6 三角阵 1.2.7 梯形阵 1.3 矩阵的运算(一) 1.3.1 相等 1.3.2 加、减法 1.3.3 数乘 1.3.4 矩阵的乘法 1.4 矩阵的运算(二&#x…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.18 查询文档

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.18 查询文档4.18.1 查询文档4.18.2 小结4.18.3 总…

山东大学线性代数-3-n维向量

目录 3.1 n维向量及其线性运算 3.1.1 n维向量的概念 3.1.2 向量的相等 3.1.3 n维向量的线性运算 3.1.4 线性组合 3.1.5 向量组的等价 3.2 向量组的线性相关性 3.2.1 线性相关性的定义 3.2.2 特殊情形的线性相关性 3.3 相关性的判定及有关重要结论 3.3.1 线性相关与…

[MQ] SpringBoot使用直连交换机Direct Exchange

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

Bootstrap-栅格实例(二)

栅格实例 进入官网 选择3.0的中文文档: 选择组件: 选择缩放图: 选择这个,复制代码: 把代码拷贝到,新创建的模板固定container里面: 删除靠过来的多余的row: 修改div的calss&…

【信息奥赛实训】Week1——STL 与基础数据结构专题训练

【信息奥赛实训】Week1-Lab-STL 作者|Rickyの水果摊 时间|2022年11月20日 实训概要 实训专题 STL 与基础数据结构专题训练 实训目的 掌握STL常用的算法、容器、容器适配器的使用方法。能够利用STL的算法、容器、容器适配器求解问题。 题目列表 A&…

HTML小游戏9 —— 潜行游戏《侠盗罗宾汉》(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知…

紫外线杀菌器

一、概述 紫外线杀菌器是利用波长为225-275nm的紫外线对微生物的杀灭而使水中菌类得以净化。当水流经消毒仪时,高强度杀菌作用的紫外线即将水中细菌杀灭。本产品彻底解决了饮用水二次污染细菌超标问题,同时也适用于饮料、食品、游泳池等用水的消毒处理。…

Linux基本指令——综合操作

bc指令bc指令其实就是Linux下的计算器Ctrl c退出也可以通过管道进行输出。bc命令并不常用,主要是见见。uname -r指令语法:uname [选项]作用:uname可以用来获取电脑或者操作系统的相关信息。选项:-a或–all 详细输出所有信息&…

ConsulManager安装

地址 地址: https://github.com/starsliao/ConsulManager使用yum部署consul 在这里可以直接使用yum安装部署consul这个组件 # 使用yum部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.re…

(续)SSM整合之springmvc笔记(RESTful之RESTful案例)(P148-153)

目录 RESTful案例 一 . 准备工作 1 . 准备实体类 2 .准备dao模拟数据 3. 创建控制层EmployeeController 二 功能清单 三 . 具体功能:查询所有员工数据 ①控制器方法 ②创建employee_list.html RESTful案例 一 . 准备工作 和传统CRUD 一样,…

【前沿技术RPA】 一文了解UiPath 通过Invoke Method 和 Invoke Code增强自动化功能

🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。 🐬个人主页:会敲键盘的肘子 🐰系列专栏:UiPath 🦀专栏简介:UiPath在传统的RPA(Robotic…

[附源码]Python计算机毕业设计_旅游系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…