docker映象最佳化

&UnstopPable發表於2024-07-29

目錄
  • 最佳化原則
  • 使用多階段構建
  • 有效使用快取
  • 多層映象構建最佳化

最佳化原則

(1)使用體積小的Linux映象,比如使用alpine作為基礎映象;
(2)儘可能的清理無用的快取檔案,比如儘可能把多個RUN指令合併,避免產生多個臨時映象;
(3)修改dockerfile的時候,儘可能把修改的內容放在最後,這樣可以充分利用快取映象;
(4)使用".dockerignore"忽略構建docker映象時不需要的檔案,從而減小映象體積;

使用多階段構建

多階段構建是一種有效的最佳化技術,可以在一個Dockerfile中使用多個FROM指令,每個FROM指令都代表一個構建階段。每個構建階段都可以從之前的階段複製所需的檔案,並執行特定的構建操作。
使用多階段構建可以使得最終生成的映象只包含執行應用程式所必需的檔案和依賴,而不包含構建過程中產生的不必要檔案和依賴。
以下是一個多階段構建的示例:

# 構建階段1
FROM golang:1.17 AS builder
  
WORKDIR /ap
COPY . .
  
# 編譯應用程式
RUN go build -o myapp
  
# 構建階段2
FROM alpine:latest
  
# 複製編譯後的應用程式
COPY --from=builder /app/myapp /usr/local/bin/
  
# 設定工作目錄
WORKDIR /usr/local/bin
  
# 容器啟動時執行的命令
CMD ["myapp"]

在上面的例子中,我們使用兩個構建階段。第一個構建階段使用Golang基礎映象來編譯應用程式,第二個構建階段使用Alpine Linux基礎映象,僅複製編譯後的應用程式,並設定容器啟動時的命令

有效使用快取

當構建 Docker 映象時,Docker 使用快取來最佳化構建過程,避免重複構建不變的層。下面是一個使用快取機制的例子:
假設有一個簡單的 Node.js 專案,其中有一個 package.json 檔案和應用程式碼檔案,例如 app.js。為了構建這個專案的 Docker 映象,可以編寫一個 Dockerfile 如下:

# 設定基礎映象
FROM node:14
 
# 設定工作目錄
WORKDIR /app
 
# 將 package.json 複製到工作目錄
COPY package*.json ./
 
# 執行 npm install 安裝依賴
RUN npm install
 
# 將應用程式碼複製到工作目錄
COPY . .
 
# 指定容器啟動命令
CMD ["node", "app.js"]

在這個 Dockerfile 中,我們將 package.json 檔案複製到容器中,並執行 npm install 命令來安裝依賴。接著,複製應用程式碼到容器,並設定容器的啟動命令。
當我們構建這個映象時,Docker 使用快取機制來儘可能地重用之前構建過的層。如果 package.json 檔案沒有改變,Docker 將會重複使用之前的快取層,只有當 package.json 檔案發生變化時才會重新執行 npm install 這個命令。
例如,首次構建映象時,Docker 會執行 npm install 安裝依賴,並建立一個快取層。在後續構建過程中,如果只有 app.js 檔案發生了改變,而 package.json 檔案沒有變化,Docker 將會重用之前的快取層,直接複製 app.js 到映象中,而無需重新安裝依賴,從而加快構建速度。
這種快取機制可以大幅提升構建速度,特別是在開發過程中,當只有部分檔案發生變化時,Docker 可以重複使用之前的層而不必重新構建整個映象。

多層映象構建最佳化

多層映象構建是指在一個Dockerfile中使用多個RUN指令來構建映象。每個RUN指令會產生一個新的映象層,而每個映象層都會佔用額外的儲存空間。
為了最佳化多層映象構建,可以使用&&運算子將多個命令合併成一個RUN指令,避免產生額外的映象層。同時,在一個RUN指令中執行多個命令可以減少Docker映象的大小。
例如,將多個apt-get安裝命令合併成一個RUN指令:

RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    package3

這樣可以將多個安裝命令合併為一個映象層,減少映象大小。

相關文章