自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

看我如何將Docker鏡像大小縮減95%

譯文 精選
開發(fā)
使用Docker多階段構(gòu)建的概念

作者丨Pavan Kumar

譯者 | 崔瑩峰

策劃丨諾亞

  編寫Dockerfile看起來很容易,除非你最終編寫了大小為0.5GB的Docker鏡像。是的,沒錯(cuò)。我最近在做一個(gè)ReactJS項(xiàng)目,在那里我正在構(gòu)建一個(gè)前端應(yīng)用程序。React JS項(xiàng)目沒有什么新鮮的。我使用了與典型前端應(yīng)用程序相同的package.json,相同的依賴集?,F(xiàn)在,我決定將應(yīng)用程序遷移到Kubernetes。所以我將Docker鏡像推送到DockerHub并嘗試在Kubernetes部署Pod。

  我使用的是一個(gè)本地集群,Pod花了5分零7秒啟動(dòng)。我很驚訝。然后我將其部署到AKS集群(Azure Kubernetes集群)。令人驚訝的是,它花了3分40秒。這可是件大事。我嘗試對(duì)Pod進(jìn)行壓測(cè)以觸發(fā)Kubernetes HPA(Horizontal Pod Autoscaler)。新的Pod需要同樣的3分鐘才能出現(xiàn),最終應(yīng)用程序被太多的請(qǐng)求淹沒,不堪重負(fù)以致崩潰不斷重啟。經(jīng)過調(diào)查,我發(fā)現(xiàn)鏡像的大小是瓶頸,當(dāng)然,你不會(huì)想要如此巨大的Docker鏡像(0.5GB)。那時(shí)我意識(shí)到我必須對(duì)Docker鏡像大小做些什么。因此,我使用了Docker多階段構(gòu)建的概念。

Docker構(gòu)建:

FROM node:alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY ./ ./
RUN npm i
CMD ["npm", "run", "start"]

  這是我最初的一個(gè)Dockerfile,它是為一個(gè)典型的ReactJS應(yīng)用程序提供的。如果你打開查看,你就可以看到第一行代碼,我使用了node:alpine作為基礎(chǔ)鏡像,如下是鏡像構(gòu)建完成后的尺寸。

圖片

非多階段構(gòu)建

  這是構(gòu)建鏡像的典型方法,編寫這樣的Docker文件似乎很容易。但是從Kubernetes的角度來看,使用這種方法存在一些缺點(diǎn)如下

  a)鏡像的大小直接影響Pod啟動(dòng)時(shí)間。

      b)鏡像越小,Pod啟動(dòng)越快。

Docker多階段構(gòu)建:

  Dockerfile中的多階段構(gòu)建特性使你能夠創(chuàng)建具有更好緩存和占用更小安全空間的較小容器鏡像。使用多階段構(gòu)建,你可以在Dockerfile中使用多個(gè)FROM語句。每個(gè)FROM指令可以使用不同的基礎(chǔ)鏡像,并且每個(gè)FROM指令都會(huì)開始構(gòu)建一個(gè)新的階段。你可以有選擇地將一個(gè)階段構(gòu)建好的內(nèi)容復(fù)制到另一個(gè)階段,對(duì)于那些不需要出現(xiàn)在在最終鏡像里的內(nèi)容就留在上一個(gè)階段好了。

  似乎不一樣?好吧,讓我們了解一下這個(gè)文件。

# Choose the Image which has Node installed already
FROM node:alpine as build
WORKDIR /code
COPY package.json package.json
COPY package-lock.json package-lock.json
RUN npm ci --production
# COPY all the files from Current Directory into the Container
COPY . .
# Install the Project Dependencies like Express Framework
RUN npm run build
FROM nginx:1.22-alpine as prod
COPY --from=build /code/build /usr/share/nginx/html
# Tell that this image is going to Open a Port
EXPOSE 80
# Default Command to launch the Application
CMD ["nginx", "-g", "daemon off;"]

  第一行稱為階段。這些階段沒有命名,你通過它們的整數(shù)來引用它們,從0開始表示第一條FROM指令?;蛘撸阋部梢酝ㄟ^向FROM指令添加AS來命名階段。

  然后其余的步驟保持不變。改變游戲規(guī)則的一個(gè)步驟是COPY——來自(第18行)。使用多階段生成時(shí),可以在Docker文件中使用多個(gè)FROM語句。每個(gè)FROM指令都可以使用不同的基礎(chǔ)鏡像,并且每個(gè)指令都開始構(gòu)建一個(gè)新的階段。你可以有選擇地將一個(gè)階段構(gòu)建好的內(nèi)容復(fù)制到另一個(gè)階段,對(duì)于那些不需要出現(xiàn)在在最終鏡像里的內(nèi)容就留在上一個(gè)階段好了。

  現(xiàn)在讓我們開始構(gòu)建鏡像。

圖片

多階段構(gòu)建鏡像尺寸

  哇,是的!圖像大小壓縮了95%。圖像大小現(xiàn)在是27.2MB。

  我的本地集群花了25秒來拉取鏡像并開始使用。我的AKS集群花了10秒鐘來拉取鏡像并開始使用。

  這就是如何利用Docker中的多階段構(gòu)建來壓縮Docker鏡像的大小。

  原文鏈接:

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

譯者簡(jiǎn)介

  崔瑩峰,51CTO社區(qū)編輯,一名70后程序員,擁有10多年工作經(jīng)驗(yàn),長(zhǎng)期從事 Java開發(fā),架構(gòu)設(shè)計(jì),容器化等相關(guān)工作。

責(zé)任編輯:張潔 來源: 51CTO技術(shù)棧
相關(guān)推薦

2023-11-06 13:11:22

Docker映像Builkit

2019-07-15 10:00:53

DockerJava容器

2023-12-29 07:04:28

Go項(xiàng)目Docker編寫

2009-02-19 16:59:10

虛擬化VMware虛擬磁盤

2020-08-23 11:52:10

Docker容器技術(shù)

2019-07-15 16:00:24

Docker架構(gòu)容器

2024-11-01 12:10:57

2009-08-26 18:05:25

ViewState持久

2024-01-15 08:59:31

Docker優(yōu)化

2023-02-17 12:07:45

ChatGPTPython

2018-06-12 15:07:57

IT

2011-05-18 14:51:43

2017-01-05 09:18:12

容器Docker

2009-03-04 10:27:50

Provisionin桌面虛擬化Xendesktop

2021-12-22 10:45:56

Docker RegiHarborLinux

2009-08-04 08:34:13

Windows 7系統(tǒng)創(chuàng)新

2015-10-28 14:59:26

JAVA插件Chrome

2011-11-08 15:15:40

路由器復(fù)位

2012-11-07 15:57:34

OSSECMYSQL

2009-06-11 10:50:27

netbeans配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)