CentOS 8的ISO安装文件有10个G这么大,但是我们拉取的centos:8的镜像居然只有231M,这是为什么呢?本文将分析背后的原因。
镜像的大小
使用docker后,如果我们需要一套CentOS的环境,我们直接拉取centos的镜像,然后以这个镜像运行容器就可以了:
那是不是这个centos:8
镜像就包含了CentOS整个操作系统呢?
最简单直接当然可以这么干!
但是这样的话,镜像文件会非常大!
可以看到CentOS 8.5的ISO安装包文件居然有10G这么庞大!
但是再看看我们的镜像centos:8
,居然只有231M,几乎是完整的ISO文件的1/50!
操作系统内核
我们需要分清楚两个概念:
- Linux内核:Linux内核是Linux操作系统的核心, 负责硬件管理。
- Linux发行版:Linux发行版是在Linux内核的基础上添加了一些工具软件,相当于定制化。
CentOS和Ubuntu,都是Linux发行版,他们都是基于某一个版本的Linux内核。
在CentOS系统上查看Linux使用的内核:
# cat /proc/version
Linux version 3.10.0-957.1.3.el7.x86_64 ...
Docker实现是基于Linux内核Kernel提供的两个功能模块:
- Namespace: 用于容器的隔离,比如在容器A中不能看到容器B的进程
- Cgroups: 用于容器的资源控制,比如可以为容器单独指定内存和CPU资源
总之,效果就是要让容器看起来像一个虚拟机。
这也解释了我们在Windows安装时,为什么需要先安装WSL2的原因!
因为WSL2(适用于 Linux 的 Windows 子系统,版本 2)拥有Linux内核!
Linux文件系统的bootfs和rootfs
CentOS的镜像为什么这么小,这就得从Linux的文件系统说起。
典型的Linux文件系统包含两个文件系统,bootfs
和rootfs
。
bootfs有包含了Kernel和bootloader,bootloader会引导加载Kernel。
rootfs包含了典型Linux的命令、目录和文件:/dev /bin /etc等
容器设计
要解决这个问题,镜像就不能包含整个操作系统,只能包含最最基本的部分,其它部分需要由外部提供!
实现时,Docker容器使用的宿主机的内核(Kernel),所以镜像才变得小了很多!
这就是和容器和传统虚拟机最大的区别!
- 虚拟机架构:右图中的虚拟机架构中,每个虚拟机中都安装了一个完整的操作系统!
- 容器化架构:左图中的容器化架构中只有一个操作系统,就是Docker容器运行的宿主机的操作系统!宿主机上的容器和宿主机共享一个操作系统内核Kernel!
- 容器使用是宿主机的内核Kernel。