四個(gè)技巧將 Docker 鏡像體積減小 90%
優(yōu)化 Docker 鏡像可以提高構(gòu)建速度、減少鏡像大小、提高安全性和效率。以下是一些優(yōu)化 Docker 鏡像的方法:
使用適當(dāng)?shù)幕A(chǔ)鏡像
選擇合適的基礎(chǔ)鏡像可以減小鏡像大小,并確保基礎(chǔ)鏡像的安全性和更新性。Alpine、Ubuntu Minimal 等輕量級基礎(chǔ)鏡像是常用選擇。
使用多階段構(gòu)建
多階段構(gòu)建是一種有效的優(yōu)化技術(shù),可以在一個(gè)Dockerfile中使用多個(gè)FROM指令,每個(gè)FROM指令都代表一個(gè)構(gòu)建階段。每個(gè)構(gòu)建階段都可以從之前的階段復(fù)制所需的文件,并執(zhí)行特定的構(gòu)建操作。
使用多階段構(gòu)建可以使得最終生成的鏡像只包含運(yùn)行應(yīng)用程序所必需的文件和依賴,而不包含構(gòu)建過程中產(chǎn)生的不必要文件和依賴。以下是一個(gè)多階段構(gòu)建的示例:
# 構(gòu)建階段1
FROM golang:1.17 AS builder
WORKDIR /ap
COPY . .
# 編譯應(yīng)用程序
RUN go build -o myapp
# 構(gòu)建階段2
FROM alpine:latest
# 復(fù)制編譯后的應(yīng)用程序
COPY --from=builder /app/myapp /usr/local/bin/
# 設(shè)置工作目錄
WORKDIR /usr/local/bin
# 容器啟動(dòng)時(shí)運(yùn)行的命令
CMD ["myapp"]在上面的例子中,我們使用兩個(gè)構(gòu)建階段。第一個(gè)構(gòu)建階段使用Golang基礎(chǔ)鏡像來編譯應(yīng)用程序,第二個(gè)構(gòu)建階段使用Alpine Linux基礎(chǔ)鏡像,僅復(fù)制編譯后的應(yīng)用程序,并設(shè)置容器啟動(dòng)時(shí)的命令。
有效使用緩存
當(dāng)構(gòu)建 Docker 鏡像時(shí),Docker 使用緩存來優(yōu)化構(gòu)建過程,避免重復(fù)構(gòu)建不變的層。下面是一個(gè)使用緩存機(jī)制的例子:假設(shè)有一個(gè)簡單的 Node.js 項(xiàng)目,其中有一個(gè) package.json 文件和應(yīng)用代碼文件,例如 app.js。為了構(gòu)建這個(gè)項(xiàng)目的 Docker 鏡像,可以編寫一個(gè) Dockerfile 如下:
# 設(shè)置基礎(chǔ)鏡像
FROM node:14
# 設(shè)置工作目錄
WORKDIR /app
# 將 package.json 復(fù)制到工作目錄
COPY package*.json ./
# 運(yùn)行 npm install 安裝依賴
RUN npm install
# 將應(yīng)用代碼復(fù)制到工作目錄
COPY . .
# 指定容器啟動(dòng)命令
CMD ["node", "app.js"]在這個(gè) Dockerfile 中,我們將 package.json 文件復(fù)制到容器中,并運(yùn)行 npm install 命令來安裝依賴。接著,復(fù)制應(yīng)用代碼到容器,并設(shè)置容器的啟動(dòng)命令。
當(dāng)我們構(gòu)建這個(gè)鏡像時(shí),Docker 使用緩存機(jī)制來盡可能地重用之前構(gòu)建過的層。如果 package.json 文件沒有改變,Docker 將會(huì)重復(fù)使用之前的緩存層,只有當(dāng) package.json 文件發(fā)生變化時(shí)才會(huì)重新運(yùn)行 npm install 這個(gè)命令。
例如,首次構(gòu)建鏡像時(shí),Docker 會(huì)運(yùn)行 npm install 安裝依賴,并創(chuàng)建一個(gè)緩存層。
在后續(xù)構(gòu)建過程中,如果只有 app.js 文件發(fā)生了改變,而 package.json 文件沒有變化,Docker 將會(huì)重用之前的緩存層,直接復(fù)制 app.js 到鏡像中,而無需重新安裝依賴,從而加快構(gòu)建速度。
這種緩存機(jī)制可以大幅提升構(gòu)建速度,特別是在開發(fā)過程中,當(dāng)只有部分文件發(fā)生變化時(shí),Docker 可以重復(fù)使用之前的層而不必重新構(gòu)建整個(gè)鏡像。
多層鏡像構(gòu)建優(yōu)化
多層鏡像構(gòu)建是指在一個(gè)Dockerfile中使用多個(gè)RUN指令來構(gòu)建鏡像。每個(gè)RUN指令會(huì)產(chǎn)生一個(gè)新的鏡像層,而每個(gè)鏡像層都會(huì)占用額外的存儲(chǔ)空間。
為了優(yōu)化多層鏡像構(gòu)建,可以使用&&操作符將多個(gè)命令合并成一個(gè)RUN指令,避免產(chǎn)生額外的鏡像層。同時(shí),在一個(gè)RUN指令中執(zhí)行多個(gè)命令可以減少Docker鏡像的大小。
例如,將多個(gè)apt-get安裝命令合并成一個(gè)RUN指令:
RUN apt-get update && apt-get install -y \
package1 \
package2 \
package3這樣可以將多個(gè)安裝命令合并為一個(gè)鏡像層,減少鏡像大小。






























