互联网技术 / 互联网资讯 · 2024年1月3日

Docker 数据持久化与卷的使用说明

在 Docker 中,卷(Volume)是保存容器生成和使用数据的常用方式,也是实现数据持久化的推荐方案。相比依赖宿主机目录结构和操作系统的绑定挂载,卷由 Docker 统一管理,在使用、迁移和维护方面通常更方便。

卷的优势主要体现在以下几个方面:

  • 更便于备份与迁移,适合在不同环境之间转移数据。
  • 可以通过 Docker CLI 或 Docker API 进行统一管理。
  • 同时适用于 Linux 容器和 Windows 容器。
  • 能够在多个容器之间以更安全的方式共享数据。
  • 支持卷驱动,可将数据存储到远程主机或云服务中,并可扩展加密等能力。
  • 新建卷时可以通过容器预先写入初始内容。
  • 在 Docker Desktop 环境下,卷通常比 Mac 和 Windows 主机上的绑定挂载具有更好的性能。

此外,与将数据直接写入容器的可写层相比,卷通常是更合适的选择。因为卷中的内容独立于容器生命周期存在,不会随着容器删除而自动消失,同时也不会增加容器本身的可写层负担。

云计算核心技术Docker教程:Docker使用卷持久化数据

如果容器产生的是无需长期保留的临时状态数据,可以考虑使用 tmpfs 挂载。这样既能避免将数据持久写入存储介质,也有助于减少对容器可写层的写操作,从而提升一定的运行效率。

选择 -v 还是 –mount

在挂载卷时,Docker 提供了 -v(或 --volume)以及 --mount 两种写法。总体来说,--mount 的表达更清晰、结构也更明确;而 -v 更简洁,但所有参数都集中在一个字段中,可读性相对较弱。

两者最主要的区别在于:-v 使用冒号分隔多个字段,而 --mount 采用逗号分隔的键值对形式。如果需要指定卷驱动相关参数,则必须使用 --mount

-v 或 –volume 的语法

-v--volume 由三个部分组成,使用冒号(:)分隔,并且顺序不能颠倒。

  • 第一个字段:卷名称。对于命名卷,这里填写卷名,并且该名称在当前宿主机上应唯一;如果是匿名卷,则这一部分可以省略。
  • 第二个字段:容器内的挂载路径,即文件或目录在容器中的位置。
  • 第三个字段:可选参数,多个选项之间用逗号分隔,例如 ro,表示只读挂载。

–mount 的语法

--mount 由多个键值对组成,键与值之间使用 = 连接,不同参数之间使用逗号分隔。虽然写法更长,但每个配置项的含义更直观,而且参数顺序通常不重要。

  • type:挂载类型,可选值包括 bindvolumetmpfs。在卷的场景下,这里应为 volume
  • sourcesrc:挂载源。对于命名卷,这里填写卷名称;如果使用匿名卷,则可以省略。
  • destinationdsttarget:容器内的目标路径,也就是卷挂载到容器中的位置。
  • readonly:如果设置该选项,卷将以只读方式挂载到容器中。
  • volume-opt:卷驱动参数,可多次指定,每次传入一个键值对,用于扩展卷的配置能力。

如果你更看重配置的明确性和可维护性,建议优先使用 --mount;如果只是进行简单挂载,-v 也足以满足大多数日常场景。