深入理解 docker 镜像

docker image 是什么?

镜像(Image)就是一堆只读层(read-only layer)的统一视角。

容器和镜像的关系

一张图可以带你理解:

container = image + 读写层

Docker 项目的核心原理

对于 Dcoker 项目来说,它最核心的原理实际上就是为待创建的用户进程:

    1. 启动 Linux Namespace 配置
    1. 设置指定的 Cgroups 参数
    1. 切换进程的根目录(Change Root)

对于该进程的根目录而言,对应的技术就是rootfs

rootfs 只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。在 Linux 操作系统中,这两部分是分开存放的,操作系统只有在开机启动才会加载指定版本的内核镜像

这就意味着,如果你的应用程序需要配置内核参数、加载额外的内核模块,以及跟内核进行直接的交互,你就需要注意了:这些操作和依赖的对象,都是宿主机操作系统的内核。

image 一致性

所谓 镜像的一致性指的就是 rootfs 里打包的不只是应用,而是整个操作系统的文件和目录,服务所需要的所有依赖,都被封装在了一起

image 设计

Docker 在镜像的设计中,引入了层(layer)的概念。用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。

这个设计的技术主要是用到了一种叫做联合文件系统(Union File System) 的能力
主要的功能就是将多个不同位置的目录联合挂载(union mount)到同一目录下。

docker image 中的 layer

1
2
3
4
5
6
7
8
9
10
11
12
13

$ docker image inspect ubuntu:latest
...
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:f49017d4d5ce9c0f544c...",
"sha256:8f2b771487e9d6354080...",
"sha256:ccd4d61916aaa2159429...",
"sha256:c01d74f99de40e097c73...",
"sha256:268a067217b5fe78e000..."
]
}
  • 只读层
    它是容器的 rootfs 最下面的五层,对应正是 image 镜像的 5 层。他们的挂载方式只能是只读的(ro+wh, 即 readonly+whiteout)

  • Init 层
    它是一个以”-init”结尾的层,夹在只读层和读写层之间。Init 层是 Docker 项目单独生成的一个内部层,专门用来存放 /etc/hosts、/etc/resolv.conf 等信息

这部分主要是 docker run 命令启动时,用户自定义的一些参数

  • 可读写层
    这一层是容器的 rootfs 最上面的一层,它的挂载方式为:rw, 在没有写入文件之前,这个目录是空的。而一旦在容器中进行了写操作,你修改产生的内容就会以增量的方式出现在这个层中。
-------------THANKS FOR READING-------------