CentOS 8的ISO安装文件有10个G这么大,但是我们拉取的centos:8的镜像居然只有231M,这是为什么呢?本文将分析背后的原因。

docker下在镜像太慢 docker镜像为什么这么小_centos

镜像的大小

使用docker后,如果我们需要一套CentOS的环境,我们直接拉取centos的镜像,然后以这个镜像运行容器就可以了:

docker下在镜像太慢 docker镜像为什么这么小_linux_02

那是不是这个centos:8镜像就包含了CentOS整个操作系统呢?
最简单直接当然可以这么干!

但是这样的话,镜像文件会非常大!

可以看到CentOS 8.5的ISO安装包文件居然有10G这么庞大!

docker下在镜像太慢 docker镜像为什么这么小_centos_03

但是再看看我们的镜像centos:8,居然只有231M,几乎是完整的ISO文件的1/50!

docker下在镜像太慢 docker镜像为什么这么小_容器_04

操作系统内核

我们需要分清楚两个概念:

  1. Linux内核:Linux内核是Linux操作系统的核心, 负责硬件管理。
  2. 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提供的两个功能模块:

  1. Namespace: 用于容器的隔离,比如在容器A中不能看到容器B的进程
  2. Cgroups: 用于容器的资源控制,比如可以为容器单独指定内存和CPU资源

总之,效果就是要让容器看起来像一个虚拟机。

这也解释了我们在Windows安装时,为什么需要先安装WSL2的原因!
因为WSL2(适用于 Linux 的 Windows 子系统,版本 2)拥有Linux内核!

Linux文件系统的bootfs和rootfs

CentOS的镜像为什么这么小,这就得从Linux的文件系统说起。

典型的Linux文件系统包含两个文件系统,bootfsrootfs

bootfs有包含了Kernel和bootloader,bootloader会引导加载Kernel。

rootfs包含了典型Linux的命令、目录和文件:/dev /bin /etc等

docker下在镜像太慢 docker镜像为什么这么小_centos_05

容器设计

要解决这个问题,镜像就不能包含整个操作系统,只能包含最最基本的部分,其它部分需要由外部提供!
实现时,Docker容器使用的宿主机的内核(Kernel),所以镜像才变得小了很多!

这就是和容器和传统虚拟机最大的区别!

  • 虚拟机架构:右图中的虚拟机架构中,每个虚拟机中都安装了一个完整的操作系统!
  • 容器化架构:左图中的容器化架构中只有一个操作系统,就是Docker容器运行的宿主机的操作系统!宿主机上的容器和宿主机共享一个操作系统内核Kernel!

docker下在镜像太慢 docker镜像为什么这么小_docker下在镜像太慢_06

  • 容器使用是宿主机的内核Kernel。

docker下在镜像太慢 docker镜像为什么这么小_docker_07