Docker 卷

卷(volume)是Docker容器数据持久化的首选机制,虽然 Docker 捆绑挂载 也能够实现数据持久化,但是bind mounts依赖于主机的目录结构和操作系统,而volume则完全由Docker管理,具有以下优点:

  • 卷(volume)比 Docker 捆绑挂载 更容易备份和迁移

  • 可以通过Docker CLI命令或者Docker API来管理卷

  • 卷在Linux和Windows都是可以使用的

  • 卷能够更安全地在不同容器间共享

  • 卷驱动程序允许将卷存储在远程主机或者云厂商上,并且提供卷内容加密或提供其他功能

  • 新卷的内容可以由容器预先填充

  • Docker Desktop 的卷性能比 macOSWindows Atlas 主机上的 Docker 捆绑挂载 性能更好

此外,和容器中的可写层中持久化数据相比,卷通常是更好的选择:

  • 卷不会增加容器的大小

  • 卷的内容和容器的生命周期无关,可以更容易保持

卷(Volumes)使用 rprivate 绑定传播(bind propagation),并且卷的这个 “绑定传播” 是不可配置的

../../_images/types-of-mounts-volume.png

备注

如果追求高性能且不需要持久化数据,可以考虑采用 Docker内存文件系统(tmpfs)挂载

选择 -v--mount 参数

总而言之, --mount 参数更为明确和冗长。最大的不同是在语法上, -v 参数需要将所有选项组合在一个字段中,而 --mount 参数则将选项分离开。

如果需要指定卷驱动程序选项,则必须使用 –mount

  • -v--volume : 由三个字段组成,以冒号字符 ( : ) 分隔。 字段的顺序必须正确,每个字段的含义不是很明显

    • 在命名卷(named volumes)的情况下,第一个字段是卷的名称,并且在给定的主机上是唯一的。 对于匿名卷,省略第一个字段。

    • 第二个字段是文件或目录在容器中的挂载路径

    • 第三个字段是可选的,并且是以逗号分隔的选项列表,例如 ro

  • --mount : 由多个键值对组成,以逗号分隔,每个键值对由一个 <key>=<value> 元组组成。 --mount 语法比 -v--volume 更冗长,但是键的顺序无需关注,且标记的值更容易理解

    • 挂载类型( type ): 可以是 bind ( Docker 捆绑挂载 )、volume ( Docker 卷 )或 tmpfs ( Docker内存文件系统(tmpfs)挂载 )

    • 挂载源( srouce ): 对于命名卷(named volumes),表示卷的名称。 对于匿名卷,则省略此字段。这里 source 可以简写为 src

    • 挂载目标( destination ): 表示将文件或目录挂载到容器内部的路径。这里 destination 可以简写为 dst ,通常也可以用 target ( target 是比较常用的方法)

    • 只读( readonly )选项: (如果存在)会使绑定挂载以只读方式挂载到容器中。通常 readonly 可以简写为 ro

    • 卷选项( volume-opt ): 这个卷选项可以多次使用,来配置多个键值对表示配置选项

创建卷

参考