前言
Docker 提供了三种宿主机与容器间之间实时同步的方式
- 数据卷
- bind mounts (绑定挂载)
- tmpfs (临时文件系统)
一、数据卷是什么?
数据卷是宿主机中的一个特殊文件或者目录,与容器内的另一个文件或者目录进行直接关联,任何一端做了变更操作,另一端同时发生改变,宿主机中的这个文件或者目录称为数据卷,而容器内关联的文件或者目录则称为数据卷在容器内的挂载点。
数据卷是为了实现数据持久化而设计的,完全独立于容器的生命周期,容器删除不会删除其挂载的数据卷,它属于宿主机的文件系统,但区别于UnionFS。
二、数据卷的特性
- 数据卷在容器启动时初始化,如果容器启动后本身已经包含了数据,数据卷在容器启动后直接出现在数据卷中。
- 可以对数据卷或者挂载点中的内容直接修改,修改后两端都可以看到。
- 数据卷会一直存在,即使挂载数据卷的容器已经被删除。
- 数据卷可以在容器之间共享
三、数据卷实现方式
- 读写数据卷
- 只读数据卷
3.1 创建读写数据卷
3.1.1 在容器启动时指定,语法格式如下:
docker run –it –v /宿主机目录绝对路径:/容器内目录绝对路径 镜像
[root@localhost ~]# docker run --name ubuntu1 -it -v /root/ubuntu-mount:/opt/c-mount ubuntu:latest /bin/bash
tips:如指定的目录不存在,docker引擎会自动创建。 以交互方式启动ubuntu容器,在启动时创建数据卷。
3.1.2 分别查看宿主机与容器目录
3.1.3 数据卷与挂载点互相操作
容器内操作
echo "c-22222" >> wr.txt
宿主机操作
echo "s-11111" > wr.txt
在宿主机中查看变更记录,可以看到新增的内容。
停止容器后在宿主机更新数据卷,在容器启动后挂载点同步更新。
3.2 创建只读数据卷
3.2.1 语法格式如下:比读写数据卷多了:ro
docker run –it –v /宿主机目录绝对路径:/容器内目录绝对路径:ro 镜像
docker run --name ubuntu2 -it -v /root/ubuntu-mount:/opt/c-mount:ro ubuntu:latest /bin/bash
容器内对数据卷修改失败:
宿主机对数据卷修改成功
查看数据卷属性,命令如下:
docker inspect ubuntu-ro
3.3 创建数据卷共享
新建容器共享之前创建容器的目录,两个容器挂载点目录相同。
--创建共享启动容器1
docker run --name ubuntu1 -it -v /root/gx-mount:/opt/gxc-mount ubuntu:latest /bin/bash
--创建容器2指定容器1为数据卷容器
docker run --name ubuntu1 -it -v /root/gx-mount:/opt/gxc-mount ubuntu:latest /bin/bash
--宿主机操作:
root@localhost ~]# cd gx-mount/
[root@localhost gx-mount]# echo "szj-111111" >> hello.log
--容器1操作
root@5b5d920a9904:/opt/gxc-mount# echo "c1-333333" >>hello.log
--容器2操作
root@dc6f3f4877c4:/opt/gxc-mount# echo "c2-22222" >> hello.log
在宿主机,容器1,容器2中分别操作,观察数据卷内容均可以变更。
总结
需要理解两点:
- 数据卷属于宿主机文件系统,与 UnionFS 是挂载关系,与容器挂载点是硬链接关系,容器的存在与否与数据卷没有关系。
- 数据卷持久化可以做到对容器变更的实时性持久化,不会出现数据丢失的情况。