色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

做Docker Image的一些技巧

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-07-22 10:58 ? 次閱讀

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

這篇文章來介紹一下做 Docker Image 的一些技巧。

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

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

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

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

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

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

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

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

技巧1:刪除緩存

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

但是在 Docker Image 中,我們是不需要這些緩存的。所以我們在Dockerfile中下載東西一般會使用這種命令:

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

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

一個(gè)常見的錯(cuò)誤是,有人會這么寫:

FROMfedora
RUNdnfinstall-ymariadb
RUNdnfinstall-ywordpress
RUNdnfcleanall

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

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

一些常見的包管理器刪除緩存的方法:

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)槲覀冊谕粋€(gè)RUN中寫多行,不容易看出這個(gè)dnf到底安裝了什么。而且,第一行和最后一行不一樣,如果修改,diff 看到的會是兩行內(nèi)容,很不友好,容易出錯(cuò)。

可以寫成這種形式,比較清晰。

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

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

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

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

比如下面這個(gè) Dockerfile,就會在每次代碼改變的時(shí)候都重新 Build 大部分 layers,即使只改了一個(gè)網(wǎng)頁的標(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依賴,最后 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 分離

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

我們可以這樣:使用一個(gè) Docker 作為 builder,安裝所有的構(gòu)建依賴,進(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 來安裝,安裝完成之后將 binary 復(fù)制到 alpine, 最終的產(chǎn)物只有 10M 左右。這種方法特別適合一些靜態(tài)編譯的編程語言,比如 golang 和 rust.

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

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

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

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

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

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

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

審核編輯:彭靜

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

    關(guān)注

    0

    文章

    170

    瀏覽量

    10775
  • root
    +關(guān)注

    關(guān)注

    1

    文章

    86

    瀏覽量

    21407
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    492

    瀏覽量

    11916

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    網(wǎng)站云服務(wù)器還是服務(wù)器好一些

    網(wǎng)站云服務(wù)器還是服務(wù)器好一些網(wǎng)站選擇云服務(wù)器通常更好,因?yàn)樗峁┏杀拘б妗⒏呖蓴U(kuò)展性、高可用性和便捷的管理維護(hù),尤其適合中小企業(yè)和個(gè)人網(wǎng)站。雖然傳統(tǒng)服務(wù)器在性能和數(shù)據(jù)安全上有優(yōu)勢,但云服務(wù)器的綜合性價(jià)比和靈活性使其成為大多
    的頭像 發(fā)表于 01-08 09:56 ?65次閱讀

    一些常見的動態(tài)電路

    無論是模電還是數(shù)電,理論知識相對來說還是比較枯燥,各種電路原理理解清楚不算容易,換種生動形象的方式或許會增加一些趣味性,也更容易理解這些知識。下面整理了一些常見的電路,以動態(tài)圖形的方式展示。 整流
    的頭像 發(fā)表于 11-16 09:26 ?465次閱讀
    <b class='flag-5'>一些</b>常見的動態(tài)電路

    分享一些常見的電路

    理解模電和數(shù)電的電路原理對于初學(xué)者來說可能比較困難,但通過一些生動的教學(xué)方法和資源,可以有效地提高學(xué)習(xí)興趣和理解能力。 下面整理了一些常見的電路,以動態(tài)圖形的方式展示。 整流電路 單相橋式整流
    的頭像 發(fā)表于 11-13 09:28 ?397次閱讀
    分享<b class='flag-5'>一些</b>常見的電路

    Docker運(yùn)行環(huán)境安裝

    作者:京東科技 林中 Docker個(gè)開放的平臺,用于開發(fā)、發(fā)布和運(yùn)行應(yīng)用程序。Docker分離了應(yīng)用程序和運(yùn)行應(yīng)用的基礎(chǔ)設(shè)施,從而實(shí)現(xiàn)了軟件的快速交付。利用docker提供的
    的頭像 發(fā)表于 10-29 11:28 ?251次閱讀

    LED驅(qū)動器應(yīng)用的一些指南和技巧

    電子發(fā)燒友網(wǎng)站提供《LED驅(qū)動器應(yīng)用的一些指南和技巧.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 11:35 ?0次下載
    LED驅(qū)動器應(yīng)用的<b class='flag-5'>一些</b>指南和技巧

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

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

    ARM平臺實(shí)現(xiàn)Docker容器技術(shù)

    本帖最后由 Tronlong創(chuàng)龍科技 于 2024-7-26 08:51 編輯 什么是Docker? (1)Docker的架構(gòu)Docker個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可打包
    發(fā)表于 07-25 14:36

    ARM平臺實(shí)現(xiàn)Docker容器技術(shù)

    本帖最后由 Tronlong創(chuàng)龍科技 于 2024-7-19 16:50 編輯 什么是Docker? (1)Docker的架構(gòu)Docker個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可打包
    發(fā)表于 07-17 11:05

    關(guān)于Docker 的清理命令集錦

    這篇文章主要介紹了Docker 清理命令集錦,需要的朋友可以參考下 復(fù)制代碼代碼如下: docker kill $(docker ps -a -q) ?刪除所有已經(jīng)停止的容器 復(fù)制代碼代碼如下
    的頭像 發(fā)表于 06-13 15:56 ?416次閱讀

    文掃盡Nas常用Docker軟件

    NAS(Network Attached Storage,網(wǎng)絡(luò)附加存儲)設(shè)備上的Docker軟件選擇取決于您的具體需求和用途。以下是一些NAS上常用的Docker軟件推薦
    的頭像 發(fā)表于 05-23 18:33 ?1902次閱讀

    細(xì)談SolidWorks教育版的一些基礎(chǔ)知識

    SolidWorks教育版是款廣泛應(yīng)用于工程設(shè)計(jì)和教育領(lǐng)域的三維建模軟件。它具備直觀易用的操作界面和強(qiáng)大的設(shè)計(jì)功能,為學(xué)生提供了個(gè)學(xué)習(xí)和實(shí)踐的平臺。在本文中,我們將詳細(xì)探討SolidWorks教育版的一些基礎(chǔ)知識,幫助初學(xué)者
    的頭像 發(fā)表于 04-01 14:35 ?368次閱讀

    關(guān)于智能門禁設(shè)備CCC認(rèn)證申請的一些經(jīng)驗(yàn)分享

    CCC認(rèn)證申請的一些經(jīng)驗(yàn)分享。1.了解CCC認(rèn)證要求:首先,您需要詳細(xì)了解CCC認(rèn)證的規(guī)定和要求,包括適用標(biāo)準(zhǔn)、測試項(xiàng)目、申請流程等內(nèi)容。CCC認(rèn)證涉及到產(chǎn)品的安
    的頭像 發(fā)表于 03-07 17:10 ?591次閱讀
    關(guān)于智能門禁設(shè)備<b class='flag-5'>做</b>CCC認(rèn)證申請的<b class='flag-5'>一些</b>經(jīng)驗(yàn)分享

    ARM平臺實(shí)現(xiàn)Docker容器技術(shù)

    什么是Docker? (1)Docker的架構(gòu) Docker個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可打包他們的應(yīng)用以及依賴包到個(gè)可移植的鏡像中
    的頭像 發(fā)表于 03-07 13:48 ?835次閱讀
    ARM平臺實(shí)現(xiàn)<b class='flag-5'>Docker</b>容器技術(shù)

    一些有關(guān)通信電路的資料?

    有關(guān)嵌入式之間DSP、ARM、FPGA三者之間和這三款芯片和外部電路之間通信的一些資料,比如說芯片之間的并行通信和芯片和外部電路之間的串行通信,MODBUS、DP、CAN等,一些一些常用的通信協(xié)議的
    發(fā)表于 03-03 18:53

    【昉·星光 2 高性能RISC-V單板計(jì)算機(jī)體驗(yàn)】為 Ubuntu 安裝 Docker 及常用軟件

    : 獲取鏡像 通常來說,RISC-V 架構(gòu)的開發(fā)板不能使用基于其他架構(gòu)開發(fā)的鏡像,下面是一些基于 RISC-V 鏡像的合集:https://hub.docker.com/u/riscv64/ 安裝其他常用軟件 sudo apt install vim htop net
    發(fā)表于 02-21 17:54
    主站蜘蛛池模板: 韩国伦理片2018在线播放免费观看 | 被老头下药玩好爽| 伊人久久综合网站| 亚洲 日韩 在线 国产 视频| 日韩精品人成在线播放| 免费一级片网站| 快播性爱电影| 久久精品亚洲AV高清网站性色| 国内精品自线在拍2020不卡| 国产欧美另类久久久品| 国产成人免费高清激情视频| 德国xxxx| 观看免费做视频| 动漫女生的逼| 俄罗斯摘花| 国产99在线视频| 国产二级一片内射视频播放| 高h gl肉文| 国产产一区二区三区久久毛片国语 | vagaa哇嘎黄短片| 白丝女仆被强扒内裤| xxx性欧美在线| 爱啪国产精品视频在线| 办公室中文BD| 大桥未久在线看| 国产AV国片精品无套内谢无码 | 乳色吐息在线观看全集免费观看 | 22eee在线播放成人免费视频| 稚嫩挤奶h调教h| 2019久久这里只精品热在线观看| 中文字幕无码他人妻味| 最新无码国产在线视频2020| 7723手机游戏破解版下载| 69精品人人人人| JIZZ幻女大全| 攻把受做哭边走边肉楼梯PLAY| 国产精品久久久久久搜索| 含羞草免费完整视频在线观看 | 国产成人精品免费视频大全可播放的| 国产精品VIDEOS麻豆TUBE| 国产在线aaa片一区二区99|