【Docker】应用存储结构

Docker Container 数据

默认Container创建的所有文件存储在该container的一个可写层,即:

  • 当container不运行时,数据不会持久化,并且其他进程无法获取container中的数据

  • container writable 层牢牢的与宿主机(container 运行所在的机器)连在一起,很难移动这些数据

  • 将数据写入container 可写层需要存储驱动来管理文档系统。存储驱动利用linux内核提供统一的文档系统。相比volume 直接写入host文档系统的方式,这种默认的创建方式会降低性能。

    Docker 提供三种挂载方式,对于container而言,三种形式的一样,都是文件夹或者文件

这里写图片描述

  1. Volume, 作为host文件系统的一部分,由Docker(/var/lib/docker/volumes/)管理,非Docker进程不应该修改这个部分。Volumes是持久化数据最好的方式
  2. Bing Mount,可以在host的任意地方,可以挂载重要的系统文件或文件夹,非Docker进程可以随时修改这些文件
  3. 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或云端时

  • 需要备份、恢复、迁移数据

    1. 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的方式

    1. tmpfs mounts, 当不需要持久化数据到host机器上或container上时,采用该方式。这可能是处于安全的考虑,或者需要保护container的性能,当应用程序需要写入大量不需要持久化的状态数据。

注意:

  • 如果挂载空的目录到container,而这些文件或目录在container中已经存在,那么container将拷贝到volumes中。类似的,如果启动一个container,并且指定的volume不存在,则会创建一个空的volumes。

  • 如果将非空volume 或 bind mount 挂载到container中,那么这些文件或目录将container的文件夹被掩盖。类似 当我们在 /mnt 中创建文件后,插入U盘到/mnt,那么/mnt将被U盘中的内容遮盖,直到U盘弹出,才能看到原来的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值