序言:前两章我们主要介绍了Docker的概念和体系,以及Docker的镜像和容器命令,这一章我们将深入Docker镜像以及熟悉Docker的容器数据卷。OK,我们开始第三章的学习吧。
Docker镜像加载原理:
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system):主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) :在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

1.2 base镜像
在了解base镜像之前,我们先说一下dockerFile,之前我们把镜像比作类、容器比作实例,如果有人不理解dockerFile的话,那么横向对比,你可以把它看作是 .class 文件。
那么base镜像就是 没有 FROM 或者 FROM scratch开头的 DockerFile所构建出来的镜像
base镜像通常都是各种 Linux发行版的镜像,如 Centos,Ubuntu,Debian 等
且base 镜像提供的是最小安装的Linux发行版,此外 Docker Hub上 99% 的镜像都是通过在base镜像中安装和配置需要的软件构建而来
下图是 官方 Centos 镜像 的 DockerFile内容

1.3 镜像Commit
docker commit
提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
案例演示
1. 从Hub 上下载tomcat镜像到本地并成功运行 (也可采用阿里云加速下载)
docker pull tomcat

2. 故意删除上一步镜像生产tomcat的文档
注:如果不想新开窗口,可以 后台启动 tomcat ( docker run -d -p 8888:8080 tomcat )
docker exec -it 088c813ad8ca /bin/bash

3. 提交删除文档的 tomcat容器副本 作为一个新的镜像
docker commit -a="coke" -m="del tomcat docs" 088c813ad8ca coke/tomcat02:1.2

4. 运行我们上传成功的测试镜像
docker run -it -p 8888:8080 coke/tomcat02:1.2

2. Docker容器数据卷
2.1 基本介绍
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了保存数据,使容器之间可以进行数据共享,在Docker 中我们使用容器数据卷。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
主要用途: 1. 容器的持久化 2. 容器间继承 + 共享数据
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止

2.2 数据卷
我们接下来进行操作,尝试在容器 或者 DockerFile中 添加数据卷