Docker 数据卷持久化实现方式


前言

Docker 提供了三种宿主机与容器间之间实时同步的方式

  1. 数据卷
  2. bind mounts (绑定挂载)
  3. tmpfs (临时文件系统)

一、数据卷是什么?

  数据卷是宿主机中的一个特殊文件或者目录,与容器内的另一个文件或者目录进行直接关联,任何一端做了变更操作,另一端同时发生改变,宿主机中的这个文件或者目录称为数据卷,而容器内关联的文件或者目录则称为数据卷在容器内的挂载点。

  数据卷是为了实现数据持久化而设计的,完全独立于容器的生命周期,容器删除不会删除其挂载的数据卷,它属于宿主机的文件系统,但区别于UnionFS。

二、数据卷的特性

  1. 数据卷在容器启动时初始化,如果容器启动后本身已经包含了数据,数据卷在容器启动后直接出现在数据卷中。
  2. 可以对数据卷或者挂载点中的内容直接修改,修改后两端都可以看到。
  3. 数据卷会一直存在,即使挂载数据卷的容器已经被删除。
  4. 数据卷可以在容器之间共享

三、数据卷实现方式

  1. 读写数据卷
  2. 只读数据卷

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中分别操作,观察数据卷内容均可以变更。

 

总结

需要理解两点:

  1. 数据卷属于宿主机文件系统,与 UnionFS 是挂载关系,与容器挂载点是硬链接关系,容器的存在与否与数据卷没有关系。
  2.  数据卷持久化可以做到对容器变更的实时性持久化,不会出现数据丢失的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值