Docker 镜像优化:从 1.16GB 到 22.4MB

uniapp 开发微信小程序请求问题 , 真机调试正常,开发工具正常,但是使用扫码预览接口都是不通的,发布到体验版也是请求失败 uniapp开发小程序体验版接口请求失败(真机可以) 阅读详情

作者 | The Agile Crafter

策划 | 田晓旭

来源:架构头条(ID:ArchFront)

Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的。镜像中包含运行应用程序所需的一切(编译后的代码、依赖项、库等等)。镜像使用 Dockerfile 文件定义。

术语 dockerization 或 containerization 通常用于定义创建 Docker 容器的过程。

因为容器具备如下优点,所以很受欢迎:

  • 灵活性:即使是最复杂的应用程序也可以容器化。

  • 轻量化:容器共享主机内核,使得它们远比虚拟机高效。

  • 便携性:可以做到本地编译,到处运行。

  • 松耦合:容器自我封装,一个容器被替换或升级不会打断别的容器。

  • 安全性:容器对进程进行了严格的限制和隔离,而无需用户进行任何配置。

在这篇文章中,我将重点讨论如何优化 Docker 镜像以使其轻量化。

让我们从一个示例开始,在该示例中,我们构建了一个 React 应用程序并将其容器化。运行 npx 命令并创建 Dockerfile 之后,我们得到了如图 1 所示的文件结构。

npx create-react-app app --template typescript

图 1:文件结构

如果我们构建一个基础的 Dockerfile(如下所示),我们最终会得到一个 1.16 GB 的镜像:

FROM node:10
WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build
EXPOSE 3000CMD webserver.local -d ./build

图 2:镜像的初始大小为 1.16GB

第一步优化:使用轻量化基础镜像

在 Docker Hub(公共 Docker 仓库)中,有一些镜像可供下载,每个镜像都有不同的特征和大小。

通常,相较于基于其他 Linux 发行版(例如 Ubuntu)的镜像,基于 Alpine 或 BusyBox 的镜像非常小。这是因为 Alpine 镜像和类似的其他镜像都经过了优化,其中仅包含最少的必须的软件包。在下面的图片中,你可以看到 Ubuntu、Alpine、Node 和基于 Alpine 的 Node 镜像之间的大小比较。

图 3:基础镜像的不同大小

通过修改 Dockerfile 并使用 Alpine 作为基础镜像,我们的镜像最终大小为 330MB:

FROM node:10-alpine
WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build
EXPOSE 3000CMD webserver.local -d ./build

图 4:经过第一步优化后镜像大小为 330MB

第二步优化:多阶段构建

通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不需要的东西。

在本例中,我们部署 React 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。关注公众号 逆锋起笔,回复 pdf,下载你需要的各种学习资料。

通过将 Dockerfile 修改为如下内容,我们最终得到的镜像大小为 91.5MB。请记住,来自第一阶段(第 1-4 行)的镜像不会被自动删除,Docker 将它保存在 cache 中,如果我们在另一个构建镜像过程中执行了相同的阶段,就可以使镜像构建更快。所以你必须手动删除第一阶段镜像。

FROM node:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build

FROM node:10-alpineWORKDIR /appRUN npm install -g webserver.localCOPY --from=build /app/build ./buildEXPOSE 3000CMD webserver.local -d ./build

图 5:第二步优化后的镜像大小为 91.5MB

现在我们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,我们编译项目,在第二个阶段中,我们在 web 服务器上部署应用程序。然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。在本例中,我将使用 Nginx。

通过将 Dockerfile 修改为如下内容,我们的镜像最终大小是 22.4MB,如果我们运行这个容器,我们可以看到网页可以正常工作,没有任何问题(图 7)。

FROM node:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build

FROM nginx:stable-alpineCOPY --from=build /app/build /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]

图 6:第三步优化后的镜像大小为 22.4MB

图 7:最终容器的运行结果

参考链接:

https://docs.docker.com/get-started/

https://docs.docker.com/develop/develop-images/multistage-build/

原文链接:

https://medium.com/the-agile-crafter/docker-image-optimization-from-1-16gb-to-22-4mb-53fdb4c53311

RANSAC地面点分割:从原理到C++实战优化 本文深入解析RANSAC算法在点云地面分割中的原理与C++实战优化,涵盖动态迭代次数、自适应阈值等关键技巧,通过并行计算和内存访问优化提升性能,适用于激光雷达点云处理。 阅读详情

相关推荐

香橙派5B-RK3588-NPU内核升级至0.9.8:RKLLM多模态部署实战

本文详细介绍了香橙派5B-RK3588设备NPU内核升级至0.9.8版本的完整流程,重点讲解了升级的必要性、两种升级方案(预编译包安装与自行编译内核)以及RKLLM SDK的安装配置。通过实战演示多模态模型转换与推理,显著提升AI计算性能,为嵌入式AI部署提供实用指南。

salt9的博客 1027

扩展操作码技术

方法一:固定操作码的设计方式 0000 XXXX YYYY ZZZZ 1111 XXXX YYYY ZZZZ 16条三地址指令 方法二: 可变操作码的设计方法 扩展方式1: 0000 XXXX YYYY ZZZZ 1110 XXXX YYYY ZZZZ 15条三地址指令 1111 0000 XXXX YYYY 1111 1110 XXXX YYYY 15条二地址指令 1111 1111 0000 XXXX 1111 1111 1110 YYYY 15条一地址指令 1111 1111 .

无言月梧桐的博客 7421

【C++】小猫钓鱼纸牌游戏--C++实现

小猫钓鱼问题: 描述:初始,两个人各有n张牌(牌面0-10),顺序固定,只能按顺序出牌。然后,两个人轮流在桌面上以接龙的方式出牌,当某个人放置的牌在桌面上已经出现时,他收起相同牌面及其中间的牌作为自己的筹码,同时需要再放一张牌到桌面。某人手上的牌出完后,另一个人继续出,直到两人手上都没牌为止,输出结束时两个人手上的筹码数。 #include<iostream> using namespace std; struct queue { int head; //队列首 int tail; //

qq_41344430的博客 3202

Docker镜像优化:从1.16GB到22.4MB

点击上方 &#34;编程技术圈&#34;关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文Mad laughter follows the drought of tears...

程序员小乐 553

工业视觉开发者的福音:用C#玩转VisionMaster算子(非方案版完整教程)

本文为工业视觉开发者提供了一份完整的C#与VisionMaster算子二次开发教程,详细介绍了环境配置、算子调用原理、性能优化技巧及实战案例。通过模板匹配和二维码识别等实例,展示了如何高效集成VisionMaster算子到现有框架中,提升工业自动化视觉检测系统的灵活性和性能。

weixin_29280657的博客 271

从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战

本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。

h9j8k7l6m5n的博客 1003

4T的数据库卡死后,没掌握MySQL源码的我后悔莫及…

作者介绍王竹峰, 去哪儿网数据库总监。擅长数据库开发、数据库管理及维护,一直致力于 MySQL 数据库源码的研究与探索,对数据库原理及实现有深刻的理解。曾就职于达梦数据库,从事多年数据库内核开发工作,是 Inception 开源项目及《MySQL运维内参》的作者,MySQL 方向的Oracle ACE 。一、背景最近组内同学遇到一个问题,说数据库被业务打死了,无响应,只好用 kill -9 pid...

yyyy11119的博客 289

Cursor生成JAVA相关的关键词提示规则

你是 Java 编程、Spring Boot、Spring Framework、Maven、JUnit 及相关 Java 技术的专家。在项目根目录创建一个.curstorrules文件(注意有个小数点),之后在该文件内填入下面内容。始终遵循 SOLID 原则,保持高内聚低耦合的 Spring Boot 应用设计。Java 和 Spring Boot 使用规范。Spring Boot 具体规范。

kitonGao的博客 2116

Docker镜像大小优化

如何缩小镜像的体积大小? 1)尽可能的使用小体积的基础镜像 2)尽可能减少Dockerfile文件中的指令数量 3)构建镜像步骤最后添加清空系统和应用程序的缓存的命令 4)使用多级(多阶段)构建 FROM AS 别名 COPY --from 别名

R1chArd_TvT 的 Blog 1463

JAVA:Spring Boot3 集成 Spring AI 实现 Skill 开发

本文介绍了如何通过Spring Boot和Spring AI实现大模型技能(Skill)开发,让AI具备调用业务系统能力。文章首先解释了Skill的概念,即AI可调用的业务能力,如查询订单、天气等,并展示了执行流程和整体架构。然后详细介绍了实践样例,包括技术版本、Maven依赖配置、AI服务设置、ChatClient创建和Skill技能注册中心的实现。注册中心提供了技能的注册、查询、启用/禁用等功能,支持按类别管理技能,并能够获取所有可用技能列表。通过这种方式,开发者可以轻松为大模型扩展业务功能调用能力。

木头 623

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 997

如何优化Docker镜像的大小?

通过使用多阶段构建,可以将编译环境和运行环境分离到不同的构建阶段中,只在最终阶段保留运行环境和必要的文件,从而减小镜像大小。这些文件和数据在构建完成后通常是不需要的,但如果不进行清理,它们会占用镜像的空间,导致镜像体积增大。最后,可以将某个构建阶段的结果作为最终镜像的输出。基础镜像是构建Docker镜像的起点,选择一个合适的基础镜像可以显著减少镜像的大小。指令都会创建一个新的镜像层,过多的层数会增加镜像的复杂性和大小。等,这些镜像通常只包含最基本的操作系统和必要的软件包,可以作为构建自定义镜像的基础。

chengede98的博客 1664

一文搞懂数据标注

数据标注即通过分类、画框、标注、注释等,对图片、语音、文本等数据进行处理,标记对象的特征,以作为机器学习基础素材的过程。简言之,就是需要给数据做好标注,这样机器就能知道学习哪些内容。

女王の专属领地 9944

Docker镜像优化:如何从1.16GB优化到22.4MB

Docker是软件开发者和系统管理员用容器构建、运行和共享应用程序的平台。一个容器是一个运行在隔离环境中、拥有自己的文件系统上的进程;这个文件系统是使用Docker镜像构建的。镜像文件包括...

Docker的专栏 387

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Docker 镜像优化:从1.16GB到22.4MB!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细...

weixin_44421461的博客 189

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Docker镜像优化:从1.16GB到22.4MB!

Docker简介 Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 dock...

关注微信公众号【开源Linux】,后台回复『10T』,领取10T学习资源大放送,涵盖Linux、虚拟化、容器、云计算、网络、Python、Go等书籍和视频 220

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Docker镜像优化:从1.16GB到22.4MB,如何优化

你提到的从 1.16GB 到 22.4MB 的优化,显然是通过一系列技术手段实现的。如果你的应用构建过程中生成了一些临时二进制文件(例如编译后的中间文件),这些可以在构建完成后删除,确保它们不会被包含在最终镜像中。比如,如果只是运行一个简单的应用,尽量避免在镜像中包含复杂的工具链和库。在构建过程中,很多工具会生成临时文件或缓存,这些文件并不需要包含在最终的镜像中。)将大文件压缩后再传递给镜像构建过程,这样可以减小镜像的体积。指令都会创建一个新的镜像层。命令中,可以减少镜像层的数量,从而减少最终的镜像大小。

每日一贴 1123

Docker镜像优化:从1.16GB到22.4MB,真强!

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 3 分钟。来自:猿某某# Docker简介Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用...

良月柒 463

Docker 镜像优化:从 1.16 GB 到 22.4MB!

Docker简介 Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的。镜像中包含运行应用程序所需的一切(编译后的代码、依赖项、库等等)。镜像使用 Dockerfile 文件定义。 术语 dockerization 或 containerization 通常用于定义创建 Docker 容器的过程。 因为容器具备如下优点,所以很受欢迎: 灵活性:即使是最复杂的应用程

Tom_sensen的博客 224

编程语言Docker 镜像优化:从 1.16 GB 到 22.4MB!怎么做到的??

编程语言Docker 镜像优化:从 1.16 GB 到 22.4MB!怎么做到的?? 来源:hello,world_这是一个很随便的名字_优快云博客 Docker简介 Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的。镜像中包含运行应用程序所需的一切(编译后的代码、依赖项、库等等)。镜像使用 Dockerfile 文件定义。 术语 dockerization 或

129

【099期】面试官:Docker 镜像如何优化?从 1.16GB 到 22.4MB!

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方留言必回,有问必答!每天08:08更新文章,每天进步一点点...Docker简介Docker 是一个供软件...

Java精选 295
上一篇: 各种Optimizer梯度下降优化算法回顾和总结
下一篇: 12个神经网络可视化工具,很酷!
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值