docker - 卷 vs 挂载绑定。有哪些用例?

GKm*_*man 17 docker

在阅读并使用 docker 一段时间后,我正在考虑在我的生产环境中使用它。但是,我仍在尝试了解挂载绑定和卷之间的区别。

根据关于挂载绑定的 Dockers 文档(https://docs.docker.com/storage/bind-mounts/):

自 Docker 早期以来,绑定挂载就已经存在。与卷相比,绑定挂载的功能有限。使用绑定挂载时,主机上的文件或目录会挂载到容器中。文件或目录由其在主机上的完整或相对路径引用。相比之下,当您使用卷时,会在主机上的 Docker 存储目录中创建一个新目录,由 Docker 管理该目录的内容。

从这个(以及从玩弄)在我看来,挂载绑定和卷是一回事,唯一的区别是数据的位置。(卷存储在 docker 的“私有”存储区,而 mount 绑定可以存储在任何地方)。是的,在启动 docker 容器之前必须存在 mount bind,而当容器启动时,docker 引擎可以创建卷 - 但这种差异是不敬的性能或维护明智的。

我无法理解文档 ( https://docs.docker.com/storage/volumes/ )所述卷的所谓好处,因为它们似乎都同样适用于安装绑定。

任何人都可以解释卷和安装绑定(性能和维护方面)之间的主要区别,最重要的是它们的用例?

谢谢您的帮助。

BMi*_*tch 13

默认情况下,本地命名卷与您描述的完全相同,绑定安装到特殊的 docker 目录。我看到的差异:

  • 首先,最大的是命名卷和主机卷(又名绑定安装)之间的行为差​​异。Docker 将从镜像的内容初始化一个命名卷。这包括文件所有者和权限。这意味着您可以避免担心主机卷通常遇到的权限问题。

  • 第二,便携性。命名卷可以从不同的 docker 主机使用,而不必担心本地文件系统路径或运行命令的用户。无论是在 MacOS 笔记本电脑上,还是在生产环境中的 Linux 服务器上,您都可以命名一个卷并假设它将作为默认 docker 安装的一部分运行。

  • 第三,如何管理。主机卷通常在 docker 之外管理,这是权限问题经常出现的地方(因为主机上的 UID/GID 通常与容器内的 UID/GID 不匹配)。使用命名卷,您可以在另一个 docker 容器中管理它们,您可以在其中控制安装的工具、创建的用户等。

命名卷还有另一个很大的区别。那是因为我在上面说“默认”,并且可以通过多种方式配置命名卷。卷驱动程序可以更改为另一个云感知的驱动程序。或者,您可以将选项传递给本地卷驱动程序,以将本地绑定挂载更改为特定目录,以及您可以使用挂载系统调用执行的任何操作。这包括对不同目录执行绑定挂载、NFS 挂载,您甚至可以创建自己的覆盖文件系统作为卷,以允许容器访问和修改容器内的某些数据,而无需更改基础层中的底层文件。

通过使用命名卷,您还可以将存储管理与容器管理分开。您只需指向名称,外部工具就可以创建该卷以指向该环境中的适当位置。

我与本地卷驱动程序一起使用的命名卷的一些示例包括:

# named bind mount
$ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

# nfs
$ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=nfs.example.com,rw \
      --opt device=:/path/to/dir \
      foo

# overlay
$ docker volume create --driver local --opt type=overlay \
    --opt o=lowerdir=${PWD}/ro-data,upperdir=${PWD}/upper1,workdir=${PWD}/work1 \
    --opt device=overlay overlay1
Run Code Online (Sandbox Code Playgroud)

  • 从overlayfs创建docker卷非常聪明!您可以获得主机只读文件系统和容器可写文件系统的所有好处。 (2认同)