网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

  作者 | The Agile Crafter

  策划 | 田晓旭

  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 文件等。

  通过将 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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
刚下飞机行李就没了!杭州姑娘花10多万去南极旅游却崩溃:衣物全靠借

刚下飞机行李就没了!杭州姑娘花10多万去南极旅游却崩溃:衣物全靠借

环球网资讯
2026-03-03 08:53:57
森林狼官宣签下李凯尔!改穿12号球衣 穿过3个号码成队史首人

森林狼官宣签下李凯尔!改穿12号球衣 穿过3个号码成队史首人

罗说NBA
2026-03-03 08:06:29
江宁路为何拉起警戒线?高楼玻璃坠落无人员伤亡

江宁路为何拉起警戒线?高楼玻璃坠落无人员伤亡

上观新闻
2026-03-02 20:57:16
黎巴嫩政府首次禁止真主党参与军事活动,为何之前没有禁止?

黎巴嫩政府首次禁止真主党参与军事活动,为何之前没有禁止?

闻号说经济
2026-03-02 21:27:03
英法德即将下场,伊朗被曝寻求向美国妥协

英法德即将下场,伊朗被曝寻求向美国妥协

名人苟或
2026-03-03 06:02:44
伊朗不值得同情!两大国亲手为他搭好擂台,却反手被卖

伊朗不值得同情!两大国亲手为他搭好擂台,却反手被卖

毛豆论道
2026-03-02 17:01:06
救命,国产烂片又刷新下限了

救命,国产烂片又刷新下限了

喵喵娱乐团
2026-02-28 16:41:47
高官确认:伊朗不会退出世界杯!有权参加 在美国踢比赛也没问题

高官确认:伊朗不会退出世界杯!有权参加 在美国踢比赛也没问题

念洲
2026-03-03 06:31:52
伊朗名将:战争很不幸但支持美国以色列!欢迎他们解放伊朗人民

伊朗名将:战争很不幸但支持美国以色列!欢迎他们解放伊朗人民

念洲
2026-03-03 08:44:39
35年前,美国科学家进行实验,4男4女共处一室2年,结果怎么样?

35年前,美国科学家进行实验,4男4女共处一室2年,结果怎么样?

小豫讲故事
2026-03-02 06:00:03
航母“又”被伊朗击沉了?

航母“又”被伊朗击沉了?

太空那些事儿
2026-03-03 08:43:07
谢娜发长文喊话薛之谦:有些话,为了家人,我必须说!

谢娜发长文喊话薛之谦:有些话,为了家人,我必须说!

韩小娱
2026-03-03 09:47:17
中方的努力不应被忽视

中方的努力不应被忽视

新民周刊
2026-03-03 09:08:56
母亲去世后被结婚?当地凌晨通报

母亲去世后被结婚?当地凌晨通报

南方都市报
2026-03-03 09:45:50
伊朗无差别攻击海湾国家  非理性行为恐遭反噬加速失败

伊朗无差别攻击海湾国家 非理性行为恐遭反噬加速失败

刘耘博士
2026-03-03 07:22:10
春节自驾5000公里,我发现了纯电出行的7个BUG

春节自驾5000公里,我发现了纯电出行的7个BUG

新能源前瞻
2026-03-02 19:50:49
上海著名主持人泪目!中东战火下,有人平安返航、有人新婚分离、有人只想回家

上海著名主持人泪目!中东战火下,有人平安返航、有人新婚分离、有人只想回家

上观新闻
2026-03-02 15:27:27
遭受惨烈袭击后,伊朗做了一件“史无前例”的事

遭受惨烈袭击后,伊朗做了一件“史无前例”的事

环球时报国际
2026-03-02 23:59:38
“天下第一村”崩了!从人人千万富翁,到人均欠债1300万?

“天下第一村”崩了!从人人千万富翁,到人均欠债1300万?

趣味萌宠的日常
2026-03-03 01:15:43
诗仙李白“飞流直下三千尺”的盛景重现,合肥西安等地游客专程来“望庐山瀑布”,解锁各类创意打卡姿势

诗仙李白“飞流直下三千尺”的盛景重现,合肥西安等地游客专程来“望庐山瀑布”,解锁各类创意打卡姿势

极目新闻
2026-03-02 21:35:21
2026-03-03 11:11:00
InfoQ incentive-icons
InfoQ
有内容的技术社区媒体
12096文章数 51783关注度
往期回顾 全部

科技要闻

苹果iPhone17e发布:4499元起 升级A19芯片

头条要闻

牛弹琴:多国对轰炸保持沉默 西班牙首相确实是条汉子

头条要闻

牛弹琴:多国对轰炸保持沉默 西班牙首相确实是条汉子

体育要闻

35轮后积分-7,他们遭遇史上最早的降级

娱乐要闻

谢娜霸气护夫:喊话薛之谦给张杰道歉

财经要闻

霍尔木兹海峡近乎停摆 布油直逼80美元

汽车要闻

国民SUV再添一员 瑞虎7L静态体验

态度原创

游戏
健康
教育
旅游
公开课

拒绝类魂!外媒:《红色沙漠》《影之刃零》等领衔变革

转头就晕的耳石症,能开车上班吗?

教育要闻

学期初,谈谈那些容易被忽略的班级常规管理细节

旅游要闻

走,去花田里撒点野!成都郫都蝴蝶村第四届田园菜花季正式定档

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版