范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

这4个超实用的Docker镜像构建技巧你还不知道?

  最近做了一个好玩的工具,叫  xbin.io 。其中有一项工作是为不同的工具来构建 Docker 镜像,让他们都运行在 Docker 中(实际上,是兼容 Docker image 的其他 sandbox 系统,没有直接用 Docker)。支持的工具越来越多,为了节省资源,Build 的 Docker image 就越小越好,文件越少,其实启动速度也会略微快一些,也会更安全一些。
  这篇文章来介绍一下做 Docker Image 的一些技巧。
  在之前的博客 Docker (容器) 的原理中介绍过 Docker image 是如何工作的。简单来说,就是使用 Linux 的 overlayfs, overlay file system 可以做到,将两个 file system merge 在一起,下层的文件系统只读,上层的文件系统可写。如果你读,找到上层就读上层的,否则的话就找到下层的给你读。然后写的话会写入到上层。这样,其实对于最终用户来说,可以认为只有一个 merge 之后的文件系统,用起来和普通文件系统没有什么区别。
  有了这个功能,Docker 运行的时候,从最下层的文件系统开始,merge 两层,得到新的 fs 然后再 merge 上一层,然后再 merge 最上一层,最后得到最终的 directory,然后用 chroot 改变进程的 root 目录,启动 container。
  了解了原理之后,你会发现,这种设计对于 Docker 来说非常合适:  如果 2 个 image 都是基于 Ubuntu,那么两个 Image 可以共用 Ubuntu 的 base image,只需要存储一份;  如果 pull 新的 image,某一层如果已经存在,那么这一层之前的内容其实就不需要 pull 了;
  后面 build image 的技巧其实都是基于这两点。
  另外稍微提一下,Docker image  其实就是一个 tar 包 。一般来说我们通过 Dockerfile 用 docker built 命令来构建,但是其实也可以用其他工具构建,只要构建出来的 image 符合 Docker 的规范,就可以运行。比如,之前的博文 Build 一个最小的 Redis Docker Image 就是用 Nix 构建出来的。 技巧1:删除缓存
  一般的包管理器,比如 apt, pip 等,下载包的时候,都会下载缓存,下次安装同一个包的时候不必从网络上下载,直接使用缓存即可。
  但是在 Docker Image 中,我们是不需要这些缓存的。所以我们在 Dockerfile 中下载东西一般会使用这种命令:  RUN dnf install -y --setopt=tsflags=nodocs      httpd vim &&      systemctl enable httpd &&      dnf clean all
  在包安装好之后,去删除缓存。
  一个常见的错误是,有人会这么写:  FROM fedora RUN dnf install -y mariadb RUN dnf install -y wordpress RUN dnf clean all
  Dockerfile 里面的每一个 RUN 都会创建一层新的 layer,如上所说,这样其实是创建了 3 层 layer,前 2 层带来了缓存,第三层删除了缓存。如同 git 一样,你在一个新的 commit 里面删除了之前的文件,其实文件还是在 git 历史中的,最终的 docker image 其实没有减少。
  但是 Docker 有了一个新的功能,docker build --squash。squash 功能会在 Docker 完成构建之后,将所有的 layers  压缩成一个 layer ,也就是说,最终构建出来的 Docker image 只有一层。所以,如上在多个 RUN 中写 clean 命令,其实也可以。我不太喜欢这种方式,因为前文提到的,多个 image 共享 base image 以及加速 pull 的 feature 其实就用不到了。小编为你们精心准备了2TB的各类学习资料,包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。只需在「民工哥技术之路」的公众号后台回复"1024",然后按照提示加入网盘的分享组即可。
  一些常见的 包管理器删除缓存 的方法:
  另外,上面这个命令其实还有一个缺点。因为我们在同一个 RUN 中写多行,不容易看出这个 dnf 到底安装了什么。而且,第一行和最后一行不一样,如果修改,diff 看到的会是两行内容,很不友好,容易出错。
  可以写成这种形式,比较清晰。  RUN true      && dnf install -y --setopt=tsflags=nodocs          httpd vim      && systemctl enable httpd      && dnf clean all      && true 技巧2:改动不频繁的内容往前放
  通过前文介绍过的原理,可以知道,对于一个 Docker image 有 ABCD 四层,B 修改了,那么 BCD 会改变。
  根据这个原理,我们在构建的时候可以将系统依赖往前写,因为像 apt, dnf 这些安装的东西,是很少修改的。然后写应用的库依赖,比如  pip install ,最后 copy 应用。
  比如下面这个 Dockerfile,就会在每次代码改变的时候都重新 Build 大部分 layers,即使只改了一个网页的标题。  FROM python:3.7-buster   # copy source RUN mkdir -p /opt/app COPY myapp /opt/app/myapp/ WORKDIR /opt/app   # install dependencies nginx RUN apt-get update && apt-get install nginx RUN pip install -r requirements.txt RUN chown -R www-data:www-data /opt/app   # start server EXPOSE 8020 STOPSIGNAL SIGTERM CMD ["/opt/app/start-server.sh"]
  我们可以改成,先安装 Nginx,再单独 copy requirements.txt,然后安装 pip 依赖,最后 copy 应用代码。  FROM python:3.7-buster   # install dependencies nginx RUN apt-get update && apt-get install nginx COPY myapp/requirements.txt /opt/app/myapp/requirements.txt RUN pip install -r requirements.txt   # copy source RUN mkdir -p /opt/app COPY myapp /opt/app/myapp/ WORKDIR /opt/app   RUN chown -R www-data:www-data /opt/app   # start server EXPOSE 8020 STOPSIGNAL SIGTERM CMD ["/opt/app/start-server.sh"] 技巧3:构建和运行 Image 分离
  我们在编译应用的时候需要很多构建工具,比如 gcc, golang 等。但是在运行的时候不需要。在构建完成之后,去删除那些构建工具是很麻烦的。
  我们可以这样:使用一个 Docker 作为 builder,安装所有的构建依赖,进行构建,构建完成后,重新选择一个 Base image,然后将构建的产物复制到新的 base image,这样,最终的 image 只含有运行需要的东西。
  比如,这是安装一个 golang 应用 pup 的代码:  FROM golang as build ENV CGO_ENABLED 0 RUN go install github.com/ericchiang/pup@latest   FROM alpine:3.15.4 as run COPY --from=build /go/bin/pup /usr/local/bin/pup
  我们使用 golang 这个 1G 多大的 image 来安装,安装完成之后将 binary 复制到 alpine, 最终的产物只有 10M 左右。这种方法特别适合一些静态编译的编程语言,比如 golang 和 rust.  技巧4:检查构建产物
  这是最有用的一个技巧了。
  pe 是一个 TUI,命令行的交互式 App,它可以让你看到 docker 每一层里面都有什么。
  pe ubuntu:latest  命令可以看到 ubuntu image 里面都有什么文件。内容会显示为两侧,左边显示每一层的信息,右边显示当前层(会包含之前的所有层)的文件内容,本层新添加的文件会用黄色来显示。通过 tab 键可以切换左右的操作。
  一个非常有用的功能是,按下 ctrl + U 可以只显示当前层相比于前一层增加的内容,这样,就可以看到增加的文件是否是预期的了。
  按 ctrl + Space 可以折叠起来所有的目录,然后交互式地打开他们查看,就像是 Docker 中的 ncdu。
  参考资料:  https://jvns.ca/blog/2019/11/18/how-containers-work–overlayfs/  https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html  http://docs.projectatomic.io/container-best-practices/
  来源:kawabangga.com/posts/4676
  免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!

谁才是马可天花板?狼队刺痛SOLO国一马可宇晨,观众满屏问号王者荣耀中,马可波罗称得上是发育路最考验手法的英雄之一了,因为其灵活性,也是KPL上的常客,玩好一个马可波罗是每个发育路玩家的必修课,而对于国服马可的争夺,更是愈发激烈,每个国服马香港知名女星怀二胎晒唯美孕照,曾为是否请月嫂和老公大吵本文编辑剧透社伊文未经授权严禁转载,发现抄袭者将进行全网投诉早前,香港知名女星雨侨在中秋佳节这个人月两团圆的好日子,宣布自己怀有第二胎,并且已经进入到了孕期的中期。虽然已经是第二次微软取消光环士官长合集微交易计划,光环第二季已开始拍摄此前微软旗下的343Industries透露,计划在光环士官长合集(HaloTheMasterChiefCollection)中添加微交易功能。尽管这款游戏已上市很长时间了,不过开入睡难补肝血,易惊醒补心气,不解乏要健脾,教你三招,解决失眠入睡难补肝血,易惊醒补心气,不解乏要健脾。大家好,我是屈医生,有的人睡前翻来覆去睡不着,入睡难有的人好不容易睡着之后稍微有点动静就被惊醒还有的人睡了一觉之后感觉全身疲惫那这是为什么为什么喝牛奶肚子就不舒服?医生或与乳糖吸收不良和不耐受相关由于富含蛋白质和钙等成分而具有一定的预防骨质疏松的作用,及在医务工作者的长期大力宣教下,牛奶已成为现代社会中大多数人每天必饮的食品。因此,邻里之间碰面时,免不了会被问道你每天喝牛奶底线首播收视夺冠,靳东王劲松一出手,就打出了一副王炸谁也没有想到,一部法制题材的电视剧收视率竟然这么猛!9月19日晚,底线一开播,就拿下了同时段卫视收视排名的冠军。之后,底线的收视率表现得很稳定,维持在1左右。可以说,底线开了个好局印象大别山大别山之概念大别山跨鄂豫皖三省,270公里长,夹在淮河和长江之间,是它们的分水岭。简单说,大别山其实就是一个大山群,当中散布着市县乡镇和村落。比如我登大别山前后所落宿的安徽省岳西县湖人放大招了!詹皇浓眉特纳希尔德贝弗利,这样的阵容是否能夺冠伴随着勇士总冠军这句口号山呼海啸般的席卷全球,同时也为这一季画上了一个圆满的句号。竞技体育的残酷性就在于大家永远只记得第一名,也就是所谓的总冠军队伍。今年的总冠军勇士毫无疑问是最大英超情报西汉姆联VS托特纳姆热刺,赛程紧密,热刺或轮换阵容海外情报重磅引援!西汉姆签巴西国脚29日,西汉姆联宣布帕奎塔从里昂转会加盟,交易金额达到6163欧元。这位25岁的中场曾效力于AC米兰和里昂,在为里昂出场的80场比赛中他打入了21奥尼尔评点的现役最强阵容,大概率就是下赛季的最佳一阵吗?北京时间8月31日,名宿奥尼尔在社交平台回答网友,评选出了他心中的现役联盟的最佳阵容。分别是斯蒂芬库里,德文布克,杰森塔图姆,扬尼斯阿德托昆博,乔尔恩比德。这大概率会是下赛季的最佳国产阵容庞大雪佛兰奥特能平台新车有望亮相广州车展日前,行车视线从官方渠道获悉了一张上汽通用汽车2022年至2025年新能源车型规划图,图中显示通用集团将基于奥特能电动车平台推出10款以上国产新能源车型。据悉,雪佛兰首款国产奥特能
果然,毛衣才是必备单品,今冬美出圈!配大衣羽绒服都很美在冬天女生朋友们买衣服基本上都会把目光聚集在各种厚实的外套上,大衣羽绒服肯定是衣柜里必不可少的,但除了要给自己选择这些外套之外,我们还要去选择一些合适的单品作为内搭,就算是在室内里春节氛围拉满!校园换上限定皮肤癸卯兔年新春快乐虎越雄关踪影去兔临春境晓光新国防科大校园里张灯结彩喜气洋洋一起感受校园里的年味儿长沙校区校园被喜庆的红色点缀笼罩在欢欣愉快的氛围中20hr23沿途随处可见的灯笼在绿能极大提高效率的5款Mac软件1。Cleaner快速清洁Mac键盘屏幕的好帮手日常开盖想要清理Mac电脑,但是Mac电脑总是会自动开机,这个时候我们就可以用这个软件,开启之后就可以放心的清理我们的屏幕和键盘了,如果有接收三个月龄宝宝的保育园,年轻人愿意生孩子吗?前段时间看到这样一篇报道,我国人口减少了85万,是61年来首次。报道中的原因之一是生育意愿下降,就是年轻人不愿意生孩子了。人口减少,是福是祸?这是个见仁见智的问题,但是不愿意生,我612岁孩子必入的古文游戏书随着大语文时代的到来,教育越来越重视语文,妈妈圈里一直说着一句话普通境界拼英文,高点境界拼数学,超高境界拼大语文思维。越来越多的家长开始重视孩子的语文思维培养,从小让孩子背诵古诗,春晚最美女主持!马凡舒腿真长,1米72撒贝宁穿高跟仍比她矮半头兔年春节终于到来了,这两年,咱们都经历了共同的困难,无论是体育比赛还是正常生活都受到极大影响,但是随着解封以及大家普遍杨康,我们又开始过起了正常的日子,兔年的央视春晚本来应该让人印2。5万人见证,06惨案!德甲第2被打崩,科瓦奇创纪录拜仁收大礼北京时间1月21日2230,德甲第16轮,维默尔59秒闪击,温德20分钟双响,格哈特鲍库和瓦尔德施密特各进一球,最终沃尔夫斯堡主场60大胜弗莱堡,现场25849名球迷见证。此役前,斯帕莱蒂迪洛伦佐配得上队长袖标若非梅雷特比赛最后会很复杂直播吧1月22日讯在今日凌晨进行的一场意甲联赛中,那不勒斯客场20击败萨勒尼塔纳。赛后在接受DAZN采访时,那不勒斯主帅斯帕莱蒂表示,球队未来需要更加努力,加快速度。关于本场比赛斯阿根廷一位农民在玉米地里种出梅西画像据英国都市报报道,阿根廷一位农民为了致敬梅西,在玉米地里种植出了一幅124英亩的梅西雕像。据悉,MaximilianoSpinazze通过算法算出了每一块画像需要播种的面积,在阿根每日一冷曼联难以爆冷英超第一的阿森纳,21杨院长解说足球第一,明天1月23日凌晨英超的比赛大方向阿森纳主胜。第二,其次比分有可能20或21或31。第三,阿森纳进攻和防守都是多方面领先曼联,并且体能还有很大的优势,曼联客场输(体育)NBA综合凯尔特人九连胜火箭13连败新华社华盛顿1月21日电20222023赛季美职篮(NBA)常规赛21日上演7场较量,波士顿凯尔特人队106104险胜多伦多猛龙队,将连胜纪录扩大到9场休斯敦火箭队则在客场1041