写点什么

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

  • 2020-12-31
  • 本文字数:1354 字

    阅读完需:约 4 分钟

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

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 /app

COPY app /app

RUN npm install -g webserver.local

RUN npm install && npm run build

 

EXPOSE 3000

CMD webserver.local -d ./build



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


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


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


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



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


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


FROM node:10-alpine

 

WORKDIR /app

COPY app /app

RUN npm install -g webserver.local

RUN npm install && npm run build

 

EXPOSE 3000

CMD webserver.local -d ./build


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


第二步优化:多阶段构建


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


在本例中,我们部署 React 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。


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


FROM node:10-alpine AS build

WORKDIR /app

COPY app /app

RUN npm install && npm run build

 

 

FROM node:10-alpine

WORKDIR /app

RUN npm install -g webserver.local

COPY --from=build /app/build ./build

EXPOSE 3000

CMD 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 build

WORKDIR /app

COPY app /app

RUN npm install && npm run build

 

 

FROM nginx:stable-alpine

COPY --from=build /app/build /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]



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



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


参考



原文链接:


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


2020-12-31 16:444229

评论 2 条评论

发布
用户头像
在构建GO服务镜像过程中,我用到了UPX,能将镜像处理到6M大小
2021-01-01 21:16
回复
用户头像
即使已经做了如此多的优化,但仅仅一个react的前端应用,都需要22MB的硬盘空间,虽然目前硬盘不值钱,但这个资源也是有点大啊。。。
2020-12-31 18:20
回复
没有更多了
发现更多内容

K8s 灰度发布实战:通过 Ingress 注解轻松实现流量分割与渐进式发布

电子尖叫食人鱼

Kubernetes 容器

TiDB 可观测性最佳实践

观测云

TiDB

程序员如何用AI工具实现“快速验证原型”

飞算JavaAI开发助手

隐私计算技术创新与应用实践|隐语开源社区 Meetup 成都站

隐语SecretFlow

隐私计算 数据隐私计算

呼声超高的 TiDB 性能调优最佳实践来啦,这些“绝招”让你事半功倍!5 月 29 日,TiDB vs MySQL 线上 Meetup 第四期,欢迎 TiDBer 们参与!转发海报参与 TiDB Chaos Mesh 马克杯抽奖!

TiDB 社区干货传送门

MySQL 数据库 SQL优化 TiDB

实力 “出圈”:龙蜥新增多个行业标杆,富滇银行、小红书、国网蒙东电力等在列

OpenAnolis小助手

操作系统 龙蜥社区 OpenAnolis

SEO的关键词研究与优化 一

溪抱鱼

前端开发 Google SEO 前端开发框架

手把手教学 3 小时用 AI 生成 Spring Boot 用户管理模块全流程

飞算JavaAI开发助手

一文搞懂国际化:架构设计

量贩潮汐·WholesaleTide

架构 国际化

龙蜥大讲堂浪潮信息专场精彩预告来袭,解锁AI解决方案、安全、eBPF等技术新进展

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥大讲堂 OpenAnolis

普通程序员如何用 AI 工具实现薪资翻倍?方法论 + 工具实操

飞算JavaAI开发助手

企业级私有化部署,内部聊天软件

BeeWorks

即时通讯 IM 私有化部署 企业级应用

局域网视频会议软件BeeWorks Meet

BeeWorks

即时通讯 IM 私有化部署 局域网视频软件

iVX 引领软件开发进入 “可视化逻辑时代”

代码制造者

45分钟从零搭建私有MaaS平台和生产级的Qwen3模型服务

GPUStack

大模型 模型推理 Qwen GPU集群 Qwen3

国内首个「混合推理模型」Qwen3深夜开源,盘点它的N种对接方式!

王磊

SEO的关键词研究与优化 二

溪抱鱼

SEO SEO 优化

怎么用drawio一键生成图表?drawio必备的使用技巧盘点!

职场工具箱

人工智能 drawio 办公软件 AIGC Ai绘图

云交易技术对接全景

京东科技开发者

点面结合发展 龙蜥社区第 32 次运营委员会会议圆满结束

OpenAnolis小助手

开源 操作系统 龙蜥社区 OpenAnolis

Java 开发效率天花板被打破!飞算 JavaAI 如何做到「代码生成即生产级」?

飞算JavaAI开发助手

Taro on Harmony :助力业务高效开发纯血鸿蒙应用

京东科技开发者

Msty一键搞定:让Qwen3带着知识库在你的电脑上奔跑

JustYan

人工智能 本地部署 RAG知识库 Qwen3

飞算Java AI提示词优化实战:三步让代码生成效率提升300%

飞算JavaAI开发助手

企业SD-WAN组网必看:需要准备哪些设备?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SD-WAN厂家

自己写插件-实现时间戳自由

京东科技开发者

谷歌云 | AI驱动医疗健康变革:智能代理、增强搜索与关键平台深度解读

Cloud Ace 云一

人工智能 生命科学 谷歌云 健康医疗

AI编程工具“幻觉”风险与飞算JavaAl的破局之道

飞算JavaAI开发助手

企业有远程办公网络需求?试试Ogcloud的SD-WAN方案!

Ogcloud

远程办公 SD-WAN SD-WAN组网 异地组网 远程组网

告别加班!AI 代码生成工具实战:从零搭建一个电商订单系统

飞算JavaAI开发助手

飞算 JavaAI 助力开发者快速原型验证

飞算JavaAI开发助手

Docker镜像优化:从1.16GB到22.4MB_架构_The Agile Crafter_InfoQ精选文章