日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

做Docker Image的一些技巧

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-07-22 10:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近做了一個(gè)好玩的工具,叫xbin.io[1]。其中有一項(xiàng)工作是為不同的工具來(lái)構(gòu)建 Docker 鏡像,讓他們都運(yùn)行在 Docker 中(實(shí)際上,是兼容 Docker image 的其他 sandbox 系統(tǒng),沒(méi)有直接用 Docker)。支持的工具越來(lái)越多,為了節(jié)省資源,Build 的 Docker image 就越小越好,文件越少,其實(shí)啟動(dòng)速度也會(huì)略微快一些,也會(huì)更安全一些。

這篇文章來(lái)介紹一下做 Docker Image 的一些技巧。

在之前的博客Docker (容器) 的原理[2]中介紹過(guò) Docker image 是如何工作的。簡(jiǎn)單來(lái)說(shuō),就是使用 Linux 的overlayfs[3], overlay file system 可以做到,將兩個(gè) file system merge 在一起,下層的文件系統(tǒng)只讀,上層的文件系統(tǒng)可寫(xiě)。如果你讀,找到上層就讀上層的,否則的話(huà)就找到下層的給你讀。然后寫(xiě)的話(huà)會(huì)寫(xiě)入到上層。這樣,其實(shí)對(duì)于最終用戶(hù)來(lái)說(shuō),可以認(rèn)為只有一個(gè) merge 之后的文件系統(tǒng),用起來(lái)和普通文件系統(tǒng)沒(méi)有什么區(qū)別。

有了這個(gè)功能,Docker 運(yùn)行的時(shí)候,從最下層的文件系統(tǒng)開(kāi)始,merge 兩層,得到新的 fs 然后再 merge 上一層,然后再 merge 最上一層,最后得到最終的 directory,然后用chroot[4]改變進(jìn)程的 root 目錄,啟動(dòng) container。

654c381a-05da-11ed-ba43-dac502259ad0.png

了解了原理之后,你會(huì)發(fā)現(xiàn),這種設(shè)計(jì)對(duì)于 Docker 來(lái)說(shuō)非常合適:

如果 2 個(gè) image 都是基于 Ubuntu,那么兩個(gè) Image 可以共用 Ubuntu 的 base image,只需要存儲(chǔ)一份;

如果 pull 新的 image,某一層如果已經(jīng)存在,那么這一層之前的內(nèi)容其實(shí)就不需要 pull 了;

后面 build image 的技巧其實(shí)都是基于這兩點(diǎn)。

另外稍微提一下,Docker image其實(shí)就是一個(gè) tar 包[5]。一般來(lái)說(shuō)我們通過(guò)Dockerfile用docker built命令來(lái)構(gòu)建,但是其實(shí)也可以用其他工具構(gòu)建,只要構(gòu)建出來(lái)的image 符合 Docker 的規(guī)范[6],就可以運(yùn)行。比如,之前的博文Build 一個(gè)最小的 Redis Docker Image[7]就是用 Nix 構(gòu)建出來(lái)的。

技巧1:刪除緩存

一般的包管理器,比如apt,pip等,下載包的時(shí)候,都會(huì)下載緩存,下次安裝同一個(gè)包的時(shí)候不必從網(wǎng)絡(luò)上下載,直接使用緩存即可。

但是在 Docker Image 中,我們是不需要這些緩存的。所以我們?cè)贒ockerfile中下載東西一般會(huì)使用這種命令:

RUNdnfinstall-y--setopt=tsflags=nodocs
httpdvim&&
systemctlenablehttpd&&
dnfcleanall

在包安裝好之后,去刪除緩存。

一個(gè)常見(jiàn)的錯(cuò)誤是,有人會(huì)這么寫(xiě):

FROMfedora
RUNdnfinstall-ymariadb
RUNdnfinstall-ywordpress
RUNdnfcleanall

Dockerfile 里面的每一個(gè)RUN都會(huì)創(chuàng)建一層新的 layer,如上所說(shuō),這樣其實(shí)是創(chuàng)建了 3 層 layer,前 2 層帶來(lái)了緩存,第三層刪除了緩存。如同 git 一樣,你在一個(gè)新的 commit 里面刪除了之前的文件,其實(shí)文件還是在 git 歷史中的,最終的 docker image 其實(shí)沒(méi)有減少。

但是 Docker 有了一個(gè)新的功能,docker build --squash。squash 功能會(huì)在 Docker 完成構(gòu)建之后,將所有的 layers 壓縮成一個(gè) layer,也就是說(shuō),最終構(gòu)建出來(lái)的 Docker image 只有一層。所以,如上在多個(gè)RUN中寫(xiě) clean 命令,其實(shí)也可以。我不太喜歡這種方式,因?yàn)榍拔奶岬降?,多個(gè) image 共享 base image 以及加速 pull 的 feature 其實(shí)就用不到了。

一些常見(jiàn)的包管理器刪除緩存的方法:

yum yum clean all
dnf dnf clean all
rvm rvm cleanup all
gem gem cleanup
cpan rm -rf ~/.cpan/{build,sources}/*
pip rm -rf ~/.cache/pip/*
apt-get apt-get clean

另外,上面這個(gè)命令其實(shí)還有一個(gè)缺點(diǎn)。因?yàn)槲覀冊(cè)谕粋€(gè)RUN中寫(xiě)多行,不容易看出這個(gè)dnf到底安裝了什么。而且,第一行和最后一行不一樣,如果修改,diff 看到的會(huì)是兩行內(nèi)容,很不友好,容易出錯(cuò)。

可以寫(xiě)成這種形式,比較清晰。

RUNtrue
&&dnfinstall-y--setopt=tsflags=nodocs
httpdvim
&&systemctlenablehttpd
&&dnfcleanall
&&true

技巧2:改動(dòng)不頻繁的內(nèi)容往前放

通過(guò)前文介紹過(guò)的原理,可以知道,對(duì)于一個(gè) Docker image 有 ABCD 四層,B 修改了,那么 BCD 會(huì)改變。

根據(jù)這個(gè)原理,我們?cè)跇?gòu)建的時(shí)候可以將系統(tǒng)依賴(lài)往前寫(xiě),因?yàn)橄馻pt,dnf這些安裝的東西,是很少修改的。然后寫(xiě)應(yīng)用的庫(kù)依賴(lài),比如pip install,最后 copy 應(yīng)用。

比如下面這個(gè) Dockerfile,就會(huì)在每次代碼改變的時(shí)候都重新 Build 大部分 layers,即使只改了一個(gè)網(wǎng)頁(yè)的標(biāo)題。

FROMpython:3.7-buster

#copysource
RUNmkdir-p/opt/app
COPYmyapp/opt/app/myapp/
WORKDIR/opt/app

#installdependenciesnginx
RUNapt-getupdate&&apt-getinstallnginx
RUNpipinstall-rrequirements.txt
RUNchown-Rwww-data:www-data/opt/app

#startserver
EXPOSE8020
STOPSIGNALSIGTERM
CMD["/opt/app/start-server.sh"]

我們可以改成,先安裝 Nginx,再單獨(dú) copyrequirements.txt,然后安裝pip依賴(lài),最后 copy 應(yīng)用代碼。

FROMpython:3.7-buster

#installdependenciesnginx
RUNapt-getupdate&&apt-getinstallnginx
COPYmyapp/requirements.txt/opt/app/myapp/requirements.txt
RUNpipinstall-rrequirements.txt

#copysource
RUNmkdir-p/opt/app
COPYmyapp/opt/app/myapp/
WORKDIR/opt/app

RUNchown-Rwww-data:www-data/opt/app

#startserver
EXPOSE8020
STOPSIGNALSIGTERM
CMD["/opt/app/start-server.sh"]

技巧3:構(gòu)建和運(yùn)行 Image 分離

我們?cè)诰幾g應(yīng)用的時(shí)候需要很多構(gòu)建工具,比如 gcc, golang 等。但是在運(yùn)行的時(shí)候不需要。在構(gòu)建完成之后,去刪除那些構(gòu)建工具是很麻煩的。

我們可以這樣:使用一個(gè) Docker 作為 builder,安裝所有的構(gòu)建依賴(lài),進(jìn)行構(gòu)建,構(gòu)建完成后,重新選擇一個(gè) Base image,然后將構(gòu)建的產(chǎn)物復(fù)制到新的 base image,這樣,最終的 image 只含有運(yùn)行需要的東西。

比如,這是安裝一個(gè) golang 應(yīng)用pup的代碼:

FROMgolangasbuild
ENVCGO_ENABLED0
RUNgoinstallgithub.com/ericchiang/pup@latest

FROMalpine:3.15.4asrun
COPY--from=build/go/bin/pup/usr/local/bin/pup

我們使用golang這個(gè) 1G 多大的 image 來(lái)安裝,安裝完成之后將 binary 復(fù)制到 alpine, 最終的產(chǎn)物只有 10M 左右。這種方法特別適合一些靜態(tài)編譯的編程語(yǔ)言,比如 golang 和 rust.

技巧4:檢查構(gòu)建產(chǎn)物

這是最有用的一個(gè)技巧了。

dive 是一個(gè) TUI,命令行的交互式 App,它可以讓你看到 docker 每一層里面都有什么。

dive ubuntu:latest命令可以看到 ubuntu image 里面都有什么文件。內(nèi)容會(huì)顯示為兩側(cè),左邊顯示每一層的信息,右邊顯示當(dāng)前層(會(huì)包含之前的所有層)的文件內(nèi)容,本層新添加的文件會(huì)用黃色來(lái)顯示。通過(guò)tab鍵可以切換左右的操作。

656e6296-05da-11ed-ba43-dac502259ad0.png

一個(gè)非常有用的功能是,按下ctrl+U可以只顯示當(dāng)前層相比于前一層增加的內(nèi)容,這樣,就可以看到增加的文件是否是預(yù)期的了。

按ctrl+Space可以折疊起來(lái)所有的目錄,然后交互式地打開(kāi)他們查看,就像是 Docker 中的ncdu。

審核編輯:彭靜

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

    關(guān)注

    0

    文章

    181

    瀏覽量

    11709
  • root
    +關(guān)注

    關(guān)注

    1

    文章

    87

    瀏覽量

    22172
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    537

    瀏覽量

    14414

原文標(biāo)題:4 個(gè)超實(shí)用的 Docker 鏡像構(gòu)建技巧

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    對(duì) i.MX 8M Plus SoC 通過(guò)外部調(diào)試器進(jìn)行 JTAG 調(diào)試的行為有一些疑問(wèn),求解答

    我對(duì) i.MX 8M Plus SoC 通過(guò)外部調(diào)試器進(jìn)行 JTAG 調(diào)試的行為有一些疑問(wèn),我希望您能幫助我解決這個(gè)問(wèn)題。 與我使用的其他 i.MX 8M 衍生產(chǎn)品(i.MX 8M Nano
    發(fā)表于 04-23 06:04

    瑞芯微(EASY EAI)RV1126B 板卡Docker環(huán)境部署方法

    1.Docker介紹Docker個(gè)使用最廣泛的開(kāi)源容器引擎,為每個(gè)應(yīng)用提供完全隔離的運(yùn)行環(huán)境,用戶(hù)可以在環(huán)境中配置不同的工具軟件,并且不同環(huán)境之間相互不影響,當(dāng)前已經(jīng)在
    的頭像 發(fā)表于 04-22 14:16 ?868次閱讀
    瑞芯微(EASY EAI)RV1126B 板卡<b class='flag-5'>Docker</b>環(huán)境部署方法

    如何使用 powerquad 加速器中的一些功能以及 CMSIS 原始實(shí)現(xiàn)中的一些功能?

    )。 如何使用 powerquad 加速器中的一些功能以及 CMSIS 原始實(shí)現(xiàn)中的一些功能。 Example: I do not want to call arm_mat_trans_q15 powerquad
    發(fā)表于 04-03 06:37

    GoogleDrive 中缺少 Image-55,怎么處理?

    剛剛拿到我的 VF2 并嘗試下載 image-55,這不再存在于 googledrive 中。在百度中,它存在,但我只能很難用翻譯器閱讀一些東西,它希望我安裝一些東西以便能夠下載。 這是錯(cuò)誤嗎?除了使用百度下載
    發(fā)表于 03-16 06:23

    使用 Docker 鍵部署 PaddleOCR-VL: 新手保姆級(jí)教程

    作者:飛槳開(kāi)發(fā)者技術(shù)專(zhuān)家 劉力 | 適合人群:剛接觸 PaddleOCR-VL + Docker部署的同學(xué) | 學(xué)習(xí)目標(biāo):從臺(tái)剛裝好的 Ubuntu 24.04 開(kāi)始,完成 Docker 環(huán)境準(zhǔn)備
    的頭像 發(fā)表于 12-18 18:26 ?6854次閱讀
    使用 <b class='flag-5'>Docker</b> <b class='flag-5'>一</b>鍵部署 PaddleOCR-VL: 新手保姆級(jí)教程

    在并聯(lián)使用MOS存在一些問(wèn)題,要怎樣才能避免這些問(wèn)題?

    在并聯(lián)使用MOS存在一些問(wèn)題,那我們要怎樣才能避免這些問(wèn)題? 首先,器件的致性定要好。 在功率MOSFET多管并聯(lián)時(shí),器件內(nèi)部參數(shù)的微小差異就會(huì)引起并聯(lián)各支路電流的不平衡而導(dǎo)致單
    發(fā)表于 12-10 08:19

    關(guān)于六類(lèi)網(wǎng)線(xiàn)一些問(wèn)題的解答

    今天我們就圍繞網(wǎng)友一些常見(jiàn)的關(guān)于六類(lèi)網(wǎng)線(xiàn)的問(wèn)題進(jìn)行下匯總式解答: 問(wèn) 六類(lèi)網(wǎng)線(xiàn)可以當(dāng)電源用嗎? 答 六類(lèi)網(wǎng)線(xiàn)并不是設(shè)計(jì)用于傳輸電力的電纜,因此般不建議將其用于電源傳輸。 盡管六類(lèi)網(wǎng)線(xiàn)的線(xiàn)芯可以
    的頭像 發(fā)表于 12-09 11:13 ?783次閱讀

    貼片電容精度J±5%的一些詳細(xì)知識(shí)

    貼片電容精度J±5%表示電容的實(shí)際值與標(biāo)稱(chēng)值之間的偏差范圍在±5%以?xún)?nèi) ,以下是關(guān)于貼片電容精度J±5%的一些詳細(xì)知識(shí): 、精度等級(jí)含義 J±5% :字母“J”在貼片電容的標(biāo)識(shí)中通常表示標(biāo)稱(chēng)精度
    的頭像 發(fā)表于 11-20 14:38 ?1012次閱讀
    貼片電容精度J±5%的<b class='flag-5'>一些</b>詳細(xì)知識(shí)

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】Docker 環(huán)境安裝及應(yīng)用

    、檢查 Docker 安裝狀態(tài) 板子提示“command not found”或無(wú)版本信息,說(shuō)明 Docker 未安裝,如有需要請(qǐng)自行安裝 二、Docker 環(huán)境安裝 首先更新系統(tǒng)
    發(fā)表于 09-01 17:59

    Docker容器安全攻防實(shí)戰(zhàn)案例

    在云原生時(shí)代,Docker已成為現(xiàn)代應(yīng)用部署的基石。然而,容器化帶來(lái)便利的同時(shí),也引入了新的安全挑戰(zhàn)。作為名在生產(chǎn)環(huán)境中管理過(guò)數(shù)千個(gè)容器的運(yùn)維工程師,我將通過(guò)真實(shí)的攻防實(shí)戰(zhàn)案例,帶你深入了解Docker安全的每
    的頭像 發(fā)表于 08-05 09:52 ?1590次閱讀

    docker無(wú)法啟用怎么解決?

    mengxing@mengxing-virtual-machine:/etc/docker$ sudo systemctl daemon-reload
    發(fā)表于 06-23 07:17

    Docker Volume管理命令大全

    Docker Volume管理命令大全
    的頭像 發(fā)表于 05-28 17:14 ?1114次閱讀

    如何使用Docker部署大模型

    隨著深度學(xué)習(xí)和大模型的快速發(fā)展,如何高效地部署這些模型成為了個(gè)重要的挑戰(zhàn)。Docker 作為種輕量級(jí)的容器化技術(shù),能夠?qū)⒛P图捌湟蕾?lài)環(huán)境打包成個(gè)可移植的容器,極大地簡(jiǎn)化了部署流程
    的頭像 發(fā)表于 05-24 16:39 ?1372次閱讀

    Debian和Ubuntu哪個(gè)好一些?

    兼容性對(duì)比Debian和Ubuntu哪個(gè)好一些,并為您揭示如何通過(guò)RAKsmart服務(wù)器釋放Linux系統(tǒng)的最大潛能。
    的頭像 發(fā)表于 05-07 10:58 ?1442次閱讀

    在FX2LP USB上配置GPIF中斷時(shí)遇到一些問(wèn)題,求解決

    你好,我在 FX2LP USB 上配置 GPIF 中斷時(shí)遇到一些問(wèn)題。 我啟用了 INT4 中斷并從 GPIF 中選擇了源 INT4,然后啟用了 GPIF 完成中斷,但我看不到中斷 4 工作。 我該如何呢?
    發(fā)表于 05-06 08:00
    陕西省| 马龙县| 东城区| 珠海市| 来凤县| 张家界市| 灵丘县| 环江| 明水县| 高雄市| 得荣县| 靖州| 临城县| 巧家县| 武胜县| 万全县| 秀山| 夏津县| 河东区| 江都市| 申扎县| 博罗县| 安义县| 台安县| 来安县| 大连市| 益阳市| 凤台县| 龙门县| 大同县| 河间市| 开阳县| 杂多县| 崇仁县| 碌曲县| 曲沃县| 新竹县| 苏尼特右旗| 博野县| 金阳县| 临邑县|