- 本文作者:
内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别,Linux kernel 差别不大。
所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。

需要注意的是:
-
base镜像只是用户空间和发行版一致。kernel使用的是docker宿主机器的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 一致
关于存储结构(About storage drivers)
上文里展示了如何下载一个base镜像。我们通常是基于这份base镜像来构建我们自己的镜像。比如,在centos里添加一个nginx负载均衡。首先,得需要了解镜像的结构是什么。
官方文档: upload/201902141559535118.jpg" style="box-sizing: inherit; font-size: inherit; line-height: inherit; margin: 0px; padding: 0px; border: 0px; background-repeat: no-repeat; vertical-align: middle; max-width: 70%; height: auto;" alt="" />
(上图来自官方文档,和本次实验内容略有不同,但原理一样)第一列是imageid, 最上面的id就是我们新创建ryan/httpd:latest. 下面几行都是我们dockerfile里定义的步骤堆栈。由此可以看出,每个步骤都将创建一个imgid, 一直追溯到
1e1148e4cc2c正好是我们的base镜像的id。关于<missing>的部分,则不在本机上。最后一列是每一层的大小。最后一层只是启动
bash,所以没有文件变更,大小是0. 我们创建的镜像是在base镜像之上的,并不是完全复制一份base,然后修改,而是共享base的内容。这时候,如果我们新建一个新的镜像,同样也是共享base镜像。那修改了base镜像,会不会导致我们创建的镜像也被修改呢? 不会!因为不允许修改历史镜像,只允许修改容器,而容器只可以在最上面的容器层进行写和变更。
容器的大小
创建镜像的时候,分层可以让docker只保存我们添加和修改的部分内容。其他内容基于base镜像,不需要存储,读取base镜像即可。如此,当我们创建多个镜像的时候,所有的镜像共享base部分。节省了磁盘空间。
对于启动的容器,查看所需要的磁盘空间可以通过
docker ps -s# docker run -d -it centos 4b0df4bc3e705c540144d545441930689124ade087961d01f56c2ac55bfd986d # docker ps -s | grep -E '(ryan|centos)' 4b0df4bc3e70 centos "/bin/bash" 23 seconds ago Up 23 seconds vigorous_elion 0B (virtual 202MB) b36421d05005 ryan/httpd:v1.0 "/usr/sbin/init" 32 minutes ago Up关键字: -
