Docker Container 数据
默认Container创建的所有文件存储在该container的一个可写层,即:
当container不运行时,数据不会持久化,并且其他进程无法获取container中的数据
container writable 层牢牢的与宿主机(container 运行所在的机器)连在一起,很难移动这些数据
将数据写入container 可写层需要存储驱动来管理文档系统。存储驱动利用linux内核提供统一的文档系统。相比
volume
直接写入host文档系统的方式,这种默认的创建方式会降低性能。Docker 提供三种挂载方式,对于container而言,三种形式的一样,都是文件夹或者文件
- Volume, 作为host文件系统的一部分,由Docker(/var/lib/docker/volumes/)管理,非Docker进程不应该修改这个部分。Volumes是持久化数据最好的方式
- Bing Mount,可以在host的任意地方,可以挂载重要的系统文件或文件夹,非Docker进程可以随时修改这些文件
- tmpfs,mounts只能存储在host系统的内存中,不会写入host的文件系统
使用场景:
1.volumes 是docker container 和 services 持久化数据的最好方式,包括:
多个container之间共享数据,如果没有创建volume, container在首次运行时会创建,当container停止运行或移除后,volume任然存在。多个containers可以同时挂载相同的volume, 无论 读写 或 只读, Volume只能主动移除
当docker host 无法确保拥有文件目录或文件结构,Volumes可以从conainer的运行时中解耦docker host的配置
当需要将container的数据存储在远程的host或云端时
需要备份、恢复、迁移数据
- bing mounts, 一般而言,应该尽可能的使用volumes, Bind mounts 适合一些的用途:
共享host与container的配置文件, Docker的DNS默认解决方案就是采用这种方式,通过mounting宿主机的
/etc/resolv.conf
到每个container中共享host开发环境中的源代码和组建(build) 到 container中。例如,可以mount 一个 Maven
target/
文件夹到container中,每次构建Maven项目,container 将获取重新构建的文档。 生产环境,建议采用copy的方式将编译好的文档拷贝到镜像中当确定host有文件或目录结构,并且需要采用bing mount的方式
- tmpfs mounts, 当不需要持久化数据到host机器上或container上时,采用该方式。这可能是处于安全的考虑,或者需要保护container的性能,当应用程序需要写入大量不需要持久化的状态数据。
注意:
如果挂载空的目录到container,而这些文件或目录在container中已经存在,那么container将拷贝到volumes中。类似的,如果启动一个container,并且指定的volume不存在,则会创建一个空的volumes。
如果将非空volume 或 bind mount 挂载到container中,那么这些文件或目录将container的文件夹被掩盖。类似 当我们在 /mnt 中创建文件后,插入U盘到/mnt,那么/mnt将被U盘中的内容遮盖,直到U盘弹出,才能看到原来的内容。