如何利用層最佳化Docker映象大小
在本文中,我們將討論多種利用層改進Docker映象大小的方法和技術,包括多階段構建、使用最小化基礎映象以及使用預裝包或預構建二進位制檔案的基礎映象。透過遵循這些最佳實踐,我們可以建立更小、更高效的Docker映象,這些映象針對性能和可擴充套件性進行了最佳化。
Docker分層映象的大小可以透過以下多種方法改進。
方法
使用最小化基礎映象
使用包含預構建二進位制檔案的基礎映象
使用多階段構建
使用包含預安裝包的基礎映象
讓我們用示例來討論這些方法。
使用最小化基礎映象
透過選擇僅包含必要庫和依賴項的基礎映象,可以減小映象的整體大小。例如,使用alpine映象作為基礎映象,而不是使用Ubuntu等功能齊全的基礎映象,可以減小最終映象的大小。
以下是示例的逐步操作方法:
示例
步驟1 - 為您的專案建立一個新目錄並導航到它:
$ mkdir directoryname $ cd directoryname
步驟2 - 在這個新目錄中建立一個名為“Dockerfile”的檔案,內容如下:
FROM alpine:latest RUN apk add --no-cache curl CMD ["curl", "-s", "http://example.com"]
步驟3 - 透過在終端執行以下命令來構建映象:
$ docker build -t alpine-curl
步驟4 - 要檢視最終映象大小,請在終端中執行以下命令:
$ docker images
使用alpine之類的最小化基礎映象時,最終映象大小將明顯更小,因為它僅包含必要的庫和依賴項。
輸出
REPOSITORY TAG IMAGE ID CREATED SIZE alpine-curl latest eecb6a9f6ab7 3 minutes ago 5.56MB
在這個示例中,最終映象大小為5.56MB,這與使用Ubuntu等功能齊全的基礎映象相比要小得多。
使用包含預構建二進位制檔案的基礎映象
一些基礎映象包含預構建的二進位制可執行檔案,這對於無需從頭開始構建即可執行應用程式可能很有用。例如,“node”映象提供了“node”和“npm”可執行檔案的預構建版本,以便無需從原始碼構建即可執行Node.js應用程式。
以下是示例的逐步操作方法:
示例
步驟1 - 為您的專案建立一個新目錄並導航到它:
$ mkdir directoryname $ cd directoryname
步驟2 - 在這個新目錄中建立一個名為“Dockerfile”的檔案,內容如下:
FROM node:latest WORKDIR /app COPY . . RUN npm install CMD ["node", "index.js"]
步驟3 - 透過在終端執行以下命令來構建映象:
$ docker build -t node-app .
步驟4 - 要檢視最終映象大小,請在終端中執行以下命令:
$ docker images
使用包含預構建二進位制檔案的基礎映象可以減少層數和映象的整體大小,因為您無需從原始碼構建可執行檔案。
輸出
REPOSITORY TAG IMAGE ID CREATED SIZE node-app latest c9f6a1be6ee1 3 minutes ago 961MB
在這個示例中,最終映象大小為961MB,其中包括node和npm可執行檔案的預構建版本。
使用多階段構建
透過多階段構建,您可以透過在Dockerfile中使用多個FROM命令來建立具有不同層集的多箇中間映象。然後,您可以僅使用最終應用程式所需的層來構建最終映象,從而減小整體映象大小。
以下是逐步操作示例:
示例
步驟1 - 為您的專案建立一個新目錄並導航到它。
步驟2 - 在這個新目錄中建立一個名為“Dockerfile”的檔案,內容如下:
FROM golang:latest as builder WORKDIR /app COPY . . RUN go build -o main . FROM alpine:latest RUN apk add --no-cache ca-certificates COPY --from=builder /app/main /app/main CMD ["/app/main"]
步驟3 - 透過在終端執行以下命令來構建映象:
$ docker build -t multi-stage-build .
步驟4 - 要檢視最終映象大小,請在終端中執行以下命令:
$ docker images
多階段構建允許您建立多個具有不同層集的中間映象,然後僅使用必要的層來構建最終映象,從而縮小整體映象大小。
輸出
REPOSITORY TAG IMAGE ID CREATED SIZE multi-stage-build latest 0d3b3c0e928f 4 minutes ago 5.57MB
在這個示例中,最終映象大小為5.57MB,與使用golang等功能齊全的基礎映象的單階段構建相比要小得多。
使用包含預安裝包的基礎映象
一些基礎映象可能包含一組預安裝的包,這有助於減少層數和映象的總大小。例如,golang映象包含各種Go包和庫,以便無需手動安裝這些包即可構建Go應用程式。
以下是逐步操作示例:
示例
步驟1 - 為您的專案建立一個新目錄並導航到它。
步驟2 - 在這個新目錄中建立一個名為“Dockerfile”的檔案,內容如下:
FROM golang:latest WORKDIR /app COPY . . RUN go build -o main . CMD ["/app/main"]
步驟3 - 透過在終端執行以下命令來構建映象:
$ docker build -t golang-app .
步驟4 - 要檢視最終映象大小,請在終端中執行以下命令:
$ docker images
使用包含預安裝包的基礎映象可以減少層數和映象的整體大小,因為您無需手動安裝這些包。
輸出
REPOSITORY TAG IMAGE ID CREATED SIZE golang-app latest c45a0c0aec2c 4 minutes ago 824MB
在這個示例中,最終映象大小為824MB,其中包括來自golang映象的預安裝Go包和庫。
結論
在本文中,我們探討了使用層減小Docker映象大小的多種方法。透過使用多階段構建、選擇最小化基礎映象、使用包含預安裝包的基礎映象以及使用包含預構建二進位制檔案的基礎映象,我們可以建立更小、針對性能和效率最佳化的Docker映象。