在本文中,我們將看到減少 docker 鏡像大小的方法。
什么是 docker?
Docker 是一種容器引擎,可以在容器內(nèi)運(yùn)行一段代碼。Docker 鏡像是在任何地方運(yùn)行您的應(yīng)用程序而無需擔(dān)心應(yīng)用程序依賴性的方式。
要構(gòu)建鏡像,docker 使用一個(gè)名為 Dockerfile 的文件。Dockerfile 是一個(gè)包含許多指令(RUN、COPY、EXPOSE 等)的文件。成功執(zhí)行這些命令后,docker 將創(chuàng)建一個(gè)鏡像供我們?cè)谌魏蔚胤绞褂谩?/p>
為什么要減小 docker 鏡像大小?
安裝不必要的軟件包會(huì)增加攻擊面,從而增加安全風(fēng)險(xiǎn)。
鏡像傳輸需要更多時(shí)間。
部署大鏡像需要更多時(shí)間。
我們必須以某種方式創(chuàng)建我們的 Dockerfile,以便從該 Dockerfile 構(gòu)建的鏡像在大小方面得到優(yōu)化。
在本文中,我們將討論 10 種減少 docker 鏡像大小的有效方法。
1:最小化鏡像層
我們可以減少 Dockerfile 中的層數(shù)。
dockerfile 中的每個(gè) FROM、RUN、COPY 命令都會(huì)創(chuàng)建一個(gè)單獨(dú)的層,并增加鏡像的整體大小和構(gòu)建時(shí)間。
要減小 docker 鏡像大小,請(qǐng)?jiān)趩蝹€(gè) RUN 或 COPY 指令中執(zhí)行多個(gè)命令來最小化 Dockerfile 中的層數(shù)。
FROMubuntu:latest RUNaptupdate-y RUNaptinstallunzip-y RUNaptinstallcurl-y RUNaptinstallpython3-y
與其對(duì)每個(gè)命令使用單獨(dú)的指令,不如將它們組合起來:
FROMubuntu:latest RUNaptupdate-y&& aptinstallunzip-y&& aptinstallcurl-y&& aptinstallpython3-y
從下圖中可以看出,通過減少層數(shù),可以減少一些 MB 的大小。
2:使用 Docker Squash 減小鏡像大小
Docker 在構(gòu)建鏡像時(shí)創(chuàng)建了很多層。壓縮有助于在邏輯層中組織鏡像。我們可以控制鏡像的結(jié)構(gòu),而不是讓鏡像具有多個(gè)不必要的層。
您可以使用以下命令安裝 docker-squash。
pipinstalldocker-squash
您可以運(yùn)行以下命令來減小鏡像的大小。
docker-squashimage:old-timage:new
3:使用較小的基礎(chǔ)鏡像
減小 docker 鏡像大小最明顯的方法是使用較小的基礎(chǔ)鏡像。
如果希望為 python 應(yīng)用程序創(chuàng)建鏡像,請(qǐng)考慮使用 python:3.9-slim 鏡像而不是 python:3.9。
python:3.9 的大小約為 1.3 GB,而 python:3.9-slim 的大小僅為 1 GB 左右。
您可以使用 alpine 版本進(jìn)一步減少鏡像。alpine 鏡像是專門為作為容器運(yùn)行而設(shè)計(jì)的,而且體積非常小。python:3.9-alpine 鏡像只有 49 MB。
4:使用多階段構(gòu)建來減小大小
為了顯著減小大小,我們可以使用 docker 多階段構(gòu)建的概念。這里我們使用不同的 images/Dockerfile 來構(gòu)建和打包應(yīng)用代碼。
它將 Dockerfile 分成多個(gè)階段,并將所需的工件從一個(gè)階段傳遞到另一個(gè)階段,然后在最后一個(gè)階段交付縮小鏡像大小的最終鏡像。它顯著減小鏡像尺寸。
#Officialdockerbuildimage,Usingnode:14.17-alpine3.14imageforstage-1. #Stage-1 FROMnode:14.17-alpine3.14asbuild #CopyRequiredfiles COPYpublic/home/app/public/ COPYsrc/home/app/src/ #dockerfileinstallmultiplepackages RUNapkaddg++makepython2 RUNnpminstall--silent #CreateBuild RUNnpmrunbuild RUNapk--purgedelpython2 #Runthebuildbycopyingthefilesformpreviousstage. #Stage-2 FROMnginx:stable-alpine COPYnginx.conf/etc/nginx/conf.d/default.conf COPY--from=build/home/app/build/usr/share/nginx/html EXPOSE80 CMD["nginx","-g","daemonoff;"]
這里我們使用兩個(gè)階段從 docker 文件創(chuàng)建鏡像。在 Stage-1 中,我們復(fù)制代碼并構(gòu)建它,在 stage-2 中,我們使用在 stage-1 中構(gòu)建的代碼在 Nginx 中運(yùn)行。
5:apt 安裝中使用 --no-install-recommends 標(biāo)志
當(dāng)我們運(yùn)行 apt install 命令來安裝某些包時(shí),它會(huì)安裝一些不需要的推薦包。使用 --no-install-recommends 標(biāo)志可以顯著減小鏡像大小。
FROMubuntu:latest RUNaptupdate-y&& aptinstallunzip-y--no-install-recommends&& aptinstallcurl--no-install-recommends-y&& aptinstallpython3-y--no-install-recommends
如下圖所示,帶有 new 標(biāo)簽的鏡像由于添加了此標(biāo)志而減少了 5MB。當(dāng)我們要安裝多個(gè)包時(shí),這將非常有幫助。
您可以在 apk add 命令中添加 --no-cache。
6:在 apt install 命令后添加 rm -rf /var/lib/apt/lists/*
我們可以在 apt install 之后添加這個(gè)命令來減少 docker 鏡像的大小。
FROMubuntu:latest RUNaptupdate-y&& aptinstallunzip-y--no-install-recommends&& aptinstallcurl--no-install-recommends-y&& aptinstallpython3-y--no-install-recommends&& rm-rf/var/lib/apt/lists/*
從上圖中可以看出,我們已將 docker 鏡像的大小減少了約 41 MB。
7:使用 .dockerignore 文件
如果您不想將某些文件復(fù)制到 docker 鏡像,那么使用 .dockerignore 文件可以為您節(jié)省一些空間。
在構(gòu)建上下文中有一些隱藏的文件/文件夾,您可以使用 ADD 或 COPY 命令(如 .git 等)將其傳輸?shù)界R像。包含一個(gè) .dockerignore 文件以減小 docker 鏡像大小是一個(gè)很好的做法。
.dockerignore文件示例。
ignorethisfile.txt logs/ ignorethisfolder/ .git .cache *.md
8:在 RUN 之后放置 COPY
在某些情況下,您對(duì)代碼進(jìn)行了細(xì)微的更改,并且需要反復(fù)從 dockerfile 構(gòu)建鏡像。
在這種情況下,將 COPY 命令放在 RUN 命令之后將有助于減小鏡像大小,因?yàn)樵谶@種情況下 docker 將能夠更好地使用緩存功能。
它將為安裝了依賴項(xiàng)的鏡像創(chuàng)建緩存,每次更改代碼時(shí),docker 都會(huì)使用該緩存并創(chuàng)建鏡像。它還將減少 docker 構(gòu)建時(shí)間。
#Dockerfile-1 FROMubuntu:latest RUNaptupdate-y&& aptinstallunzip-y--no-install-recommends&& aptinstallcurl--no-install-recommends-y&& aptinstallpython3-y--no-install-recommends&& rm-rf/var/lib/apt/lists/* COPYfile/home/ubuntu
#Dockerfile-2 FROMubuntu:latest COPYfile/home/ubuntu RUNaptupdate-y&& aptinstallunzip-y--no-install-recommends&& aptinstallcurl--no-install-recommends-y&& aptinstallpython3-y--no-install-recommends&& rm-rf/var/lib/apt/lists/*
在上述情況下,dockerfile-1 將能夠比 dockerfile-2 表現(xiàn)得更好。
9:安裝后刪除軟件包
如果您需要在 docker 鏡像中安裝一些包,并且您是從外部下載它們,那么最好在安裝后刪除這些包。
例如,如果您希望從 zip 文件安裝 AWS CLI V2,那么在成功安裝后請(qǐng)記住也刪除該 zip 文件。
FROMubuntu:latest RUNcurl"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"-o"awscliv2.zip"&& unzipawscliv2.zip&& sudo./aws/install&& rmawscliv2.zip
10:使用 Docker 鏡像縮容工具
有幾個(gè)dockerfile 優(yōu)化工具可以幫助你減少 docker 鏡像的大小。下面列出了其中一些。
Dive:Dive 是一個(gè)開源工具,用于探索 Docker 鏡像及其層內(nèi)容,然后發(fā)現(xiàn)縮小 Docker/OCI 鏡像大小的方法。
https://github.com/wagoodman/dive
fromlatest.io:此工具將檢查您的 Dockerfile 并檢查可以執(zhí)行的更多步驟以減小鏡像大小。
https://www.fromlatest.io/
Docker Slim:它讓你的容器更好、更小、更安全。您可以使用dockerslim 來最小化容器鏡像。
-
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3292瀏覽量
57911 -
鏡像
+關(guān)注
關(guān)注
0文章
170瀏覽量
10801 -
Docker
+關(guān)注
關(guān)注
0文章
492瀏覽量
11961
原文標(biāo)題:10 個(gè)優(yōu)化技巧,減少 Docker 鏡像大小
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論