“与命名卷不同,绑定安装不会自动将容器内容复制到主机”

tha*_*nce 6 mount volume docker

需要澄清这里的评论:

绑定挂载的唯一“问题”是它不会自动将容器内容复制到主机,这与命名卷不同。docs.docker.com/compose/compose-file/#volumes

这准确吗?如果是,那么:

  1. bind mount当使用(在容器重新启动时保留数据)时,如何将容器的“新数据”(例如不断增长的数据库)获取到主机中?
  2. 在此之前,Docker 是如何在容器重启后持久保存数据的named volumes

BMi*_*tch 8

绑定挂载的唯一“问题”是它不会自动将容器内容复制到主机,这与命名卷不同。

这准确吗?

接近准确,但我可以看到其中的混乱。主机卷(又名绑定挂载)没有 docker 的初始化功能。对于匿名卷和命名卷,docker 将使用该路径中映像的内容来初始化卷。此初始化包括所有权和权限,这有助于避免权限错误。此初始化仅在创建容器且卷为新卷或空卷时运行,因此后续容器不会拾取对较新映像版本中的映像所做的更改。

如果是,那么:

  1. 当使用绑定挂载(在容器重新启动时保留数据)时,如何将容器的“新数据”(例如不断增长的数据库)获取到主机中?

从容器中的应用程序读取和写入的操作将继续按预期传输到绑定挂载中使用的主机文件系统。只是初始化步骤没有运行。

  1. 在命名卷出现之前,Docker 如何在容器重启时保留数据?

曾经有数据容器,从其他容器挂载卷,但这种方式不灵活(所有卷路径都固定到数据容器中的路径),并且持久数据与临时容器混合管理,因此已被逐步淘汰。

卷用于处理容器之间的数据持久性。单个容器重新启动(而不是被替换)仍将具有所有容器特定的文件系统更改。该docker rm命令将删除这些文件系统更改以及容器日志和容器的元数据/配置。

容器特定的更改是 docker 使用的覆盖文件系统的读/写顶层​​。卷挂载都是单独挂载到该覆盖文件系统的子目录中(就像/home/var通常是 Linux 主机的文件系统中的单独文件系统挂载/,对这些其他路径的所有读取和写入都会转到单独的底层文件系统)。


Dav*_*aze 5

如果要将卷装载到容器中,并且希望该卷可靠地包含映像中的某些内容,则需要在容器启动时手动将其复制到那里。一种方法是使用入口点包装脚本:

#!/bin/sh
# Copy data into a possibly-mounted location
cp -a /app/static /var/www
# Then run the image's CMD
exec "$@"
Run Code Online (Sandbox Code Playgroud)

您可以将其包含在图像的 Dockerfile 中

# Must use JSON-array syntax
ENTRYPOINT ["/app/entrypoint.sh"]
CMD same as it was before
Run Code Online (Sandbox Code Playgroud)

这里需要注意关于 Docker 命名卷的初始化行为的两个重要细节。第一个,您注意到,Docker 只将内容复制到 Docker 命名的卷中;绑定挂载不会发生这种情况,在 Kubernetes 等其他环境中也不会发生这种情况。

第二个更微妙的细节是初始化仅在容器第一次运行时发生。如果您装载到容器中的卷中已经有内容,它将隐藏已经存在的内容。在其他 SO 问题中,您可以看到此清单,例如,“我向我的 Nodepackage.json文件添加了一个包,但是当我将node_modules目录放入卷中时,它会忽略更新”或“我正在使用卷导出内容”到 nginx 代理,但它不更新”。


mik*_*key 2

我认为 @BMitch 接受的答案是正确的,但我只是尝试添加一些细节,希望有用。

这准确吗?如果是,那么:

鉴于我的主张正在接受审查 - 我完全听从@BMitch :)!不过我还要补充一点:

当使用绑定挂载(在容器重新启动时保留数据)时,如何将容器的“新数据”(例如不断增长的数据库)获取到主机中?

主机卷命名卷都可以实现这一点。

我认为争论的焦点是你希望在以下方面发生什么:

  • 容器的第一次运行
  • 容器的后续运行
  • 卷在主机系统上的位置/可访问性。

一旦卷附加到容器(无论是命名卷还是绑定安装),存储到该卷的任何内容都应该在重新启动之间保留 - 这实际上是免费的。这假设相同的 docker-compose 配置,并且没有手动删除卷。

以前,使用命名卷有一点限制,因为您无法像使用绑定安装一样轻松地跟踪日志或直接从主机编辑代码- 但现在问题似乎已经解决/有解决办法。

绑定安装能够在重新启动之间保留数据。我个人发现绑定卷在 99% 的情况下都能满足我的要求,也就是说,命名卷现在可以“完成所有工作”,并且我将继续使用这些卷。

但它们之间存在差异,我确信它们仍然会偶尔咬人,要求他们接触真正的专家,而不是像我这样的用户:)。

  • 谢谢。我个人喜欢“绑定安装”,因为它们是有形的。它们是系统上的文件夹。因此,如果需要备份数据,找到该文件夹​​并进行备份就很简单了。对于“命名卷”,我担心在某些时候我可能会进行“修剪”并最终删除我忘记备份的孤立卷。它们只是不那么有形和直观。 (3认同)