最新要闻
- 【焦点热闻】舍利子制作方法居然也有发明专利 网友:得道高僧等级速升外挂
- 世界即时:跑腿师傅诉苦:男子订一束花送五个女生均被拒 还被扣款差评
- 微软将用UUP方式推送.NET更新:“可选更新”终于可控
- 钉钉iOS版喜迎更新:支持定时消息 再不怕打扰别人休息了
- 天天热讯:《星际争霸2》新晋中国世界冠军李培楠:别给暴雪送钱 不要买!
- 环球百事通!游戏帧数暴增84% 英特尔锐炫显卡新老驱动对比
- 当前动态:山东多人无视劝阻赶海 1人溺水遇难:必须小心这4点
- 世界即时看!价值7万的爱马仕包运输途中被烧毁!顺丰:如果是我们的问题 会进行处理
- 天天速看:男子给女友转账140万分手想要回:女方最终被判返还40万
- 每日热门:媒体曝苹果扩大在印产量障碍重重:这品控看完避雷
- 环球速读:AI照骗恐怖如斯!美女刷屏真假难辨 网友:警惕AI网恋诈骗
- 【全球时快讯】万元级最香!ROG四款满血笔记本齐上阵:魔霸新锐2023首发9999元手慢无
- 全球焦点!00后男生长期把可乐当水喝:牙全坏
- 《巫师3》次时代版热修复上线:解决4.01版性能问题
- MINI纯电Countryman谍照
- 世界简讯:贾跃亭再被执行2.4亿:总额超42亿!自称FF91四月交付
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数
文章持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版为您奉上珍贵的学习资源 :
免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
(相关资料图)
说在前面
在40岁老架构师 尼恩的读者交流群(50+)中,面试题是一个非常、非常高频的交流话题。
最近,有小伙伴面试极兔时,遇到一个面试题:
如果优化 Dockerfile?
小伙伴没有回答好,只是提到了减少镜像层数。
一般来说,面试的小伙伴,大部分都会说
- 使用更小的基础镜像, 比如
alpine
. - 减少镜像层数, 比如 使用
&&
符号将命令链接起来。 - 给基础镜像打上 安全补丁。
但这些,其实都是单点的优化。优化 Dockerfile 的核心是 合理分层、构建一个精良的基础镜像。
这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V46版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从这里获取:码云
为什么要优化镜像
首先,回到起点。为啥要优化 镜像?优化镜像的好处是:
- 一个小镜像有什么好处: 分发更快,存储更少,加载更快。
- 镜像臃肿带来了什么问题: 存储过多,分发更慢且浪费带宽更多。
镜像的构成
其次,来看看镜像的构成。从两个维度来看:
- 俯瞰镜像: 就是一个删减版的操作系统。
- 侧看镜像: 由一层层的
layer
堆叠而成
那么问题来了
应该如何优化镜像?
举个例子 docker build
- Dockerfile v1
# v1FROM nginx:1.15-alpineRUN echo "hello"RUN echo "demo best practise"ENTRYPOINT [ "/bin/sh" ]
- Dockerfile v2
# v2FROM nginx:1.15-alpineRUN echo "hello"RUN echo "demo best practise"ENTRYPOINT [ "/bin/sh" ]
1st build
全新构建
# docker build -t demo:0.0.1 . Sending build context to Docker daemon 2.048kBStep 1/4 : FROM nginx:1.15-alpine ---> 9a2868cac230Step 2/4 : RUN echo "hello" ---> Running in d301b4b3ed55helloRemoving intermediate container d301b4b3ed55 ---> 6dd2a7773bbcStep 3/4 : RUN echo "demo best practise" ---> Running in e3084037668edemo best practiseRemoving intermediate container e3084037668e ---> 4588ecf9837aStep 4/4 : ENTRYPOINT [ "/bin/sh" ] ---> Running in d63f460347ffRemoving intermediate container d63f460347ff ---> 77b52d828f21Successfully built 77b52d828f21Successfully tagged demo:0.0.1
2nd build
Dockerfile 与 1st build
完全一致, 命令仅修改 build tag , 从 0.0.1
到 0.0.2
# docker build -t demo:0.0.2 .Sending build context to Docker daemon 4.096kBStep 1/4 : FROM nginx:1.15-alpine ---> 9a2868cac230Step 2/4 : RUN echo "hello" ---> Using cache ---> 6dd2a7773bbcStep 3/4 : RUN echo "demo best practise" ---> Using cache ---> 4588ecf9837aStep 4/4 : ENTRYPOINT [ "/bin/sh" ] ---> Using cache ---> 77b52d828f21Successfully built 77b52d828f21Successfully tagged demo:0.0.2
可以看到,
- 每层 layer 都使用 cache (
---> Using cache
) ,并未重新构建。 - 我们可以通过
docker image ls |grep demo
看到,demo:0.0.1
与demo:0.0.2
的 layer hash 是相同。
所以从根本上来说, 这两个镜像就是同一个镜像,虽然都是 build 出来的。
3rd build
这次, 我们将Dockerfile 02的 第三层 RUN echo "demo best practise"
变更为 RUN echo "demo best practise 02"
docker build -t demo:0.0.3 .Sending build context to Docker daemon 4.608kBStep 1/4 : FROM nginx:1.15-alpine ---> 9a2868cac230Step 2/4 : RUN echo "hello" ---> Using cache ---> 6dd2a7773bbcStep 3/4 : RUN echo "demo best practise 02" ---> Running in c55f94e217bddemo best practise 02Removing intermediate container c55f94e217bd ---> 46992ea04f49Step 4/4 : ENTRYPOINT [ "/bin/sh" ] ---> Running in f176830cf445Removing intermediate container f176830cf445 ---> 2e2043b7f3cbSuccessfully built 2e2043b7f3cbSuccessfully tagged demo:0.0.3
可以看到 ,
- 第二层仍然使用
cache
- 但是第三层已经生成了新的 hash 了
- 虽然第四层的操作没有变更,但是由于上层的镜像已经变化了,所以第四层本身也发生了变化。
注意: 每层在
build
的时候都是依赖于上册---> Running in f176830cf445
。
4th build
第四次构建, 这次使用 --no-cache
不使用缓存, 模拟在另一台电脑上进行 build 。
# docker build -t demo:0.0.4 --no-cache . Sending build context to Docker daemon 5.632kBStep 1/4 : FROM nginx:1.15-alpine ---> 9a2868cac230Step 2/4 : RUN echo "hello" ---> Running in 7ecbed95c4cdhelloRemoving intermediate container 7ecbed95c4cd ---> a1c998781f2eStep 3/4 : RUN echo "demo best practise 02" ---> Running in e90dae9440c2demo best practise 02Removing intermediate container e90dae9440c2 ---> 09bf3b4238b8Step 4/4 : ENTRYPOINT [ "/bin/sh" ] ---> Running in 2ec19670cb14Removing intermediate container 2ec19670cb14 ---> 9a552fa08f73Successfully built 9a552fa08f73Successfully tagged demo:0.0.4
可以看到,
- 虽然和
3rd build
使用的Dockerfile
相同, 但由于没有缓存,每一层都是重新 build 的。 - 虽然
demo:0.0.3
和demo:0.0.4
在功能上是一致的。但是 他们的 layer 不同, 从根本上来说,他们是不同的镜像。
结论
1. 合理分层、构建一个精良的基础镜像
一个相对固定的
build
环境善用
cache
构建
自己的基础镜像
:其中就包括了a. 安全补丁b. 权限限制c. 基础库依赖安装d. 等...
2. 精简为美:一屋不扫何以扫天下
- 使用
.dockerignore
保持context
干净 - 容器镜像环境清理a. 缓存清理b.
multi stage build
尼恩提示:以上答案,所包含的技术细节比较多,具体请参见《尼恩Java面试宝典》最新版。
参考文献
docker storage driver
: https://docs.docker.com/storage/storagedriver/dockerfile best practices
: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/multi-stage
: https://docs.docker.com/develop/develop-images/multistage-build/
推荐阅读:
《响应式圣经:10W字,实现Spring响应式编程自由》
《全链路异步,让你的 SpringCloud 性能优化10倍+》
《Linux命令大全:2W多字,一次实现Linux自由》
《网易二面:CPU狂飙900%,该怎么处理?》
《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》
《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》
《场景题:假设10W人突访,你的系统如何做到不 雪崩?》
《2个大厂 100亿级 超大流量 红包 架构方案》
《Nginx面试题(史上最全 + 持续更新)》
《K8S面试题(史上最全 + 持续更新)》
《操作系统面试题(史上最全、持续更新)》
《Docker面试题(史上最全 + 持续更新)》
《Springcloud gateway 底层原理、核心实战 (史上最全)》
《Flux、Mono、Reactor 实战(史上最全)》
《sentinel (史上最全)》
《Nacos (史上最全)》
《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》
《clickhouse 超底层原理 + 高可用实操 (史上最全)》
《nacos高可用(图解+秒懂+史上最全)》
《队列之王: Disruptor 原理、架构、源码 一文穿透》
《环形队列、 条带环形队列 Striped-RingBuffer (史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》
《红黑树( 图解 + 秒懂 + 史上最全)》
《分布式事务 (秒懂)》
《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》
《缓存之王:Caffeine 的使用(史上最全)》
《Docker原理(图解+秒懂+史上最全)》
《Redis分布式锁(图解 - 秒懂 - 史上最全)》
《Zookeeper 分布式锁 - 图解 - 秒懂》
《Netty 粘包 拆包 | 史上最全解读》
《Netty 100万级高并发服务器配置》
极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数
环球时讯:怎样的目标管理能真正实现目标?做到这3点就对了
开心档之Java 流(Stream)、文件(File)和IO
【焦点热闻】舍利子制作方法居然也有发明专利 网友:得道高僧等级速升外挂
世界即时:跑腿师傅诉苦:男子订一束花送五个女生均被拒 还被扣款差评
微软将用UUP方式推送.NET更新:“可选更新”终于可控
钉钉iOS版喜迎更新:支持定时消息 再不怕打扰别人休息了
天天热讯:《星际争霸2》新晋中国世界冠军李培楠:别给暴雪送钱 不要买!
天天最新:CSS 盒模型和 box-sizing 属性
环球讯息:全志h616,Ubuntu,python3.9环境搭建
【全球新要闻】【关系型数据库】事务特性及事务隔离级别
软件自动化测试高频面试题
环球百事通!游戏帧数暴增84% 英特尔锐炫显卡新老驱动对比
当前动态:山东多人无视劝阻赶海 1人溺水遇难:必须小心这4点
世界即时看!价值7万的爱马仕包运输途中被烧毁!顺丰:如果是我们的问题 会进行处理
天天速看:男子给女友转账140万分手想要回:女方最终被判返还40万
每日热门:媒体曝苹果扩大在印产量障碍重重:这品控看完避雷
新资讯:时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
环球速读:AI照骗恐怖如斯!美女刷屏真假难辨 网友:警惕AI网恋诈骗
【全球时快讯】万元级最香!ROG四款满血笔记本齐上阵:魔霸新锐2023首发9999元手慢无
SQL工具性能实测:居然比Navicat还快,数百万行数据导出仅51秒
当前要闻:从上至下遍历二叉树---队列的性质
全球焦点!00后男生长期把可乐当水喝:牙全坏
《巫师3》次时代版热修复上线:解决4.01版性能问题
MINI纯电Countryman谍照
世界简讯:贾跃亭再被执行2.4亿:总额超42亿!自称FF91四月交付
车主称凯迪拉克新车刹车失灵高速上撞车 网友:这次支持4S
焦点要闻:xxl-job~为宿主机添加定时备份数据库的程序
扬汤止沸是什么意思?扬汤止沸是做功还是热传递?
生活中测量质量的工具有哪些?生活中测量质量的工具研究背景
每日观点:199元!小米30W无线车充开售:电动夹臂 iPhone也能用
天天快资讯:荣耀Magic5系列样张首曝光 AI无人抓拍或刷新拍照速度革命 2月27日全球发布!
全球头条:首发7999起 机械师曙光16 Pro开启预售:可选13代i9+RTX 4070
通讯!13倍浓缩:日本隅田川胶囊咖啡1.2元/杯大差价抄底
你最信任哪家快递公司?数千网友近一半投票给了它
露蜂房和蜂房有什么区别?露蜂房的功效和作用是什么?
漫画长歌行的结局是什么?漫画长歌行什么时候恢复更新?
汉武帝叫什么名字?汉武帝之后的皇位顺序
屏幕分辨率调不了是什么原因?屏幕分辨率调不了怎么解决?
荣事达手机怎么刷机?荣事达手机所有型号
海尔洗衣机e4怎么解决?海尔洗衣机故障代码大全
上海和首尔哪个更发达?上海和首尔咖啡馆数量
骁龙616处理器怎么样?骁龙616处理器相当于麒麟多少?
环球要闻:矩阵中的路径
当前速读:CF1753EF
环球微资讯!机器学习-决策树
三分钟使用chatGPT
全球观天下!关于Linux从内核启动选项中开启对ipv6的支持
京东券在哪里领?京东券怎么使用?
压力给到合资燃油车!比亚迪秦PLUS DM-i冠军版上市5天订单破2.5万
每日热闻!真我GT Neo5成为史上最畅销的安卓1TB手机:首销被抢购一空
热点!非机械键盘不买?你可能不了解薄膜键盘
天天报道:一箱油跑1100km 五菱凯捷混动铂金版将上市:演员周迅成首位车主
控制空调、收音机 无缝显示油量!全新一代苹果Carplay年底推出
全球百事通!面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
天天讯息:从青铜到王者,揭秘 Serverless 自动化函数最佳配置
Linux常用命令
微资讯!转移国内工厂 彻底摆脱中国制造?印度坑惨苹果 iPhone良品率不到50%
环球快播:一次性带走29包 奥利奥缤纷零食大礼包狂促:券后29.9元
世界滚动:比小米猛!曝Redmi K60将推出1TB版本:彻底解决微信存储焦虑
重庆阿姨参加免费活动微信被封 腾讯客服:发布刷单欺诈消息 已解封
天天精选!索尼出品!《圣斗士星矢》真人电影最新预告发布 4月28日上映
每日聚焦:UiPath 初探
canvas画板(鼠标和触摸)
天天速看:史上最大客机订单!印度航空采购波音、空客近500架客机
全球消息!199元 小米米家智能电子血压计众筹:支持联网远程监测
观天下!你怎么看?国内多地学校尝试推作业熔断机制:超过9点无条件停做
“中国复眼”二期开工!事关我国近地小行星撞击防御
环球热资讯!天选之子!女子来西安旅游买30元彩票中了1800万 网友调侃又骗我买彩票
【当前热闻】读Java实战(第二版)笔记10_函数式编程的技巧
历史一刻!欧洲宣布禁止燃油车 时间确定:中国新能源汽车笑了
天天资讯:2 - 【RocketMQ 系列】CentOS 7.6 安装部署RocketMQ
【全球快播报】前端安全--CSRF攻防
期末复习——操作系统概述 chapter(0+1)
全球热文:期末复习——进程与线程
精选!暴雪服务器消失后 《星际争霸2》多了个中国世界冠军
ChatGPT火爆 韩国厂商天降喜事:HBM内存价格涨了5倍
热门看点:情人节晚上 我的被窝里只有童年回忆杀
离开太阳系!旅行者号要给外星人讲讲人类的爱情
创建.a静态库, framework静态库
环球资讯:Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
天天通讯!索尼正在研究如何把PS5塞进桌斗里:抱着送人太沉了
全球热消息:广汽埃安开放18城免费充电站:两个半月 所有品牌都能充
环球观察:顺丰寄6.5万元爱马仕包 运输中被烧毁:官方不给事故证明
期末复习——网络层
今日报丨chatgpt的时代,先用gpt3来做一个哪里都可以接入的代码吧
观焦点:《分布式技术原理与算法解析》学习笔记Day11
世界滚动:日本火山时隔5年再次活动 火山灰喷到2400米高:已3级警戒
Vue 插值语法与指令系统
全球要闻:「CSP-J2020」 直播获奖 —— 桶排序例题
面向老师的单机版“数学系统math”
自学前端最容易犯的10个的错误,新手学前端快来看看
天天热门:情人节礼物 三星Galaxy S23系列手机国行发布:12+1TB顶配12699元
焦点速读:比小米13屏幕更小!三星Galaxy S23预售:5199元起
精彩看点:男子情人节让老婆洗鞋 每双鞋放520元:结局够绝!钱收了鞋归位
邓超情人节送孙俪一盆菜 被赞深得我心:网友一句话暖心
全球动态:韩国民众向土耳其捐大量脏衣服引全球网友吐槽:太没品 还不如不捐
当前快播:白嫖一个WebAPI限流解决方案
音乐 APP 用户争夺战,火山引擎 VeDI 助力用户体验升级!
能用到安卓17 三星承诺Galaxy S23系统升级4代、5年安全更新