Docker容器卷在未运行时如何工作?

15

以典型的仅包含数据的 Docker 容器为例:

FROM stackbrew/busybox:latest

RUN mkdir /data
VOLUME /data

现在我已经看到很多像这样运行的容器:

docker run -name my-data data true

true 命令一运行就退出了,所以容器也停止了。但令人惊讶的是,当您通过 --volumes-from my-data 将其连接到另一个容器时,它仍然继续为该卷提供服务。

我的问题是, 这是如何工作的? 一个停止的容器如何仍然允许访问它的卷?

1个回答

35
在 Docker 中,卷不是一个顶级的事物。它们“只是”容器元数据的一部分。
当您在 Dockerfile 中使用 VOLUME 或使用 -v 启动容器时,Docker 将在 /var/lib/docker/volumes* 中创建一个带有随机 ID 的目录(这与使用 commit 创建映像的过程完全相同,只是它是空的),并将该随机 ID 添加到容器的元数据中。
容器启动时,Docker 会将目录 /var/lib/docker/volumes/* 挂载到卷的指定位置。
当您使用 volumes-from 时,Docker 只需从另一个容器(无论其是否正在运行)中查找卷 ID 和位置,并将目录挂载到设置的位置。
卷与运行时没有关联,它们只是被挂载的目录。
* 在较新版本中,Docker 现在使用 vfs 驱动程序进行存储,/var/lib/docker/volumes/ 仅用于存储大小、创建时间等元数据。实际数据存储在 /var/lib/docker/vfs/dir/<volume id> 中。

非常好的回答!现在明白了。谢谢 :) - Mehdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接