如何在 docker 卷容器和 docker 卷之间做出决定?

duk*_*ing 24 storage docker

阅读文档后,我发现自己对如何最好地管理生产应用程序/服务数据有些困惑。

似乎有3种选择:

  1. 只需将卷映射到主机目录(即 的-v参数docker run
  2. 为数据创建一个 docker 容器镜像(即单独的容器和--volumes-from
  3. 创建一个 docker 卷(即docker volume create

现在,似乎公认的做法是选项 #2,但我想知道 #3 的目的是什么。

特别是您如何正确处理这些场景,docker volume对于每种情况,最好使用数据卷容器还是这个?

  • 您需要服务器中单独卷和/或存储层中的应用程序数据
  • 备份
  • 恢复数据

Qui*_*ant 22

从 Docker 1.9 开始,使用Volumes API ( docker volume create --name mydata)创建命名卷比使用数据卷容器更受欢迎。截至 2016 年 2 月,Docker卷文档已经过时了。Docker 的人自己建议数据卷容器“不再被认为是推荐的模式”,“命名卷应该能够在大多数(如果不是全部)情况下替换仅数据卷”,并且“我看不出有什么理由可以使用纯数据容器。”


And*_*inn 18

我认为#2 和#3 几乎是一回事,主要区别在于#3 没有停止的容器(它实际上只是一个命名卷)。例如,您可以创建一个命名卷并执行与 #2 类似的操作-v

创建命名卷:

$ docker volume create --name test
Run Code Online (Sandbox Code Playgroud)

从容器挂载一些数据并将其写入该卷:

$ docker run -v test:/opt/test alpine touch /opt/test/hello
Run Code Online (Sandbox Code Playgroud)

然后,您可以test在另一个容器中安装相同的卷并读取数据:

$ docker run -v test:/opt/test alpine ls -al /opt/test     
total 8
drwxr-xr-x    2 root     root          4096 Jan 23 22:28 .
drwxr-xr-x    3 root     root          4096 Jan 23 22:29 ..
-rw-r--r--    1 root     root             0 Jan 23 22:28 hello
Run Code Online (Sandbox Code Playgroud)

这里的优点是,如果您删除仅数据容器,该卷不会意外消失。您现在可以使用docker volume子命令管理它。

$ d volume ls
DRIVER              VOLUME NAME
local               test
Run Code Online (Sandbox Code Playgroud)

它还为卷驱动程序打开了可能性,因此您可以在主机之间共享卷(即通过 NFS 命名卷)。这方面的例子可能是FlockerConvoy。就移动或备份数据而言,Convoy 具有用于备份数据的特定子命令,并允许在主机外部的 NFS 或 EBS 上进行存储。

出于这个原因,我认为更新派的方式(Docker 1.9+)是使用命名卷而不是仅数据容器。