在阅读并试用了 docker 一段时间后,我考虑在生产环境中使用它。但是我仍在尝试理解挂载绑定和卷之间的区别。
根据 Dockers 关于 mount binds 的文档(https://docs.docker.com/storage/bind-mounts/):
自 Docker 诞生之初,绑定挂载就已存在。与卷相比,绑定挂载的功能有限。使用绑定挂载时,主机上的文件或目录将挂载到容器中。文件或目录由其在主机上的完整路径或相对路径引用。相比之下,使用卷时,会在主机上的 Docker 存储目录中创建一个新目录,然后 Docker 会管理该目录的内容。
从这一点(以及反复尝试)来看,我认为挂载绑定和卷是同一件事,唯一的区别在于数据的位置。(卷存储在 docker 的“私有”存储区域中,而挂载绑定可以存储在任何地方)。是的,挂载绑定必须在启动 docker 容器之前存在,而卷可以在容器启动时由 docker 引擎创建 - 但这种差异与性能或维护无关。
我无法理解文档中所述的卷的所谓好处(https://docs.docker.com/storage/volumes/) 因为它们似乎都同样适用于安装绑定。
有人能解释一下卷和挂载绑定之间的主要区别(性能和维护方面)以及最重要的是它们的用例吗?
谢谢您的帮助。
答案1
默认情况下,本地命名卷与您描述的完全一样,绑定到特殊的 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