数据挂载的三种模式
- bind mount: 可以存储在宿主机器任何一个地方,但是会依赖宿主机器的目录结构,不能通过docker CLI 去直接管理,并且非docker进程和docker进程都可以修改该路径下的文件
- volume: 在宿主的文件系统上的docker工作路径下创建一个文件夹(/var/lib/docker/volumes)来存储数据,其他非docker进程是不能修改该路径下的文件,完全由docker来管理
- tmpfs : 有时候你不想把容器的数据存储在主机上,但出于性能或安全原因,或者如果数据是不需要持久化的状态信息,你也不希望将数据写入容器的可写层。例如容器的应用程序根据需要创建和使用的一次性临时密码。为了让容器能够访问数据而不需要永久地写入数据,可以使用 tmpfs 挂载
- volumn适用场景
- 多个容器这间共享数据
- 宿主机不保证存在固定的目录结构
- 持久化数据到远程主机或者云存储而非本地
- 需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等。
- bind mount适用场景
- container共享宿主机配置文件。比如docker会将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。
- 开发环境中宿主机与container之间共享源代码、构建构件等。比如将整个build过程container化,将宿主机上的源代码文件夹bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结构写入另一个bind mount的文件夹中。
- 一些监控类container,通过读取宿主机固定文件中的数据实现监控等。
- tmpfs mounts的使用场景
- 当你因为安全或其他原因,不希望将数据持久化到容器或宿主机上,那你可以使用tmpfs mounts模式。
- tmpfs 挂载只能用于 Linux 容器,不支持 Windows 容器。
使用 -v 指令
挂载宿主机目录到容器内的目录,默认使用的宿主机路径是/var/lib/docker/volumes, 即volume模式,也可以自定义路径,这时候使用的是bind mount模式。
eg: docker run … -v [宿主机路径]:[挂载的容器路径] …
使用 --mount 指令(推荐使用方式)
-v能做的–mount指令都可以做,与-v指令对比,–mount指令更灵活,支持更多复杂操作,并且不需要严格按照参数顺序,通过key value键值对方式进行配置,可读性更高。
mount有以下几个参数:
- type - type可以是bind、volume或者tmpfs,默认是volume
- source - 宿主机上的目录路径,可以用缩写src
- destination - 目标路径,容器上挂载的路径,可以用dst或者 target
- readonly - 可选项,如果设置了,那么容器挂载的路径会被设置为只读
- volume-opt - 可选项,当volume驱动接受同时多个参数作为选项时,可以以多个键值对的方式传入
tmpfs内存模式
使用tmpfs写入内存,在容器读写层是看不到的:
使用docker inspect [容器/镜像] 查看容器或者镜像相关信息
fzz@ubuntu:~/mount_test$ docker inspect bind_test
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/60b4d6dc5bfdfe8a3be1883407dd4475a1aeefba7acb8c66addc2bd21fdb6af4-init/diff:/var/lib/docker/overlay2/c105b658706af65e4f83011692c4e2e947e5ff05512c91fe95a90c6949efeac2/diff:/var/lib/docker/overlay2/ea84a82defeaf4abb8c94b6fb41a1d261ff9cd54435895a0a90410646b856ca8/diff:/var/lib/docker/overlay2/0ac69cbb34d117f5041e41ac18961be9ebc1795e8b4e49a68c070121f9c02253/diff:/var/lib/docker/overlay2/aee396c956bed0b3dcdf7b6bc460ff456d38210956d20bf3ea7c536b381d99e5/diff",
"MergedDir": "/var/lib/docker/overlay2/60b4d6dc5bfdfe8a3be1883407dd4475a1aeefba7acb8c66addc2bd21fdb6af4/merged",
"UpperDir": "/var/lib/docker/overlay2/60b4d6dc5bfdfe8a3be1883407dd4475a1aeefba7acb8c66addc2bd21fdb6af4/diff",
"WorkDir": "/var/lib/docker/overlay2/60b4d6dc5bfdfe8a3be1883407dd4475a1aeefba7acb8c66addc2bd21fdb6af4/work"
},
"Name": "overlay2"
},
此时在容器读写层的文件夹内看不到/root/tmpfs里的内容
参考
Docker深入浅出系列 | 容器数据持久化
【docker】 bind-mount或者COPY时需要注意 用户、文件权限 的问题
Docker镜像分层
Docker镜像存储-overlayfs