0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

減少docker鏡像大小的方法

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-05-15 11:13 ? 次閱讀

在本文中,我們將看到減少 docker 鏡像大小的方法。

什么是 docker?

Docker 是一種容器引擎,可以在容器內(nèi)運行一段代碼。Docker 鏡像是在任何地方運行您的應(yīng)用程序而無需擔(dān)心應(yīng)用程序依賴性的方式。

要構(gòu)建鏡像,docker 使用一個名為 Dockerfile 的文件。Dockerfile 是一個包含許多指令(RUN、COPY、EXPOSE 等)的文件。成功執(zhí)行這些命令后,docker 將創(chuàng)建一個鏡像供我們在任何地方使用。

為什么要減小 docker 鏡像大???

安裝不必要的軟件包會增加攻擊面,從而增加安全風(fēng)險。

鏡像傳輸需要更多時間。

部署大鏡像需要更多時間。

我們必須以某種方式創(chuàng)建我們的 Dockerfile,以便從該 Dockerfile 構(gòu)建的鏡像在大小方面得到優(yōu)化。

在本文中,我們將討論 10 種減少 docker 鏡像大小的有效方法。

1:最小化鏡像層

我們可以減少 Dockerfile 中的層數(shù)。

dockerfile 中的每個 FROM、RUN、COPY 命令都會創(chuàng)建一個單獨的層,并增加鏡像的整體大小和構(gòu)建時間。

要減小 docker 鏡像大小,請在單個 RUN 或 COPY 指令中執(zhí)行多個命令來最小化 Dockerfile 中的層數(shù)。

FROMubuntu:latest
RUNaptupdate-y
RUNaptinstallunzip-y
RUNaptinstallcurl-y
RUNaptinstallpython3-y

與其對每個命令使用單獨的指令,不如將它們組合起來:

FROMubuntu:latest
RUNaptupdate-y&&
aptinstallunzip-y&&
aptinstallcurl-y&&
aptinstallpython3-y

從下圖中可以看出,通過減少層數(shù),可以減少一些 MB 的大小。

a068d052-f18e-11ed-90ce-dac502259ad0.png

2:使用 Docker Squash 減小鏡像大小

Docker 在構(gòu)建鏡像時創(chuàng)建了很多層。壓縮有助于在邏輯層中組織鏡像。我們可以控制鏡像的結(jié)構(gòu),而不是讓鏡像具有多個不必要的層。

您可以使用以下命令安裝 docker-squash。

pipinstalldocker-squash

您可以運行以下命令來減小鏡像的大小。

docker-squashimage:old-timage:new
a090fcbc-f18e-11ed-90ce-dac502259ad0.png

3:使用較小的基礎(chǔ)鏡像

減小 docker 鏡像大小最明顯的方法是使用較小的基礎(chǔ)鏡像。

如果希望為 python 應(yīng)用程序創(chuàng)建鏡像,請考慮使用 python:3.9-slim 鏡像而不是 python:3.9。

python:3.9 的大小約為 1.3 GB,而 python:3.9-slim 的大小僅為 1 GB 左右。

您可以使用 alpine 版本進一步減少鏡像。alpine 鏡像是專門為作為容器運行而設(shè)計的,而且體積非常小。python:3.9-alpine 鏡像只有 49 MB。

4:使用多階段構(gòu)建來減小大小

為了顯著減小大小,我們可以使用 docker 多階段構(gòu)建的概念。這里我們使用不同的 images/Dockerfile 來構(gòu)建和打包應(yīng)用代碼。

它將 Dockerfile 分成多個階段,并將所需的工件從一個階段傳遞到另一個階段,然后在最后一個階段交付縮小鏡像大小的最終鏡像。它顯著減小鏡像尺寸。

#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;"]

這里我們使用兩個階段從 docker 文件創(chuàng)建鏡像。在 Stage-1 中,我們復(fù)制代碼并構(gòu)建它,在 stage-2 中,我們使用在 stage-1 中構(gòu)建的代碼在 Nginx 中運行。

5:apt 安裝中使用 --no-install-recommends 標志

當我們運行 apt install 命令來安裝某些包時,它會安裝一些不需要的推薦包。使用 --no-install-recommends 標志可以顯著減小鏡像大小。

FROMubuntu:latest
RUNaptupdate-y&&
aptinstallunzip-y--no-install-recommends&&
aptinstallcurl--no-install-recommends-y&&
aptinstallpython3-y--no-install-recommends

如下圖所示,帶有 new 標簽的鏡像由于添加了此標志而減少了 5MB。當我們要安裝多個包時,這將非常有幫助。a0b1eb3e-f18e-11ed-90ce-dac502259ad0.png

您可以在 apk add 命令中添加 --no-cache。

6:在 apt install 命令后添加 rm -rf /var/lib/apt/lists/*

我們可以在 apt install 之后添加這個命令來減少 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/*
a0c5339c-f18e-11ed-90ce-dac502259ad0.png

從上圖中可以看出,我們已將 docker 鏡像的大小減少了約 41 MB。

7:使用 .dockerignore 文件

如果您不想將某些文件復(fù)制到 docker 鏡像,那么使用 .dockerignore 文件可以為您節(jié)省一些空間。

在構(gòu)建上下文中有一些隱藏的文件/文件夾,您可以使用 ADD 或 COPY 命令(如 .git 等)將其傳輸?shù)界R像。包含一個 .dockerignore 文件以減小 docker 鏡像大小是一個很好的做法。

.dockerignore文件示例。

ignorethisfile.txt
logs/
ignorethisfolder/
.git
.cache
*.md

8:在 RUN 之后放置 COPY

在某些情況下,您對代碼進行了細微的更改,并且需要反復(fù)從 dockerfile 構(gòu)建鏡像。
在這種情況下,將 COPY 命令放在 RUN 命令之后將有助于減小鏡像大小,因為在這種情況下 docker 將能夠更好地使用緩存功能。

它將為安裝了依賴項的鏡像創(chuàng)建緩存,每次更改代碼時,docker 都會使用該緩存并創(chuàng)建鏡像。它還將減少 docker 構(gòu)建時間。

#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,那么在成功安裝后請記住也刪除該 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 鏡像縮容工具

有幾個dockerfile 優(yōu)化工具可以幫助你減少 docker 鏡像的大小。下面列出了其中一些。

Dive:Dive 是一個開源工具,用于探索 Docker 鏡像及其層內(nèi)容,然后發(fā)現(xiàn)縮小 Docker/OCI 鏡像大小的方法。

https://github.com/wagoodman/dive

fromlatest.io:此工具將檢查您的 Dockerfile 并檢查可以執(zhí)行的更多步驟以減小鏡像大小。

https://www.fromlatest.io/

Docker Slim:它讓你的容器更好、更小、更安全。您可以使用dockerslim 來最小化容器鏡像。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3198

    瀏覽量

    57356
  • 鏡像
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    10651
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    446

    瀏覽量

    11738

原文標題:10 個優(yōu)化技巧,減少 Docker 鏡像大小

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    怎么構(gòu)建docker鏡像倉庫軟件

    Docker Registry】用docker registry 鏡像搭建私有測試倉庫
    發(fā)表于 08-13 11:03

    如何判斷是否在docker鏡像中?

    實戰(zhàn)中首先需要判斷服務(wù)器是否為docker環(huán)境。常用的判斷方法有兩種。 1、通過執(zhí)行 ls -alh /.dockerenv是否存在.dockerenv文件 docker環(huán)境下存在該文件 非
    發(fā)表于 09-20 07:42

    Docker上的Alpine Linux鏡像建立

    如何建立你自己的Docker鏡像2016-03-18 14:33 Alpine Linux的什么是Docker社區(qū)所鐘愛?輕量級容器意味著更多的計算資源。Alpine Linux的確是輕型
    發(fā)表于 10-12 11:52 ?0次下載

    淺析Docker鏡像本地存儲機制及容器啟動原理

    鏡像各層內(nèi)容及對應(yīng)大小,每層對應(yīng)著 Dockerfile 中的一條指令。Docker 鏡像默認存儲在 /var/lib/docker/《st
    發(fā)表于 10-19 14:17 ?2482次閱讀

    國內(nèi)Docker CE 鏡像源的配置

    阿里云官方鏡像站: https://developer.aliyun.com/mirror/?utm_content=g_1000303593 ? Docker CE 是免費的 Docker 產(chǎn)品
    的頭像 發(fā)表于 11-09 09:16 ?3548次閱讀

    Docker—簡介與鏡像用法

    阿里云官方鏡像站: ??https://developer.aliyun.com/mirror/?utm_content=g_1000303593?? ? 一、容器簡介 Docker是管理容器的引擎
    發(fā)表于 11-25 16:28 ?477次閱讀
    <b class='flag-5'>Docker</b>—簡介與<b class='flag-5'>鏡像</b>用法

    go項目怎么讓docker鏡像體積減小

    【導(dǎo)讀】go 項目怎么讓 docker 鏡像體積減小?本文做了詳細介紹。
    的頭像 發(fā)表于 06-12 15:07 ?1312次閱讀

    go項目怎么讓docker鏡像體積減小

    go 項目怎么讓 docker 鏡像體積減?。勘疚淖隽嗽敿毥榻B。
    的頭像 發(fā)表于 06-23 10:49 ?1097次閱讀

    Docker鏡像的詳細講解

    本文是對 Docker 鏡像的詳細講解,講解了如何安裝 Docker、配置 Docker 鏡像加速以及操作
    的頭像 發(fā)表于 08-02 10:00 ?2021次閱讀

    從零開始學(xué)習(xí)制作、以及使用Tina的Docker編譯鏡像

    學(xué)習(xí)制作、以及使用Tina的Docker編譯鏡像
    的頭像 發(fā)表于 08-28 11:45 ?2122次閱讀
    從零開始學(xué)習(xí)制作、以及使用Tina的<b class='flag-5'>Docker</b>編譯<b class='flag-5'>鏡像</b>

    docker 搜索鏡像,docker查看鏡像詳細信息(docker下載鏡像命令)

    Docker Hub是集中管理的Docker鏡像注冊中心。通過Docker 用戶可以在注冊中心搜索、下載和使用CLI命令行工具中的鏡像。以下
    的頭像 發(fā)表于 07-19 09:46 ?1621次閱讀

    Dockerfile定義Docker鏡像的構(gòu)建過程

    了解Dockerfile Dockerfile 是一個文本文件,用于定義 Docker 鏡像的構(gòu)建過程。它以指令的形式描述了如何構(gòu)建鏡像,從基礎(chǔ)鏡像開始逐步添加配置、文件和依賴,最終形
    的頭像 發(fā)表于 09-30 10:22 ?2382次閱讀

    Docker鏡像國內(nèi)加速的幾種方法

    在國內(nèi),拉取 Docker 鏡像速度慢/時不時斷線/無賬號導(dǎo)致限流等,比較痛苦. 這里提供加速/優(yōu)化的幾種方法。
    的頭像 發(fā)表于 10-19 10:02 ?5635次閱讀
    <b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>國內(nèi)加速的幾種<b class='flag-5'>方法</b>

    構(gòu)建docker鏡像應(yīng)該遵循哪些原則

    構(gòu)建 Docker 鏡像時,應(yīng)遵循以下原則: 單一職責(zé):每個鏡像應(yīng)只包含一個應(yīng)用或服務(wù),避免將多個應(yīng)用或服務(wù)放在同一個鏡像中。這樣可以確保鏡像
    的頭像 發(fā)表于 11-23 09:41 ?851次閱讀

    手動構(gòu)建Docker鏡像方法

    不推薦使用docker commit命令,而應(yīng)該使用更靈活、更強大的dockerfile來構(gòu)建docker鏡像。
    的頭像 發(fā)表于 08-05 15:30 ?250次閱讀
    手動構(gòu)建<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>的<b class='flag-5'>方法</b>