阅读文档后,我发现自己对于如何最好地管理生产应用程序/服务数据有些困惑。
似乎有 3 个选择:
- 只需将卷映射到主机目录(即
-v
的参数docker run
) - 为数据创建docker容器镜像(即单独的容器和
--volumes-from
) - 创建docker卷(即
docker volume create
)
现在,似乎可接受的做法是选项#2,但我想知道#3的目的是什么。
特别是如何正确处理这些场景,docker volume
以及在每种情况下使用数据卷容器还是这样更好?
- 您需要将应用程序数据放在服务器中的单独卷和/或存储层中
- 备份
- 恢复数据
答案1
我认为 #2 和 #3 几乎是同一件事,主要区别在于 #3 没有停止的容器(它实际上只是一个命名卷)。例如,您可以创建一个命名卷,并执行与 #2 类似的操作-v
。
创建命名卷:
$ docker volume create --name test
从容器中挂载一些数据并写入该卷:
$ docker run -v test:/opt/test alpine touch /opt/test/hello
然后,您可以将同一个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
这样做的好处是,如果您删除仅包含数据的容器,卷不会意外消失。现在您可以使用docker volume
子命令来管理它。
$ d volume ls
DRIVER VOLUME NAME
local test
它还为将来的卷驱动程序提供了可能性,因此您可能能够在主机之间共享卷(即通过 NFS 命名卷)。这方面的例子可能是弗洛克和护航关于您提到的移动或备份数据的具体问题,Convoy 有专门用于备份数据的子命令,并允许将其存储在主机外部的 NFS 或 EBS 上。
因此,我认为更新颖的方法(Docker 1.9+)是使用命名卷而不是仅数据容器。
答案2
从 Docker 1.9 开始,使用卷 API(docker volume create --name mydata
)比数据卷容器更受欢迎。截至 2016 年 2 月,Docker卷文档已经过时了。Docker 的人们自己建议使用数据卷容器“不再被视为推荐模式” “在大多数情况下(如果不是全部),命名卷应该能够替换仅包含数据的卷,“ 和 ”我看不出有任何理由使用仅数据容器”