百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

nanshan 2025-01-29 17:14 12 浏览 0 评论

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

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

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

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

1. 探究

在这篇文章中,我以Docker中的Alpine与Debian镜像来详细对比它们的大小,及导致它们大小的原因。我们都知道,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才能造福世界。

相关推荐

Linux 的磁盘系统,和你了解的Windows差别很大

我的C盘去哪了?一个系统,如果没有存储,那么也就不能称之为系统。存储性是一个完整系统的重要组成部分。例如AWS最开始的服务就是S3(用来存储数据的云服务),足以见得存储对于一个应用平台是多么的重要。...

一文读懂 Linux 硬盘挂载:从问题到解决方案

各位互联网大厂的后端开发伙伴们!在咱们日常工作中,操作Linux系统是常有的事儿吧。你们有没有遇到过这样的场景:新添加了一块硬盘,满心欢喜准备用来存储重要数据或者部署新的应用服务,却突然发现不知道...

硬盘分区(硬盘分区格式)

 磁盘(硬盘)分区,可以分C、D、E等分区,大家可能都会用,会根据自已的需要确定所需的空间,但分区是如何工作的呢,内容如下。Windows中有3类:MBR分区:MasterBootRecord,也...

parted命令工具分区介绍(particle命令)

linux系统磁盘分区通常可以使用fdisk和parted命令,当分区大小小于2TB的时候,两种皆可以使用,当分区大于2TB的话,就需要用parted分区。以下介绍parted命令相关使用,以sdb为...

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。NAME列显示设备名称(如sda、nvme0n1)。TR...

Linux分区命令fdisk和parted使用介绍

摘要:一般情况下,Linux分区都是选择fdisk工具,要求硬盘格式为MBR格式,能支持的最大分区空间为2T。但是目前在实际生产环境中使用的磁盘空间越来越大,呈TB级别增长;而常用的fdisk这个工具...

linux 分区原理与名词解释(linux操作系统中的分区类型)

分区的意义将磁盘分成几份,每份挂在到文件系统的那个目录在linux里的文件系统Ext2:早期的格式,不支持日志功能Ext3:ext2改良版,增加了日志功能,是最基本且最常用的使用格式了Ext4:针对e...

linux 分区合并(linux合理分区)

查看虚拟机当前磁盘挂载情况fdisk-l选择磁盘fdisk/dev/sda查看磁盘分区情况p重新选择分区n选择主分区p保存w创建物理卷pvcreate/dev/sda3查看物理卷信息pvdi...

如何在 Linux 系统中永久禁用交换分区 ?

Linux操作系统中的交换分区或交换文件充当硬盘上的临时存储区域,当物理内存(RAM)满时,系统使用该存储区域。它用于交换较少使用的内存页,这样系统就不会因为运行应用程序而耗尽物理内存。随着技术的发...

Linux 如何知道硬盘已用多少空间、未用多少空间

刚出社会时,去了一家公司上班,老板为了省钱,买的服务器是低配的,硬盘大小只有40G,有一次网站突然不能访问了,排查半天才知道原来服务器的硬盘空间已用完,已无可用空间。第一步是查看硬盘的使用情况,第二步...

用Linux系统管理磁盘空间 就该这么来

要想充分有效的管理使用Linux系统中的存储空间,用户必须要做的就是双管齐下,一边扩充空间一边限制空间。不得不说的就是很多时候磁盘空间就像水资源,需节制水流。说到要如何实现限制空间就离不开使用LVM技...

Windows 11 磁盘怎么分区?(windows11磁盘怎么分区)

Windows11磁盘分区技术解析与操作指南:构建高效存储体系一、磁盘分区的技术本质与系统价值磁盘分区作为存储系统的基础架构,通过逻辑划分实现数据隔离与管理优化。Windows11采用NTF...

linux上创建多个文件分区,格式化为 ext2、ext3、ext4、XFS 文件

以下是在Linux系统上创建多个20GB文件分区并格式化为不同文件系统的分步指南:步骤1:创建基础文件(4个20GB文件)bash#创建4个20GB稀疏文件(实际占用空间随写入量增长)ddif=/...

救命的U盘低格哪家最强?(低格优盘)

周二时有位童鞋留言说U盘之前做过引导盘,现在格式化不了,用各种工具都不行,而且因为U盘厂商的关系,查不到U盘主控,无法量产恢复,特来求助。小编花了点时间特意弄坏一个U盘分区,终于试出方法了,特来分享一...

Linux 查看硬件磁盘存储大小和磁盘阵列(RAID)的组合方式

一、查看硬件磁盘存储大小查看所有磁盘信息:#lsblk该命令会列出所有磁盘(如/dev/sda、/dev/nvme0n1)及其分区和挂载点。查看磁盘总容量:fdisk-l#或parted-...

取消回复欢迎 发表评论: