什麼是 docker?
Docker 是一種容器引擎,可以在容器內執行一段程式碼。Docker 映象是在任何地方執行您的應用程式而無需擔心應用程式依賴性的方式。
要構建映象,docker 使用一個名為 Dockerfile 的檔案。Dockerfile 是一個包含許多指令(RUN、COPY、EXPOSE 等)的檔案。成功執行這些命令後,docker 將建立一個映象供我們在任何地方使用。
為什麼要減小 docker 映象大小?
- 安裝不必要的軟體包會增加攻擊面,從而增加安全風險。
- 映象傳輸需要更多時間。
- 部署大映象需要更多時間。
我們必須以某種方式建立我們的 Dockerfile,以便從該 Dockerfile 構建的映象在大小方面得到最佳化。
在本文中,我們將討論 10 種減少 docker 映象大小的有效方法。
1:最小化映象層
我們可以減少 Dockerfile 中的層數。
dockerfile 中的每個 FROM、RUN、COPY 命令都會建立一個單獨的層,並增加映象的整體大小和構建時間。
要減小 docker 映象大小,請在單個 RUN 或 COPY 指令中執行多個命令來最小化 Dockerfile 中的層數。
FROM ubuntu:latest
RUN apt update - y
RUN apt install unzip - y
RUN apt install curl - y
RUN apt install python3 - y
與其對每個命令使用單獨的指令,不如將它們組合起來:
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y && \
apt install curl -y && \
apt install python3 -y
從下圖中可以看出,透過減少層數,可以減少一些 MB 的大小。
2:使用 Docker Squash 減小映象大小
Docker 在構建映象時建立了很多層。壓縮有助於在邏輯層中組織映象。我們可以控制映象的結構,而不是讓映象具有多個不必要的層。
您可以使用以下命令安裝 docker-squash。
pip install docker-squash
您可以執行以下命令來減小映象的大小。
docker-squash image:old -t image:new
3:使用較小的基礎映象
減小 docker 映象大小最明顯的方法是使用較小的基礎映象。
如果希望為 python 應用程式建立映象,請考慮使用 python:3.9-slim 映象而不是 python:3.9。
python:3.9 的大小約為 1.3 GB,而 python:3.9-slim 的大小僅為 1 GB 左右。
您可以使用 alpine 版本進一步減少映象。alpine 映象是專門為作為容器執行而設計的,而且體積非常小。python:3.9-alpine 映象只有 49 MB。
4:使用多階段構建來減小大小
為了顯著減小大小,我們可以使用 docker 多階段構建的概念。這裡我們使用不同的 images/Dockerfile 來構建和打包應用程式碼。
它將 Dockerfile 分成多個階段,並將所需的工件從一個階段傳遞到另一個階段,然後在最後一個階段交付縮小映象大小的最終映象。它顯著減小映象尺寸。
# Official docker build image, Using node:14.17-alpine3.14 image for stage-1.
# Stage-1
FROM node:14.17-alpine3.14 as build
# Copy Required files
COPY public /home/app/public/
COPY src /home/app/src/
# dockerfile install multiple packages
RUN apk add g++ make python2
RUN npm install --silent
# Create Build
RUN npm run build
RUN apk --purge del python2
#Run the build by copying the files form previous stage.
# Stage-2
FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /home/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
這裡我們使用兩個階段從 docker 檔案建立映象。在 Stage-1 中,我們複製程式碼並構建它,在 stage-2 中,我們使用在 stage-1 中構建的程式碼在 Nginx 中執行。
5:apt 安裝中使用 --no-install-recommends 標誌
當我們執行 apt install 命令來安裝某些包時,它會安裝一些不需要的推薦包。使用 --no-install-recommends 標誌可以顯著減小映象大小。
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends
如下圖所示,帶有 new 標籤的映象由於新增了此標誌而減少了 5MB。當我們要安裝多個包時,這將非常有幫助。
您可以在 apk add 命令中新增 --no-cache。
6:在 apt install 命令後新增 rm -rf /var/lib/apt/lists/*
我們可以在 apt install 之後新增這個命令來減少 docker 映象的大小。
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
從上圖中可以看出,我們已將 docker 映象的大小減少了約 41 MB。
7:使用 .dockerignore 檔案
如果您不想將某些檔案複製到 docker 映象,那麼使用 .dockerignore 檔案可以為您節省一些空間。
在構建上下文中有一些隱藏的檔案/資料夾,您可以使用 ADD 或 COPY 命令(如 .git 等)將其傳輸到映象。包含一個 .dockerignore 檔案以減小 docker 映象大小是一個很好的做法。
.dockerignore
檔案示例。
ignorethisfile.txt
logs/
ignorethisfolder/
.git
.cache
*.md
8:在 RUN 之後放置 COPY
在某些情況下,您對程式碼進行了細微的更改,並且需要反覆從 dockerfile 構建映象。
在這種情況下,將 COPY 命令放在 RUN 命令之後將有助於減小映象大小,因為在這種情況下 docker 將能夠更好地使用快取功能。
它將為安裝了依賴項的映象建立快取,每次更改程式碼時,docker 都會使用該快取並建立映象。它還將減少 docker 構建時間。
#Dockerfile-1
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
COPY file /home/ubuntu
#Dockerfile-2
FROM ubuntu:latest
COPY file /home/ubuntu
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
在上述情況下,dockerfile-1 將能夠比 dockerfile-2 表現得更好。
9:安裝後刪除軟體包
如果您需要在 docker 映象中安裝一些包,並且您是從外部下載它們,那麼最好在安裝後刪除這些包。
例如,如果您希望從 zip 檔案安裝 AWS CLI V2,那麼在成功安裝後請記住也刪除該 zip 檔案。
FROM ubuntu:latest
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
sudo ./aws/install && \
rm awscliv2.zip
10:使用 Docker 映象縮容工具
有幾個dockerfile 最佳化工具可以幫助你減少 docker 映象的大小。下面列出了其中一些。
- Dive:Dive 是一個開源工具,用於探索 Docker 映象及其層內容,然後發現縮小 Docker/OCI 映象大小的方法。
https://github.com/wagoodman/dive
- fromlatest.io:此工具將檢查您的 Dockerfile 並檢查可以執行的更多步驟以減小映象大小。
https://www.fromlatest.io/
- Docker Slim:它讓你的容器更好、更小、更安全。您可以使用dockerslim 來最小化容器映象。
https://github.com/slimtoolkit/slim
轉自
10 個最佳化技巧,減少 Docker 映象大小
https://mp.weixin.qq.com/s?__biz=Mzg4NTI1NTYxMw==&mid=2247488246&idx=1&sn=8ddef9a6366c6be9a7bfbbc63c88b0b7&chksm=cfaaee24f8dd6732da39bd7179262a4d44f5a2f646c2e7c7652e56499cc295828d5de7f97ddc&scene=21#wechat_redirect