Docker

S4:数据共享(Docker Volume)

2020-01-21  本文已影响0人  睦月MTK

声明:所有的实验示例大部分来自《learn-docker-in-a-month-of-lunches》的作者Elton Stoneman,但运行结果并不都是照搬,大部分实验结果可能与原书不同


一、前言

到目前为止,你应该已经在容器上发现了这么一个特点:你每次运行一个新的容器,容器的内的任何文件都回归初始了,你乍一听会觉得这不是挺好的嘛,这样会保证每一个新运行的容器不论在何时不论在何地都从同一个状态开始运行。但你有没有想过这么一种情况,你的容器存储了一些重要信息在容器内的文件系统里,但是这时因为软件升级,你的镜像也更新了,你必须以新的镜像去运行新的容器,也就是说你得关停老的容器,那么这些重要数据岂不是丢失了?
不必担心,强大的Docker早就想到了这一点,它们给出了Docker Volumn和Docker Bind两种文件共享方式,以适应你数据持久化的需求。
不过在此之前,我们先来讨论一下Docker容器的文件系统结构。


二、Docker容器的文件系统结构

Docker会将所有的文件系统源合并在一起呈现给Docker容器,而Docker容器能看到只是一个普普通通的块存储设备,Docker称这样的系统为union filesystem,下图是union filesystem的一个基本组成结构:


Docker容器的文件系统结构
三、Docker 镜像层文件系统与可写层文件系统

四、Docker Volume容器共享文件系统

五、Docker Bind容器挂载文件系统
$ mkdir database
$ source="$(pwd)/database"
$ docker container run --mount type=bind,source=$source,target='/data' --detach --publish 5000:80 diamol/ch06-todo-list
$ curl localhost:5000
$ ll database
-rw-r--r--. 1 root root 12288 Jan 21 18:19 todo-list.db
$ docker volume ls
DRIVER              VOLUME NAME

在当前目录下创建一个database目录,然后将该目录挂载给新启动的容器,然后访问这个应用,查看database目录下的文件,你会发现多了一个数据库文件。
然后再查看Docker Volume(运行前已经清空)一个都没有,这说明Docker Bind的设置将默认的Docker Volume覆盖了
这时候你会问,那如果同时在命令里面将Volume和其他文件系统挂载给同一个目录呢?
当然会报错啦!docker: Error response from daemon: Duplicate mount point: /data.
那如果Volume挂载给/data目录,而其他文件系统挂载给/data/config目录呢?
经测试,是可以的


六、其他说明

参考文档:
[1] learn-docker-in-a-month-of-lunches
[2] 官方文档


附:
[1] Elton Stoneman的github项目

上一篇 下一篇

猜你喜欢

热点阅读