本文已参与「新人创作礼」活动,一起开启掘金创作之路。
大家好,本篇文章带大家简单了解下Docker的数据管理,Docker提供了三种数据管理方式,且各有各的特点,使得Docker数据的存储更为灵活。
Docker数据存储机制
使用Docker,操作的都是镜像和有镜像生成的容器。而Docker镜像是通过读取Dockerfile文件中的指令构建的,Dockerfile文件中每条指令都会创建一个镜像层,并且每层是只读的,一系列的镜像层就构成了Dockerfile镜像。
# Dockerfile文件
FROM ubuntu:16.04
COPY . /app
RUN make /app
CMD python /app/app.py
上面4条指令,每条指令都会创建一个镜像层,其中每一层与前一层都有所不同,并且是层层叠加的。通过镜像构建容器时,会在镜像层上增加一个容器层(即可写层),所有对容器的更改都会写入容器层,这也是Docker默认的数据存储方式。
从图8-19可以看出,Docker容器和镜像之间的主要区别是顶部的容器层,而所有对容器中数据的添加、修改等操作都会被存储在容器层中。当容器被删除时,容器层也会被删除,其中存储的数据会被一同删除,而下面的镜像层却保持不变。
由于所有的容器都是通过镜像构建的,所以每个容器都有各自的容器层,对于容器数据的更改就会保存在各自的容器层中。也就是说,由同一个镜像构建的多个容器,它们会拥有相同的底部镜像层,而拥有不同的容器层,多个容器可以访问相同的镜像层,并且有自己的独立数据状态。
Docker数据存储方式
在默认情况下,Docker中的数据都是存放在容器层的,但是这样存储数据却有较多的缺陷,具体表现如下:
- 当容器不再运行时,容器中的数据无法持久化保存,如果另一个进程需要这些数据,那么将很难从容器中获取数据
- 容器层与正在运行的主机紧密耦合,不能轻易地移动数据
- 容器层需要一个存储驱动程序来管理文件系统,存储驱动程序提供了一个使用Linux内核的联合文件系统,这种额外的抽象化降低了性能
基于上述种种原因,多数情况下Docker数据管理都不会直接将数据写入容器层,而是使用另一种叫做Docker volume数据外部挂载的机制进行数据管理。
针对Docker volume数据外部挂载机制,Docker提供了三种不同的方式将数据从容器映射到Docker宿主机,它们分别为: volumes(数据卷)、bind mounts(绑定挂载)和tmpfs mounts(tmpfs挂载)。这三种数据管理方式的具体选择,需要结合实际情况进行考虑,其中的volumes数据卷是最常用也是官方推荐的数据管理方式。
无论选择使用哪种数据管理方式,数据在容器内看起来都一样的,而在容器外则会被被挂载到文件系统中的某个目录或文件中。
下面通过一张图来展示数据卷、绑定挂载和tmpfs挂载之间的差异
从图中可以看出,Docker提供的三种数据管理方式略有不同,具体分析如下:
- volumes:存储在主机文件系统中(在Linux系统下是存在于/var/lib/Docker/volumes/目录),并由Docker管理,非Docker进程无法修改文件系统的这个部分
- bind mounts:可以存储在主机系统的任意位置,甚至可能是重要的系统文件或目录,在Docker主机或容器上的非Docker进程可以对它们进行任意修改
- tmpfs mounts:只存储在主机系统的内存中,并没有写入到主机的文件系统中
本章内容只是简单带大家了解Docker的数据管理,后面会为大家介绍Docker中Volumes数据卷的管理,敬请期待吧!