
1. Docker核心组件

2. Docker的镜像

镜像的两个特征:
镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。
Docker守护进程会在Docker镜像的 最上层之上,再添加一个可读写层,容器所有的写操作都会作用到这一层中。而如果Docker容器需要写底层Docker镜像中的文件,那么此时就会涉及一 个叫Copy-on-Write的机制,即aufs等联合文件系统保证:首先将此文件从Docker镜像层中拷贝至最上层的可读写层,然后容器进程再对读 写层中的副本进行写操纵。对于容器进程来讲,它只能看到最上层的文件。

3. Docker 仓库
4. Docker 数据卷
Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制。

关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将会全部丢失
存在的问题
存储于联合文件系统中; 不易于宿主机访问; 容器间数据共享不便
删除容器其数据会丢失
解决方案:“卷(volume)” “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定(关联)

Data volumes
数据卷为持久或共享数据提供了几个有用的特性:
1Volume于容器(container)初始化之时即会创建,由base image提供的卷中的数据于此期间完成复制; 数据卷可以在容器之间共享和重用; 更新镜像(image)时不会包括对数据卷的更改; 即使容器(container)自身被删除,数据卷仍保持不变。
Volume的初衷是独立于容器的生命周期实现数据持久化:
默认情况下删除容器之时既不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作; 如果我们删除容器时使用了特殊的选项(类似于linux的"userdel -r"选项)也可以一并删除容器的存储卷,但是生成环境我们不会这样做。
卷为docker提供了独立于容器的数据管理机制(如下图所示):
可以把"镜像"想像成静态文件,例如"程序",把卷类比为动态内容,例如"数据";于是,镜像可以重用,而卷可以共享; 卷实现了"程序(镜像)"和"数据(卷)"分离,以及"程序(镜像)"和"制作镜像的主机"分离,用户制作镜像时无须再考虑镜像运行的容器所在的主机的环境;

Volume types
如下图所示,Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同:
(1)绑定挂载卷(Bind mount volume)
也称为数据卷(类似于挂载的一块磁盘),指向主机文件系统上用户指定位置的卷。换句话说,在宿主机上的路径你需要人工指定一个特定路径,再容器上的路径也需要指定一个特定路径,让这两个已知路径建立关联关系。随着容器删除,存储卷数据并不会丢失。
(2)docker管理的卷(Docker managed volume)
也称为数据容器(将数据保存在一个容器上),Docker守护进程在Docker拥有的主机文件系统的一部分中创建管理卷。换句话说,我们只需要在容器内指定挂载点是什么,而绑定的是宿主机哪个路径下的目录我们不需要管,由容器引擎的docker daemon自行创建一个空目录或者使用一个已存在目录与你的存储卷路径建立关联关系。随着容器删除,存储卷数据也随着丢失了。

应用状态四象限