Redian新闻
>
Docker镜像优化:从1.16GB到22.4MB!

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

公众号新闻

Docker简介

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

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

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

  • 灵活性:即使是最复杂的应用程序也可以容器化。
  • 轻量化:容器共享主机内核,使得它们远比虚拟机高效。
  • 便携性:可以做到本地编译,到处运行。
  • 松耦合:容器自我封装,一个容器被替换或升级不会打断别的容器。
  • 安全性:容器对进程进行了严格的限制和隔离,而无需用户进行任何配置。

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

优化过程

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

npx create-react-app app --template typescript

如果我们构建一个基础的 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

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

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

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

通过修改 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


第二步优化:多阶段构建

通过多阶段构建,我们可以在 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-alpineWORKDIR /app
RUN npm install -g webserver.local
COPY --from=build /app/build ./build
EXPOSE 3000
CMD webserver.local -d ./build

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

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

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;"]


链接:update.blog.csdn.net/article/details/112816434

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
硬核观察 #942 Docker Hub 将删除所有没有付钱的开源组织的镜像“虚伪” 的 Docker 开始清退开源组织,不付费就删除所有镜像!Jenkins+Docker 实现一键自动化部署项目!步骤齐全,少走坑路谷歌镜像,谷歌学术镜像音视频业务挑战与优化实践,MXPlayer在线播放优化,数据分析与播放器优化Desktop(Ryzen 5 1600/16gram/rtx2070super/256gssd/2t hdd)美国档案--1914年庚款学生李岗Linux 桌面终于迎来了 Docker Desktop 可喜可贺!探秘 Docker 容器化技术黑科技 CgroupsK8s 弃用 Docker!一文介绍 containerd ctr、crictl 使用【Locker Room】春季了,你不运动一下吗?快来lockerroom 看看吧!靠云原生上岸大厂,这198个Docker、K8s核心知识点总结不容错过!| 极客时间[评测]Netac Z RGB DDR5-8000 32GB(2x16GB) C38 评测[评测]ASUS GeForce RTX 4080 16GB GDDR6X Noctua OC Edition 评测膜拜!阿里内部爆款K8s+Docker+Jenkins实战笔记,真的太详细了!月薪 5w+,2023 懂点 K8s/Docker 真的太有必要了!| 极客时间【Locker Room】LOL联赛?篮球全明星?Lockerroom有什么新活?圣诞雪鞋健行Stakes High as China’s Game Makers Gamble on Overseas Markets摩洛哥自助游体会:可行吗?图文并茂,阿里内部爆款K8s+Docker+Jenkins实战笔记部署太慢,我们用 Warm Docker 容器将速度提高了 5 倍Docker正在淘汰开源组织,CTO硬刚开发者,网友:想赚钱可以,但沟通方式烂透了[评测]HOF Pro D5-8000 32GB(16GBx2) C36 评测美国斯坦福大学,美丽校园MySQL适合运行在Docker中吗?Docker“认错”Swagbucks 倒赚:注册 Rocket Money 并连接任意银行账户可获得 $15 奖励【01/05:又有了】首销 3699 元,荣耀推出 MagicBook X 14 2023 笔记本 16GB+512GB 版本Docker “认错”Docker 翻脸,不再开源!里斯本National Pantheon 国家万神殿,17世纪建筑iPhone XS 64gb gold unlocked battery health 77%现在不懂K8s/Docker真的不行了!一文吃透K8s/Docker架构与核心技术 | 极客时间MSI nVidia Geforce GTX 1660 Super AERO ITX OC 6GB
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。