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
4条答案
按热度按时间44u64gxh1#
我们基本上有3种类型的卷或持久数据挂载:
1.绑定挂载
1.命名卷
绑定挂载基本上只是绑定容器中主机的某个目录或文件(
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层的问题)。
如果您使用绑定并希望将容器/应用程序转移到另一台主机上,则必须重建目录结构,因为卷在每个主机上都更加统一。
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 onDocker for Windows共享文件夹限制
Docker for Windows确实使大部分VM对Windows主机透明,但它仍然是一个虚拟机。例如,当使用
–v
和mongo容器时,MongoDB需要文件系统支持的其他东西。还有一个问题是卷装载速度非常慢。More onctzwtxfj3#
绑定装载就像卷的超集(命名或未命名)。绑定挂载是通过将主机系统(主机系统是本机linux机器或vm(在windows或mac中))中的现有文件夹绑定到容器中的路径来创建的。
Volume命令会在主机系统中的/var/lib/docker下创建一个新文件夹
推荐使用卷,因为它们由Docker引擎(prune,rm等)管理。
绑定挂载的一个很好的用例是将开发文件夹链接到容器中的路径。主机文件夹中的任何更改都将反映在容器中。绑定挂载的另一个用例是保存应用程序日志,它不像数据库那样至关重要。
两种情况下的命令语法几乎相同:
绑定挂载:请注意,主机路径应以“/”开头。使用$(pwd)方便。
未命名卷:在主机中创建具有任意名称的文件夹
命名卷:不应该以'/'开头,因为这是为绑定挂载保留的。“volume-name”在这里不是完整路径。该命令将导致在主机中创建路径为“/var/lib/docker/volumes/volume-name”的文件夹。
命名卷也可以在运行容器之前创建(docker volume create)。但这几乎从来没有必要。
igetnqfo4#
作为开发人员,我们总是需要在工具或技术提供的选项之间进行比较。对于Volume & Bind挂载,我建议列出您正在尝试容器化的应用程序类型。
以下是我在选择Volume over Bind Mounts之前要考虑的参数:
1.对于备份和恢复,卷比绑定容易得多,因为它取决于底层主机操作系统。
1.卷与平台无关,因此它们可以在Linux和Windows容器上工作。
1.有了Bind,你就有两种技术需要处理。您的主机目录结构以及Docker。
1.卷的迁移不仅在本地机器上更容易,而且在云机器上也更容易。
1.卷可以在多个容器之间轻松共享。