上一节咱们介绍了最小的 Docker 镜像,本节讨论 base 镜像。docker
base 镜像有两层含义:centos
不依赖其余镜像,从 scratch 构建。工具
其余镜像能够之为基础进行扩展。操作系统
因此,能称做 base 镜像的一般都是各类 Linux 发行版的 Docker 镜像,好比 Ubuntu, Debian, CentOS 等。虚拟机
咱们以 CentOS 为例考察 base 镜像包含哪些内容。
下载镜像:
docker pull centos容器
查看镜像信息:基础
镜像大小不到 200MB。扩展
等一下!
一个 CentOS 才 200MB ?
平时咱们安装一个 CentOS 至少都有几个 GB,怎么可能才 200MB !软件
相信这是几乎全部 Docker 初学者都会有的疑问,包括我本身。下面咱们来解释这个问题。file
Linux 操做系统由内核空间和用户空间组成。以下图所示:
rootfs
内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,以后 bootfs 会被卸载掉。
用户空间的文件系统是 rootfs,包含咱们熟悉的 /dev, /proc, /bin 等目录。
对于 base 镜像来讲,底层直接用 Host 的 kernel,本身只须要提供 rootfs 就好了。
而对于一个精简的 OS,rootfs 能够很小,只须要包括最基本的命令、工具和程序库就能够了。相比其余 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。
这里须要说明的是:
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 一致
容器只能使用 Host 的 kernel,而且不能修改。
全部容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。若是容器对 kernel 版本有要求(好比应用只能在某个 kernel 版本下运行),则不建议用容器,这种场景虚拟机可能更合适。
下一节咱们讨论镜像的分层结构。