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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

4個(gè)超實(shí)用的Docker鏡像構(gòu)建技巧

dyquk4xk2p3d ? 來(lái)源:良許Linux ? 2023-02-13 11:24 ? 次閱讀

	

最近做了一個(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ō),就是使用 Linuxoverlayfs[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。

910be89c-ab48-11ed-bfe3-dac502259ad0.png

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

  1. 如果 2 個(gè) image 都是基于 Ubuntu,那么兩個(gè) Image 可以共用 Ubuntu 的 base image,只需要存儲(chǔ)一份;
  2. 如果 pull 新的 image,某一層如果已經(jīng)存在,那么這一層之前的內(nèi)容其實(shí)就不需要 pull 了;

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

另外稍微提一下,Docker image其實(shí)就是一個(gè) tar 包[5]。一般來(lái)說(shuō)我們通過(guò)Dockerfiledocker 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è)?code>Dockerfile中下載東西一般會(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)橄?code>apt,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鍵可以切換左右的操作。

9152c0c8-ab48-11ed-bfe3-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)投訴
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    206

    瀏覽量

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

    關(guān)注

    0

    文章

    178

    瀏覽量

    11088
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    506

    瀏覽量

    12619

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

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

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

    怎么構(gòu)建docker鏡像倉(cāng)庫(kù)軟件

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

    采用CentOS7的JDK Docker鏡像構(gòu)建

    基于CentOS7構(gòu)建JDK Docker鏡像
    發(fā)表于 04-02 11:25

    構(gòu)建ARM64版本nacos docker鏡像

    在適配過(guò)程中有大量合作伙伴用到nacos且采用容器化部署,dockerhub未提供官方鏡像,因此需要在鯤鵬服務(wù)器自定義構(gòu)建構(gòu)建前提:Docker已部署
    發(fā)表于 06-16 14:29

    介紹一款非常方便的java領(lǐng)域docker鏡像構(gòu)建工具

    中上述內(nèi)容配置了一個(gè)結(jié)果鏡像名稱(chēng)imageName,也就是最終構(gòu)建成的docker鏡像地址,包含容器倉(cāng)庫(kù)地址/
    發(fā)表于 07-19 17:41

    應(yīng)用Docker完成構(gòu)建個(gè)微服務(wù)開(kāi)發(fā)任務(wù)

    什么是Docker? 它的核心就是:Docker是一個(gè)允許你創(chuàng)建鏡像(這包含了很多步驟,就像在虛擬機(jī)的模板一樣)并且讓這個(gè)鏡像的實(shí)例運(yùn)行在容
    發(fā)表于 09-30 16:45 ?0次下載
    應(yīng)用<b class='flag-5'>Docker</b>完成<b class='flag-5'>構(gòu)建</b>一<b class='flag-5'>個(gè)</b>微服務(wù)開(kāi)發(fā)任務(wù)

    Docker:微容器的優(yōu)勢(shì)與構(gòu)建教程

    說(shuō)到Docker,可能大家都不陌生了,我們可以用Docker技術(shù)將應(yīng)用以及所有的依賴(lài)項(xiàng)打包到一個(gè)鏡像中,然后把這個(gè)鏡像部署到容器中運(yùn)行。這里
    發(fā)表于 10-10 11:32 ?0次下載

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

    Docker 鏡像不是一個(gè)單一的文件,而是有多層構(gòu)成。我們可通過(guò) docker images 獲取本地的鏡像列表及對(duì)應(yīng)的元信息, 接著可通過(guò)
    發(fā)表于 10-19 14:17 ?2612次閱讀

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

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

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

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

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

    了解Dockerfile Dockerfile 是一個(gè)文本文件,用于定義 Docker 鏡像構(gòu)建過(guò)程。它以指令的形式描述了如何構(gòu)建
    的頭像 發(fā)表于 09-30 10:22 ?2791次閱讀

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

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

    如何使用dockerfile創(chuàng)建鏡像

    Docker是一個(gè)開(kāi)源的平臺(tái),用于快速構(gòu)建、打包、部署應(yīng)用程序的容器化工具。而Dockerfile是一個(gè)文本文件,包含了一組可自動(dòng)化構(gòu)建
    的頭像 發(fā)表于 11-23 09:52 ?976次閱讀

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

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

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

    docker hub里面查看busybox的Dockerfile, 知識(shí)點(diǎn)4:bootfs 和 rootfs? 知識(shí)點(diǎn)5:為什么Docker鏡像要采用這種分層結(jié)構(gòu)? 如果多個(gè)容器共享一
    的頭像 發(fā)表于 01-15 10:44 ?484次閱讀
    <b class='flag-5'>Docker</b>-<b class='flag-5'>鏡像</b>的分層-busybox<b class='flag-5'>鏡像</b>制作

    基于Docker鏡像逆向生成Dockerfile

    在本文中, 我們將通過(guò)理解Docker鏡像如何存儲(chǔ)數(shù)據(jù), 以及如何使用工具查看鏡像方方面面的信息來(lái)逆向工程一個(gè)Docker
    的頭像 發(fā)表于 03-10 09:45 ?405次閱讀
    基于<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>逆向生成Dockerfile
    主站蜘蛛池模板: 蜜臀亚洲AV永久无码精品老司机 | 人善交XUANWEN200喷水 | 日本一卡精品视频免费 | 成人在免费观看视频国产 | 解开美女胸衣2破解版 | 亚洲欧洲免费三级网站 | 日本高清免费一本视频在线观看 | 国产美女裸身网站免费观看视频 | 国产精品黄色大片 | 龙腾亚洲人成电影网站 | 4k岛国精品午夜高清在线观看 | 日产亚洲一区二区三区 | 国产AV视频一区二区蜜桃 | 视频三区 国产盗摄 | 四房播播开心五月 | 美女直播喷水 | 欧美一区二区视频高清专区 | 午夜剧场1000 | X8X8拨牐拨牐X8免费视频8午夜 | 极品网红液液酱粉嫩福利照子凌酱 | 羞羞漫画在线播放 | 亚洲成人综合在线 | 伊人伊人影院 | 亚洲国产成人在线 | yin荡体育课羞耻play双性 | 狠狠色丁香婷婷久久综合 | 九九精彩视频在线观看视频 | 日本一本在线播放 | 视频一区国产在线二区 | 黄色网址在线看 | 国产精品久久久久久久久免费下载 | 成人网视频在线观看免费 | 野花高清影视免费观看 | 色偷偷亚洲天堂 | 亚洲看片无码免费视频 | 秋霞成人午夜鲁丝一区二区三区 | 99爱免费视频 | 久久精品国产亚洲精品2020 | 无码人妻精品一区二区蜜桃在线看 | 国产精品亚洲专一区二区三区 | 在线电影一区二区 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品