Docker存储卷¶
约 1778 个字 11 行代码 预计阅读时间 6 分钟
存储卷介绍和作用¶
存储卷(Volume)是 Docker 提供的持久化数据机制,用于将容器内的数据独立于容器生命周期进行保存与共享,避免容器删除或重建导致数据丢失,同时支持在多个容器之间安全地共享数据,并且相比直接使用容器文件系统,性能更稳定、管理更方便、迁移备份也更容易
需要注意,卷是“容器内某个目录到宿主机存储位置的映射”,不是把整个容器文件系统都搬到宿主机,在创建卷时指定的目录实际上就是将容器的指定目录与宿主机绑定,容器中的这个目录放入的数据就会在宿主机对应的目录中查看到,从而实现数据同步和持久化
存储卷分类¶
- volume(Docker管理卷):将指定的容器路径映射到宿主机的
/var/lib/docker/volumes目录下(如果修改过Docker的默认路径会有所不同),只需在容器内指定挂载点,实际宿主机目录由Docker daemon自动创建或使用已有目录与卷建立关联,降低了卷与宿主机路径的耦合;缺点是用户无法指定具体宿主机目录,适合临时存储 - bind(绑定数据卷):用户可以指定容器目录映射到宿主机指定目录,使用最频繁
- tmpfs(临时数据卷):用户可以指定容器目录映射到宿主机内存中,容器停止后tmpfs会被移除,数据丢失,但是因为是在内存中,不同的进程之间内存是隔离的,安全性比前面两种都高,适合高性能且安全要求较高的数据存储
需要注意,如果是管理卷,当指定的容器目录中有资源时,会将该目录的资源拷贝到宿主机的目录中,但是如果是绑定卷,当绑定的宿主机目录有数据,则容器对应目录以宿主机目录一致,如果没有数据,则容器看到的就是空目录,而不会有任何其他操作,如果是临时卷,不管容器镜像中该路径是否已有文件都会被覆盖
管理卷操作¶
创建管理卷¶
使用下面的命令进行管理卷创建:
| Bash | |
|---|---|
1 | |
常见选项:
-d, --driver:指定驱动,默认是local--label:指定元数据
需要注意的是,如果不指定卷名,默认创建的是匿名卷
除了使用volume命令创建管理卷外,还可以使用运行/创建容器的命令通过参数来创建管理卷,一共有两种参数,分别为-v和--mount,使用方式分别如下:
基本语法为:
| Bash | |
|---|---|
1 | |
其中,当卷名为空时,创建的是匿名卷,否则即为命名卷,对于选项来说,针对卷的属性有例如ro表示只可读属性
基本语法为:
| Bash | |
|---|---|
1 | |
关键键值:
type:卷类型,一共三种:volume、bind和tmpfssrc:卷名称,不写时为匿名卷dst:容器中待绑定的目录名readonly:设置只读属性
例如:
| Bash | |
|---|---|
1 | |
三种创建方式都可以使用查看容器详情命令查看Mount字段看到卷类型、源路径和目标路径,Source表示宿主机保存数据的路径,Destination表示容器内部路径
查看管理卷详细信息¶
使用下面的命令查看管理卷详细信息:
| Bash | |
|---|---|
1 | |
常见选项:
-f:指定输出格式
列出所有管理卷¶
使用下面的命令列出所有管理卷:
| Bash | |
|---|---|
1 | |
常见选项:
--format:指定输出格式(如json、table)--filter, -f:过滤显示内容-q:仅显示名称
删除未被使用的管理卷¶
使用下面的命令删除未被使用的管理卷:
| Bash | |
|---|---|
1 | |
常见选项:
-f:强制删除
需要注意的是,删除必须确保卷是处于未使用状态,哪怕是强制删除
清理未被使用的匿名管理卷¶
使用下面的命令删除未被使用的管理卷:
| Bash | |
|---|---|
1 | |
常见选项:
--filter:根据指定条件过滤卷-f, --force:不进行删除提示
绑定卷操作¶
创建绑定卷¶
创建绑定卷的方式只有通过命令参数,与管理卷一致,两种命令-v和--mount,使用方式与管理卷基本一致,下面仅对不同点进行说明:
- 使用
-v创建时,容器名称位置替换为宿主机路径;使用--mount时,type修改为bind,src替换为宿主机路径 - 如果使用
-v选项时,宿主机目录不存在会自动创建,--mount选项时,宿主机目录不存在会报错
两种创建方式都可以使用查看容器详情命令查看Mount字段看到卷类型、源路径和目标路径,Source表示宿主机保存数据的路径,Destination表示容器内部路径
临时卷操作¶
创建临时卷¶
创建临时卷的方式只有通过命令参数,两种命令--tmpfs和--mount:
基本语法:
| Bash | |
|---|---|
1 | |
基本语法:
| Bash | |
|---|---|
1 | |
关键键值:
type:卷类型,一共三种:volume、bind和tmpfsdst:容器中待绑定的目录名tmpfs-size:挂载的目录大小(以字节为单位)。默认无限制tmpfs-mode:八进制文件模式。默认1777
例如:
| Bash | |
|---|---|
1 | |
需要注意的是,如果是使用--tmpfs创建临时卷,Mount字段是空的,具体值在Tmpfs字段看到,但是使用--mount创建即可看到Mount字段与前面两个卷类似的信息
存储卷在实际研发中带来的问题¶
- 跨主机使用:Docker存储卷默认使用宿主机本地文件系统目录,容器在同一台主机上停止或删除后可重建,但无法在不同主机间调度复用,这属于Docker本身未解决的问题。可以通过自建NFS等共享存储来缓解,但强依赖运维能力。实际工程中,存储与计算逐渐分离,S3、NFS等分布式存储方案越来越普遍
- 启动参数难以追溯:容器启动参数很多,下次重启时容易遗忘最初的选项,因此需要用文件化的方式保存启动配置,这也是容器编排工具的作用。单机可以用命令或文件启动单个容器,但若涉及几十上百个容器,就需要专业编排工具(如K8s或云厂商的企业版编排方案)
- 复杂场景仍然依赖运维:对有状态、需持久化的集群组件(如MySQL主从),部署、扩缩容与故障恢复高度依赖运维经验。必须清楚集群规模、主从拓扑、库的分布等细节才能排障,这类复杂场景往往仍需人工介入,很难完全被工具替代