初识容器--镜像的内部结构
主要基于[cloudman]公众号的相关文章整理,主要用于个人学习与笔记记录,无任何商用目的,侵删
运行并研究hello-world镜像
拉取、查看、运行镜像
-
docker pull从 Docker Hub 下载它 -
docker images hello-world查看镜像的信息 -
docker run运行
镜像中包含的内容
Dockerfile
镜像的描述文件,定义了如何构建 Docker 镜像。
Dockerfile 的语法简洁且可读性强,后面文章中会专门讨论如何编写 Dockerfile。
hello-world 的 Dockerfile 内容如下:
这三条指令:
- FROM scratch:此镜像是从白手起家,从 0 开始构建。
- COPY hello /:将文件“hello”复制到镜像的根目录。
- CMD ["/hello"]:容器启动时,执行 /hello
其中的第2点,镜像 hello-world 中就只有一个可执行文件 “hello”,其功能就是打印出 “Hello from Docker …” 等信息
/hello 就是文件系统的全部内容,连最基本的 /bin,/usr, /lib, /dev 都没有
这种镜像没有实际用途,主要操作的对象是具有基本操作系统的镜像,这种包含基本操作系统,可以由用户安装和配置软件的镜像,是主要的研究对象Base镜像
Base镜像
base镜像的两层含义
- 不依赖其他镜像,从 scratch 构建。
- 其他镜像可以之为基础进行扩展
所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等
基础Base镜像
下面研究研究CentOS的镜像docker pull centos 获取一个CentOS的镜像
查看镜像信息
一个CentOS的镜像不到200MB,解释下这么小的原因:
- Linux 操作系统由内核空间和用户空间组成
其中,内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。
用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
对于Docker的 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。
而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。
所以,base 镜像提供的是最小安装的 Linux 发行版
下面是 CentOS 镜像的 Dockerfile 的内容:
第二行 ADD 指令添加到镜像的 tar 包就是 CentOS 7 的 rootfs。在制作镜像时,这个 tar 包会自动解压到 / 目录下,生成 /dev, /porc, /bin 等目录。注:可在 Docker Hub 的镜像描述页面中查看 Dockerfile
具体如何看到dockerfile,后文中详细说
不同的Base镜像
不同的Base镜像,区别在于,支持运行不同的 Linux OS,就是其中rootfs不同
比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别,Linux kernel 差别不大
所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。Debian 和 BusyBox(一种嵌入式 Linux)上层提供各自的 rootfs,底层共用 Docker Host 的 kernel。
需要说明的是:
- base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的:发行版是Docker中系统的版本,而kernel版本是宿主机的内核版本,二者不一定相同
- 容器只能使用 Host 的 kernel,并且不能修改。如果容器中的应用对内核版本有要求,则使用Docker可能受限