衡阳派盒市场营销有限公司

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

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

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

減少docker鏡像大小的方法

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2023-05-15 11:13 ? 次閱讀

在本文中,我們將看到減少 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 的大小。

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

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

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

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

pipinstalldocker-squash

您可以運(yùn)行以下命令來減小鏡像的大小。

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

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í),這將非常有幫助。a0b1eb3e-f18e-11ed-90ce-dac502259ad0.png

您可以在 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/*
a0c5339c-f18e-11ed-90ce-dac502259ad0.png

從上圖中可以看出,我們已將 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 來最小化容器鏡像

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    淺析Docker鏡像本地存儲(chǔ)機(jī)制及容器啟動(dòng)原理

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

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

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

    Docker—簡介與鏡像用法

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

    go項(xiàng)目怎么讓docker鏡像體積減小

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

    go項(xiàng)目怎么讓docker鏡像體積減小

    go 項(xiàng)目怎么讓 docker 鏡像體積減小?本文做了詳細(xì)介紹。
    的頭像 發(fā)表于 06-23 10:49 ?1228次閱讀

    Docker鏡像的詳細(xì)講解

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

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

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

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

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

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

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

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

    在國內(nèi),拉取 Docker 鏡像速度慢/時(shí)不時(shí)斷線/無賬號(hào)導(dǎo)致限流等,比較痛苦. 這里提供加速/優(yōu)化的幾種方法
    的頭像 發(fā)表于 10-19 10:02 ?1.2w次閱讀
    <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 鏡像時(shí),應(yīng)遵循以下原則: 單一職責(zé):每個(gè)鏡像應(yīng)只包含一個(gè)應(yīng)用或服務(wù),避免將多個(gè)應(yīng)用或服務(wù)放在同一個(gè)鏡像中。這樣可以確保鏡像
    的頭像 發(fā)表于 11-23 09:41 ?1104次閱讀

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

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

    Dockerfile鏡像制作與Docker-Compose容器編排

    Dockerfile鏡像制作 docker/podman中, 鏡像是容器的基礎(chǔ),每次執(zhí)行docker run的時(shí)候都會(huì)指定哪個(gè)基本鏡像作為容
    的頭像 發(fā)表于 01-07 11:01 ?161次閱讀
    Dockerfile<b class='flag-5'>鏡像</b>制作與<b class='flag-5'>Docker</b>-Compose容器編排

    Docker-鏡像的分層-busybox鏡像制作

    目錄 知識(shí)點(diǎn)1:鏡像的分層 示例:進(jìn)入 docker hub查看Jenkins的Dockerfile 知識(shí)點(diǎn)2:base鏡像 知識(shí)點(diǎn)3:scratch鏡像 scratch
    的頭像 發(fā)表于 01-15 10:44 ?131次閱讀
    <b class='flag-5'>Docker</b>-<b class='flag-5'>鏡像</b>的分層-busybox<b class='flag-5'>鏡像</b>制作
    蒙特卡罗国际| 缅甸百家乐官网网站是多少| 万宝路百家乐官网的玩法技巧和规则 | 百家乐的玩法技巧和规则| 百家乐官网赢得秘诀| 百家乐筹码防伪定制| 乌苏市| 百家乐斗地主在哪玩| 米脂县| 百家乐信誉平台现金投注| 白城市| 菲律宾百家乐开户| 百家乐官网游戏玩法技巧| 百家乐赢钱面面观| 博马百家乐官网娱乐城| 永利百家乐赌场娱乐网规则| 澳门百家乐官网娱乐城网址| 百家乐合| 玩百家乐官网凤凰娱乐城| 正品百家乐网站| 玩百家乐官网高手支招篇| 旅百家乐赢钱律| 百家乐官网网上娱乐场开户注册 | 云顶国际娱乐| 百家乐平台注册送彩金| 钱百家乐官网取胜三步曲| 百家乐如何骗人| 百家乐官网佛泰阁| 大发888真人娱乐| 百家乐哪条路好| 博九百家乐官网娱乐城| 威尼斯人娱乐城备用地址| 金花百家乐官网的玩法技巧和规则 | 玩百家乐官网怎么能赢吗| 大发888开户注册会员| 百家乐官网专打方法| 新泰市| 太阳百家乐代理| 百家乐官网视频游戏道具| 大发888娱乐场and| 百家乐群博爱彩|