在Docker容器中处理持久化数据时绑定挂载和卷之间的区别是什么?

ghhkc1vu  于 2023-05-22  发布在  Docker
关注(0)|答案(4)|浏览(386)

我想知道为什么我们有两种不同的选择来做同样的事情。两者有何不同?

44u64gxh

44u64gxh1#

我们基本上有3种类型的卷或持久数据挂载:
1.绑定挂载
1.命名卷

  1. dockerfiles中的卷
    绑定挂载基本上只是绑定容器中主机的某个目录或文件(docker run -v /hostdir:/containerdir IMAGE_NAME
    命名卷是您使用docker volume create VOLUME_NAME手动创建的卷。它们是在/var/lib/docker/volumes中创建的,只能通过它们的名称引用。假设你创建了一个名为“mysql_data”的卷,你可以像这样引用它docker run -v mysql_data:/containerdir IMAGE_NAME
    然后是dockerfiles中的卷,它们是由VOLUME指令创建的。这些卷也是在/var/lib/docker/volumes下创建的,但没有特定的名称。他们的“名字”只是某种散列。卷是在运行容器时创建的,无论您是否使用-v启动容器,都可以方便地保存持久数据。开发人员可以说重要的数据在哪里,什么应该持久化。

我应该使用什么?

你想使用什么主要取决于你的偏好或管理。如果你想把所有东西都保存在“docker区域”(/var/lib/docker),你可以使用卷。如果你想保持自己的目录结构,你可以使用绑定。

Docker建议使用卷而不是使用绑定,因为卷是由Docker创建和管理的,绑定有更多的失败可能性(也是由于第8层的问题)。

如果您使用绑定并希望将容器/应用程序转移到另一台主机上,则必须重建目录结构,因为卷在每个主机上都更加统一。

svmlkihl

svmlkihl2#

Volumes是用于持久化Docker容器生成和使用的数据的首选机制。虽然bind mounts依赖于主机的目录结构,但volumes完全由Docker管理Volumes通常是比在容器的可写层中持久化数据更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外。More on

-v--mount行为的区别

由于-v--volume标志已经成为Docker的一部分很长时间了,因此它们的行为无法更改。这意味着-v--mount之间有一个行为不同。
如果您使用-v--volume绑定挂载Docker主机上尚不存在的文件或目录,则-v会为您创建端点。始终创建为目录
如果您使用--mount绑定挂载Docker主机上尚不存在的文件或目录,Docker不会自动为您创建,而是会生成错误。More on

Docker for Windows共享文件夹限制

Docker for Windows确实使大部分VM对Windows主机透明,但它仍然是一个虚拟机。例如,当使用–v和mongo容器时,MongoDB需要文件系统支持的其他东西。还有一个问题是卷装载速度非常慢。More on

ctzwtxfj

ctzwtxfj3#

绑定装载就像卷的超集(命名或未命名)。绑定挂载是通过将主机系统(主机系统是本机linux机器或vm(在windows或mac中))中的现有文件夹绑定到容器中的路径来创建的。
Volume命令会在主机系统中的/var/lib/docker下创建一个新文件夹
推荐使用卷,因为它们由Docker引擎(prune,rm等)管理。
绑定挂载的一个很好的用例是将开发文件夹链接到容器中的路径。主机文件夹中的任何更改都将反映在容器中。绑定挂载的另一个用例是保存应用程序日志,它不像数据库那样至关重要。
两种情况下的命令语法几乎相同:

绑定挂载:请注意,主机路径应以“/”开头。使用$(pwd)方便。

docker container run -v /host-path:/container-path image-name

未命名卷:在主机中创建具有任意名称的文件夹

docker container run -v /container-path image-name

命名卷:不应该以'/'开头,因为这是为绑定挂载保留的。“volume-name”在这里不是完整路径。该命令将导致在主机中创建路径为“/var/lib/docker/volumes/volume-name”的文件夹。

docker container run -v volume-name:/container-path image-name

命名卷也可以在运行容器之前创建(docker volume create)。但这几乎从来没有必要。

igetnqfo

igetnqfo4#

作为开发人员,我们总是需要在工具或技术提供的选项之间进行比较。对于Volume & Bind挂载,我建议列出您正在尝试容器化的应用程序类型。
以下是我在选择Volume over Bind Mounts之前要考虑的参数:

  1. Docker在容器外轻松地为卷提供各种CLI命令。
    1.对于备份和恢复,卷比绑定容易得多,因为它取决于底层主机操作系统。
    1.卷与平台无关,因此它们可以在Linux和Windows容器上工作。
    1.有了Bind,你就有两种技术需要处理。您的主机目录结构以及Docker。
    1.卷的迁移不仅在本地机器上更容易,而且在云机器上也更容易。
    1.卷可以在多个容器之间轻松共享。

相关问题