首页 > 代码库 > base 镜像 - 每天5分钟玩转容器技术(10)

base 镜像 - 每天5分钟玩转容器技术(10)

上一节我们介绍了最小的 Docker 镜像本节讨论 base 镜像。

base 镜像有两层含义

  1. 不依赖其他镜像从 scratch 构建。

  2. 其他镜像可以之为基础进行扩展。

所以能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像比如 Ubuntu, Debian, CentOS 等。

我们以 CentOS 为例考察 base 镜像包含哪些内容。
下载镜像

docker pull centos

查看镜像信息

技术分享

镜像大小不到 200MB。

等一下
一个 CentOS 才 200MB
平时我们安装一个 CentOS 至少都有几个 GB怎么可能才 200MB !

相信这是几乎所有 Docker 初学者都会有的疑问包括我自己。下面我们来解释这个问题。

Linux 操作系统由内核空间和用户空间组成。如下图所示

技术分享

rootfs

内核空间是 kernelLinux 刚启动时会加载 bootfs 文件系统之后 bootfs 会被卸载掉。

用户空间的文件系统是 rootfs包含我们熟悉的 /dev, /proc, /bin 等目录。

对于 base 镜像来说底层直接用 Host 的 kernel自己只需要提供 rootfs 就行了。

而对于一个精简的 OSrootfs 可以很小只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版CentOS 的 rootfs 已经算臃肿的了alpine 还不到 10MB。

我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等需要好几个 GB 就不足为奇了。

base 镜像提供的是最小安装的 Linux 发行版

下面是 CentOS 镜像的 Dockerfile 的内容

技术分享

第二行 ADD 指令添加到镜像的 tar 包就是 CentOS 7 的 rootfs。在制作镜像时这个 tar 包会自动解压到 / 目录下生成 /dev, /porc, /bin 等目录。

注可在 Docker Hub 的镜像描述页面中查看 Dockerfile 。

支持运行多种 Linux OS

不同 Linux 发行版的区别主要就是 rootfs。

比如 Ubuntu 14.04 使用 upstart 管理服务apt 管理软件包而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别Linux kernel 差别不大。

所以 Docker 可以同时支持多种 Linux 镜像模拟出多种操作系统环境。

技术分享

上图 Debian 和 BusyBox一种嵌入式 Linux上层提供各自的 rootfs底层共用 Docker Host 的 kernel。

这里需要说明的是

  1. base 镜像只是在用户空间与发行版一致kernel 版本与发型版是不同的。
    例如 CentOS 7 使用 3.x.x 的 kernel如果 Docker Host 是 Ubuntu 16.04比如我们的实验环境那么在 CentOS 容器中使用的实际是是 Host 4.x.x 的 kernel。 
    技术分享
    ① Host kernel 为 4.4.0-31
    ② 启动并进入 CentOS 容器
    ③ 验证容器是 CentOS 7
    ④ 容器的 kernel 版本与 Host 一致

  2. 容器只能使用 Host 的 kernel并且不能修改。
    所有容器都共用 host 的 kernel在容器中没办法对 kernel 升级。如果容器对 kernel 版本有要求比如应用只能在某个 kernel 版本下运行则不建议用容器这种场景虚拟机可能更合适。

下一节我们讨论镜像的分层结构。

技术分享

base 镜像 - 每天5分钟玩转容器技术(10)