寻根究底,为什么Docker中的Alpine Linux镜像能这么小

news2024/11/15 22:50:08

去年我发表了文章对Docker基础镜像的思考,该不该选择alpine,其中对于Alpine Linux镜像如此之小的原因我解释为它使用了musl而不是glibc

有人发现并指出了我的这个错误,说musl与glibc的大小差别不足以造成如此大的差距,应该别有原因。

我一直记着这事,最近抽时间再次研究了下,确实如其所说,Alpine Linux之所以这么小的原因,虽然musl是其中一个原因,但它是多种因素导致的。

在此我有必要表示歉意,同时我需要补充这篇文章,对于Alpine Linux之所以这么小,再解释的更清楚一些。

Debian与Apline

1. 探究

在这篇文章中,我以Docker中的AlpineDebian镜像来详细对比它们的大小,及导致它们大小的原因。我们都知道,Debian比Ubuntu更精简,这样对比会更有价值。

1.1 镜像大小

通过docker images ls命令,可以查出这两个镜像当前的latest版本的大小对比

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
debian       latest    5c8936e57a38   3 weeks ago   124MB
alpine       latest    042a816809aa   3 weeks ago   7.05MB

其中debian的大小为124M,而alpine的大小只有7.05MB左右,大小相差还是非常明显的.

接下来,我将探究为它们究竟差别在哪

1.2 探究方法

通过du -s * | sort -nr计算文件夹大小,不断寻找两个镜像中的大小差别比较明显的一些关键目录

1.3 结果

与大小有关的关键目录如下:(仅列出差别较大的关键目录)

Debian

36M	  /usr/lib/x86_64-linux-gnu
31M	  /usr/share/locale
13M	  /usr/share/doc
8.2M  /lib/x86_64-linux-gnu
6.1M  /var
5.2M  /bin
4.0M  /sbin

Alpine

828.0K	/bin
72.0K	/var

2. 分析

通过上述目录,可以大致分析出, Alpine镜像能如此之小的原因大致能区分为几大类

第一:删除部分非必须的资源文件

可以看出,这两个目录在Alpine中压根没有

  • /usr/share/locale: 国际化文件
  • /usr/share/doc: 帮助文档

可以推断,Alpine删除了类似的无用的资源文件,没有它们并不影响系统的运行

第二:使用musl,而非glibc

/usr/lib/x86_64-linux-gnu/lib/x86_64-linux-gnu这两个目录大多是glibc,libc,perl等的共享类库所有目录。如我在以前的文章中所述,Alpine中没有使用glibc,而是使用了musl,所以这一部分占据的大小也小了很多。

同时,通过在musl官网与glibc官网查阅它们的压缩安装包大小分别是:

# musl
1.1MB musl-1.2.3.tar.gz
# glibc
18M  glibc-2.3.6.tar.gz
123K glibc-libidn-2.3.6.tar.gz
320K glibc-linuxthreads-2.3.6.tar.gz
1.8M glibc-ports-2.16.0.tar.gz 

可以看出,光是安装包就有20倍左右的差别,安装后当然相差更大。

第三: 使用了busybox工具集

同样,分析上面的目录,会发现一个有趣的现象,Debian中的/bin/sbin目录大小明显高于Alpine的/bin,这又是为什么呢?

这是因为,Apline使用的是busybox这个工具集。那busybox是什么呢?

你可以把busybox理解为bin命令的瑞士军刀。

我们都知道,Linux中我们依赖各种命令去操作系统,比如cd,ls,pwd等,这些命令每个都是一个个可执行文件

而busybox也是一个可执行文件,但它与众不同,它是包含了常用的300多个命令的工具集

看代码更容易理解

# 功能与ls类似
busybox ls
# 功能与pwd类似
busybox pwd
# 功能与kill类似
busybox kill

现在你明白了吗,Apline中压根没有ls,pwd这些类似其它Linux发行版本中的执行文件,它全部都只是busybox的alias而已

也就是,Alpine中最主要的一个命令文件,就是busybox,而busybox是一个5M不到大小的,包含近300多个命令的工具集

是不是bin命令的瑞士军刀?

第四: 没有apt与systemd

在Debian/Ubuntu中,包管理是apt。同样,Debian与大都数Linux类似,都是使用的systemd

但在Alpine中,apk取代了apt,Alpine同样没有使用systemd,而是使用了OpenRC,无论是apt还是OpenRC,都是轻而小的实现

3. 结论

现在,我能比上一次稍微准确的说出Alpine能这么小的原因了。

大致为:

  1. Alpine中删除了一些不影响系统运行的辅助性资源文件
  2. 使用Musl取代了Glibc
  3. 使用了BusyBox,Apt以及OpenRC等一些轻量级实现

从这些做法上也能看出,Alpine的定位不是普通的Linux系统,它应该是为嵌入式Linux而生,几MB的系统大小,当然更适合嵌入式Linux。

这也从另一个角度充分说明Linux系统的优秀,也就是只需要一个Linux内核,其它外围的一切几乎都是可以替代的,而仍然能保证Linux系统的运行与一致性。

幸运的是,Linux内核是开源的。而正因为它是开源的,今天Linux才能造福世界。


文章原载于个人网站 微言码道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++-静态局部变量

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 特征: 1.需添加关键字static。 2.在静态存储区分配内存,始终存在直到程序结束。 3.作用域为局部&#…

阿⾥云Apsara Clouder云计算专项技能认证:云服务器ECS⼊门【 个⼈所得税年度应纳税额抵扣 3600(0成本)】

文章目录 引言I 云服务器ECS⼊门II 考试III 个⼈所得税app填写专项附加扣除引言 适合⼈群:需要交个⼈所得税的上班族,有⼀定计算机基础结果:⼯资年收⼊10-20万的,能省下360元(3600*10%)I 云服务器ECS⼊门 云服务器(Elastic Compute Service, 简称ECS),是一种简单高效,…

PDPS教程:机器人气动点焊焊枪大开与小开运动状态自动切换设置

目录 概述 气动点焊焊枪运动状态设置 机器人气动点焊焊枪工具类型定义 气动点焊焊枪运动状态切换原理 气动点焊焊枪大开与小开状态切换设置 机器人仿真运行 概述 工业机器人点焊焊接过程中,为了提高焊接效率、优化焊接节拍、降低能源消耗,通常会在…

2022尚硅谷SSM框架跟学(八)Spring MVC基础三

2022尚硅谷SSM框架跟学 八 Spring MVC基础三8.RESTful案例8.1准备工作8.2功能清单8.3.具体功能:访问首页(1).配置view-controller(2).创建页面8.4具体功能:查询所有员工数据(1).控制器方法(2).创建employee_list.html8.5具体功能:删除(1).创建…

企业电子招投标采购系统源码之功能模块功能描述

​ 功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…

激光焊接/点焊的特性及优势分析?

目前应用于生产的点焊方式大多为电阻点焊、电弧点焊、激光点焊和胶接点焊等多种点焊方法。其中激光焊接是激光材料加工技术应用的重要方面之一。 激光点焊机主要由激光器、电源及控制、冷却机、导光及调焦、双目体视显微观察几部分构成,结构紧凑,体积小…

Android中对图片的操作,移动、缩放、涂鸦和保存到图库

一、实现方法 监听用户手势,提取用户操作 (1)移动: 分别计算X,Y轴的结束与初始之间移动偏移的量 (2)缩放:(结束两指间距离伸缩比例)/ 初始两指间距离,scaleX…

云计算|OpenStack|社区版OpenStack安装部署文档(五 --- 计算服务nova安装部署---Rocky版)

前言: nova服务是openstack最重要的一个组件,没有之一,该组件是云计算的计算核心,大体组件如下: OpenStack Docs: Compute service overview 挑些重点,nova-api,libvirt,nova-pla…

最小生成树与最短路径

目录 一.最小生成树 1.1概念 1.2Kruskal算法 1.3Prim算法 二.最短路径 2.11单源最短路径--Dijkstra算法 2.1.2单源最短路径--Bellman-Ford算法 一.最小生成树 1.1概念 连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去…

虹科分享|论企业网络安全的重要性

拥有有效的企业网络安全不仅仅是让你的员工创建一个不是他们宠物名字的密码--除非他们的猫的名字至少有12个字符长,由大小写字母和符号组成。无论是经过充分研究的鱼叉式钓鱼尝试,还是绕过MFA,威胁者都变得更加大胆。随着全球各行业数据泄露事…

判断是否为平衡树

对二叉树有困惑的小伙伴可以看一下我之前的文章:二叉树(一)_染柒_GRQ的博客-CSDN博客二叉树(二)_染柒_GRQ的博客-CSDN博客二叉树(三)_染柒_GRQ的博客-CSDN博客点击上方链接即可查看。题目110. 平…

Ext2explore查看ext2/ext3/ext4 file

比如想查看Android system.img,file看起来是ext2文件,file system.img system.img: Linux rev 1.0 ext2 filesystem data, UUID49e89c77-3dc4-553f-a392-7d11ff348228 (extents) (large files) (huge files)2、windows下怎么看呢,Ext2explore…

Springboot——常用注解及实例

一、常用注解解释:ConfigurationBeanResourceSpringBootApplicationRestControllerRestController 注解包含了原来的 Controller 和 ResponseBody 注解,使用过 Spring 的朋友对 Controller 注解已经非常了解了,这里不再赘述, Resp…

【BSV应用范例】区块链上的自我主权身份

发表时间:2022年6月27日 信息来源:bsvblockchain.org 自我主权身份(SSI)只是一个空想吗? (全球区块链组织联合创始人)Jorge Sebastio对此表示:“并非如此!” 更重要的是…

OS 学习笔记(7) 虚拟机

OS 学习笔记(7) 虚拟机 这篇笔记对应的王道OS 1.6 虚拟机,同时参考了 《Operating System Concepts, Ninth Edition》和 俗称ostep的《 Operating Systems: Three Easy Pieces》还有 《Operating Systems: Principles and Practice》 文章目录OS 学习笔记(7) 虚拟机…

软件测试之Android单元测试

根据维基百科的解释,单元测试又称为模块测试。是针对程序单元来进行正确性校验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序,函数,过程等,对于面向对象编程,最小单元…

STL——string类

一、标准库中的string类 1.string类文档介绍 (1)字符串是表示字符序列的类。 (2)标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特…

IOS逆向--恢复Dyld的内存加载方式

之前我们一直在使用由dyld及其NSCreateObjectFileImageFromMemory/NSLinkModule API方法所提供的Mach-O捆绑包的内存加载方式。虽然这些方法我们今天仍然还在使用,但是这个工具较以往有一个很大的区别…现在很多模块都被持久化到了硬盘上。 roguesys 在 2022 年 2 …

还在用 OpenFeign?来试试 SpringBoot3 中的这个新玩意!

好久没发技术文章了,最近回到工作地,晚上有空又可以码码技术了,今天我们就来聊一个 Spring Boot3 中的新鲜玩意,声明式 HTTP 调用。 1. 由来 Spring Boot3 去年底就已经正式发布,我也尝了一把鲜,最近有空…

(02)Cartographer源码无死角解析-(53) 2D后端优化→位姿图优化理论(SPA)讲解、核型函数调用流程

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…