知识卡片
从Bind Mount到Volume Mount的演进反映容器存储抽象能力的提升
内容
容器默认不具备持久化存储能力——为保证镜像稳定不变,容器内的数据修改
靠写入时复制(Copy-on-Write)叠加到独立区域,容器一旦终止这些变动就
随之消失。这与”容器要产出有价值数据(如数据库)”“多容器要共享存储
交换信息(如Nginx+Filebeat)”这两个现实需求形成矛盾,Docker最早的解法
是Bind Mount——把宿主机某个目录直接映射进容器指定目录(-v参数最初就
是干这个的,尽管这个参数名后来被”将就”用于Volume也是这段历史遗留的
产物)。但Bind Mount暴露出两个局限:一是只能做本机目录映射,要让不同
宿主机上的容器共享同一份存储,就得先把共享存储挂到每台宿主机操作系统
的某个目录,再逐个挂进容器,纯靠管理员手工完成、难以自动化;二是Docker
对挂载的宿主机目录没有任何控制权——它既不受Docker保护也不受Docker
管理,容易被其他进程访问、修改甚至删除,备份迁移等运维操作只能在Docker
之外靠人工完成。Volume Mount的引入是对这两个局限的针对性回应:Docker
把”存储的区域”做成一个可以被自己管理的抽象资源(Volume),并配套设计
Storage Driver(解决如何访问不同存储系统的问题)和Volume Driver(解决
如何对接AWS EBS、Azure File Storage等第三方云存储的问题)。这条演进
路径揭示了一个规律:一项能力从”能用”(Bind Mount)到”好用”(Volume
Mount),往往是被”跨主机共享”和”可管理性”这类具体痛点倒逼出来的,而
不是设计者一开始就想周全的。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第13章"持久化存储"13.1.1节
"Mount和Volume"(源文件:_epub-src对应OEBPS/Text/chapter155.xhtml)
- 结论依据:原文说明Bind Mount只能做本机目录映射、跨主机共享需要大量
人工配置,且Docker对挂载目录没有管理权限,进而说明Volume Mount引入
Storage Driver和Volume Driver来提升Docker对不同存储介质的支撑能力,
直接支撑本卡片结论。
- 原始内容:这种存储范围超越了宿主机的共享存储,配置过程却要涉及大量
与宿主机环境相关的操作,只能由管理员人工去完成……存放容器生产数据的
主机目录是完全独立的,与Docker没有任何关系,既不受Docker保护,也不
受Docker管理……提出Volume的最核心的目的是提升Docker对不同存储介质
的支撑能力。