Docker 的数据持久化-数据卷
场景分析
在
容器层
的 UnionFS(联合文件系统)中对文件或目录的任何修改,无论是手工修改还是容器在运行过程中的修改,在该容器丢失或被删除后,这些修改将会全部丢失。即这些修改是无法保存下来的。若想要保存下来,通常有两种方式:
- 定制镜像持久化 :将这个修改过的容器生成一个新镜像,让这些修改变为只读的镜像;
数据卷持久化 : 将这些修改通过数据卷同步到宿主机。
补充:
Docker 提供了三种实时同步的方式 : 宿主机与容器FS间的数据同步
1、数据卷
2、Bind mounts (绑定挂载) 【较复杂,不推荐】
3、temps(临时文件系统)【较复杂,不推荐】本文重点介绍一下【数据卷】的方式进行容器数据的持久化。
什么是数据卷
数据卷
是宿主机
中的一个特殊的文件或目录,这个文件/目录 与容器中的另一个 文件/目录 进行了直接关联,在任何一端对文件/目录 写操作,在另一端都会同时发生相应的变化。- 在
宿主机
中,这个文件/目录 称为数据卷
;- 在
容器
中,对应的 关联的 文件/目录 则称为该数据卷在该容器中的挂载点
。
数据卷 的设计目的就是为了实现数据持久化,其完全独立于容器的生命周期。
属于宿主机文件系统,但不属于UnionFS。
因此,容器被删除时,不回删除其挂载的数据卷。
数据卷的特性
1、数据卷在容器启动时初始化,如果容器启动后容器本身已经包含了数据,那么这些数据会在容器启动后直接出现在数据卷中,反之亦然。
2、可以对数据卷 和 挂载点中的内容直接修改,修改后对方立即可以看到。
3、数据卷会一直存在,即使挂载数据卷的容器已经被删除;
4、数据卷可以在容器之间共享和重用,即不同容器可以挂载同一个数据卷。
创建数据卷(*)
创建数据卷,是在 docker run 时通过 -v 参数进行定义的
创建读写数据卷
* 宿主机 对 目录的权限 始终是 读写的;
* 此处的 读写权限 是 容器对挂载点的 权限 : 容器可以对挂载点读和写。
docker run --name xxx -it
-v /宿主机的绝对路径:/容器中的局对路径
image:tag
无论是宿主机中的数据卷,还是容器中的挂载点,
如果指定的目录不存在,那么docker 引擎都会自动创建(包含多级目录)。
创建只读数据卷
* 宿主机 对 目录的权限 始终是 读写的;
* 此处的 读写权限 是 容器对挂载点的 权限 : 容器对挂载点只读。
* 某些情况下,为了防止容器在运行过程中对文件产生修改,就需要创建只读数据卷。
docker run --name xxx -it
-v /宿主机的绝对路径:/容器中的绝对路径:ro
image:tag
通过共享创建数据卷
当两个容器使用相同的数据卷时,就称这两个容器实现了“数据卷共享”。
数据卷容器
:当一个容器c启动运行时创建并挂载了数据卷,若其他容器也需要共享该容器挂载的数据卷,则可以在docker run
命令中通过--volumes-from 容器ID
选项,实现数据卷的共享。
此时,容器c 就称为 数据卷容器。
docker run --name xxx-it
--volumes-from 数据卷容器ID
image:tag
补充—mount 参数
作用是一样的,只不过表述更清晰
非简写:
docker run--mount type=bind,source=/host/path,target=/container/path[,readonly]
--name mycontainer ubuntu
简写:
docker run--mount type=volume,src=myvolume,dst=/container/path[,ro]
--name mycontainer ubuntu
Dockerfile 持久化
- Dockerflie 持久化,是通过
VOLUME 指令
指定数据卷方式的持久化。- VOLUME 指令可以在容器中创建可以挂载数据卷的挂载点。其参数可以是字符串数组,也可以是空格隔开的多个纯字符串。
- 但这种方式只能定义容器中的挂载点,宿主机中的数据卷是匿名的,自动生成的。
- 例如 :
VOLUME [“/path1”,“/path2”,…]
VOLUME /path1 path2 …
可以通过
docker inspect 容器ID
查看挂载点的信息,会有一个 叫做Mounts
的数组,记录对应的数据卷的信息。