首页 » PHP教程 » dockerphp镜像年夜小技巧_看我若何将Docker镜像大年夜小缩减95

dockerphp镜像年夜小技巧_看我若何将Docker镜像大年夜小缩减95

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

作者丨Pavan Kumar

译者 | 崔莹峰

dockerphp镜像年夜小技巧_看我若何将Docker镜像大年夜小缩减95

  编写Dockerfile看起来很随意马虎,除非你终极编写了大小为0.5GB的Docker镜像。
是的,没错。
我最近在做一个ReactJS项目,在那里我正在构建一个前端运用程序。
React JS项目没有什么新鲜的。
我利用了与范例前端运用程序相同的package.json,相同的依赖集。
现在,我决定将运用程序迁移到Kubernetes。
以是我将Docker镜像推送到DockerHub并考试测验在Kubernetes支配Pod。

dockerphp镜像年夜小技巧_看我若何将Docker镜像大年夜小缩减95
(图片来自网络侵删)

  我利用的是一个本地集群,Pod花了5分零7秒启动。
我很惊异。
然后我将其支配到AKS集群(Azure Kubernetes集群)。
令人惊异的是,它花了3分40秒。
这可是件大事。
我考试测验对Pod进行压测以触发Kubernetes HPA(Horizontal Pod Autoscaler)。
新的Pod须要同样的3分钟才能涌现,终极运用程序被太多的要求淹没,不堪重负甚至崩溃不断重启。
经由调查,我创造镜像的大小是瓶颈,当然,你不会想要如此巨大的Docker镜像(0.5GB)。
那时我意识到我必须对Docker镜像大小做些什么。
因此,我利用了Docker多阶段构建的观点。

Docker构建:

FROM node:alpineWORKDIR /appCOPY package.json ./COPY package-lock.json ./COPY ./ ./RUN npm iCMD ["npm", "run", "start"]1.2.3.4.5.6.7.

  这是我最初的一个Dockerfile,它是为一个范例的ReactJS运用程序供应的。
如果你打开查看,你就可以看到第一行代码,我利用了node:alpine作为根本镜像,如下是镜像构建完成后的尺寸。

非多阶段构建

  这是构建镜像的范例方法,编写这样的Docker文件彷佛很随意马虎。
但是从Kubernetes的角度来看,利用这种方法存在一些缺陷如下

  a)镜像的大小直接影响Pod启动韶光。

b)镜像越小,Pod启动越快。

Docker多阶段构建:

  Dockerfile中的多阶段构建特性使你能够创建具有更好缓存和占用更小安全空间的较小容器镜像。
利用多阶段构建,你可以在Dockerfile中利用多个FROM语句。
每个FROM指令可以利用不同的根本镜像,并且每个FROM指令都会开始构建一个新的阶段。
你可以有选择地将一个阶段构建好的内容复制到另一个阶段,对付那些不须要涌如今在终极镜像里的内容就留在上一个阶段好了。

  彷佛不一样?好吧,让我们理解一下这个文件。

# Choose the Image which has Node installed alreadyFROM node:alpine as buildWORKDIR /codeCOPY package.json package.jsonCOPY package-lock.json package-lock.jsonRUN npm ci --production# COPY all the files from Current Directory into the ContainerCOPY . .# Install the Project Dependencies like Express FrameworkRUN npm run buildFROM nginx:1.22-alpine as prodCOPY --from=build /code/build /usr/share/nginx/html# Tell that this image is going to Open a PortEXPOSE 80# Default Command to launch the ApplicationCMD ["nginx", "-g", "daemon off;"]1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

  第一行称为阶段。
这些阶段没有命名,你通过它们的整数来引用它们,从0开始表示第一条FROM指令。
或者,你也可以通过向FROM指令添加AS来命名阶段。

  然后别的的步骤保持不变。
改变游戏规则的一个步骤是COPY——来自(第18行)。
利用多阶段天生时,可以在Docker文件中利用多个FROM语句。
每个FROM指令都可以利用不同的根本镜像,并且每个指令都开始构建一个新的阶段。
你可以有选择地将一个阶段构建好的内容复制到另一个阶段,对付那些不须要涌如今在终极镜像里的内容就留在上一个阶段好了。

  现在让我们开始构建镜像。

多阶段构建镜像尺寸

  哇,是的!
图像大小压缩了95%。
图像大小现在是27.2MB。

  我确当地集群花了25秒来拉取镜像并开始利用。
我的AKS集群花了10秒钟来拉取镜像并开始利用。

  这便是如何利用Docker中的多阶段构建来压缩Docker镜像的大小。

  原文链接:

  ​https://levelup.gitconnected.com/how-i-reduced-the-size-of-my-docker-image-by-95-520a05439300​​

译者简介

  崔莹峰,51CTO社区编辑,一名70后程序员,拥有10多年事情履历,长期从事 Java开拓,架构设计,容器化等干系事情。

来源: 51CTO技能栈

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0