使用volume create部署Docker应用程序

3
我有一个使用SQLite数据库的Python应用程序(它是一个每日通过cron运行的数据收集器)。我想使用Docker在AWS或Google容器引擎上部署它。我看到三个主要步骤:
1. 将应用程序制作成容器并在本地进行测试。
2. 在AWS或GCE上部署和运行应用程序。
3. 定期备份数据库并下载到本地存档中。

最近的帖子(关于Docker,StackOverflow和其他地方)说自1.9以来,卷现在是处理持久化数据的推荐方式,而不是“数据容器”模式。为了未来的兼容性,我总是喜欢使用首选的习惯用法,但是与数据容器相比,卷似乎更具挑战性。我错过了什么吗?

按照“数据容器”模式,我可以轻松地:

  • 使用所有静态程序和配置文件构建基础镜像。
  • 从该镜像创建数据容器镜像,并将我的数据库和备份目录复制到其中(在Dockerfile中使用简单的COPY命令)。
  • 将两个镜像推送到Docker Hub。
  • 将它们下载到AWS。
  • 运行数据和基础镜像,使用“--volume-from”引用数据。

使用“docker volume create”:

  • 我不清楚如何将我的数据库复制到卷中。
  • 我非常不清楚如何将包含数据库的卷上传到AWS或GCE...无法PUSH / PULL卷。

我是否忽略了有关卷的某些内容?
有没有一个好的概述来使用卷来实现我想要做的事情?
根据我的步骤3,有没有一种推荐的、惯用的方法来备份和下载数据(使用数据容器模式或卷)?

1个回答

3
当您首次使用空命名卷时,它将在第一次使用它的位置接收镜像卷数据的副本(与基于主机的卷不同,后者完全覆盖挂载点与主机目录)。因此,您可以将卷内容初始化为主要映像中的卷,在注册表中上传该映像并将其拉到目标主机上,在该主机上创建一个命名卷,将您的映像指向该命名卷(使用docker-compose使最后两个步骤变得容易,最多只有2个命令docker volume create <vol-name>docker run -v <vol-name>:/mnt <image>),然后它将被填充您的初始数据。
从基于容器的卷或命名卷中检索数据是相同的过程,您需要在容器中安装卷并将其导出/备份到外部位置。唯一的区别在于命令行,而不是--volumes-from <container-id>,您有-v <vol-name>:/mnt。您可以使用相同的过程将数据导入卷中,从而无需在其卷中初始化应用程序映像。
新进程的最大优势是它清楚地分离了容器中的数据。您可以清除系统上的所有容器,而不必担心丢失数据,并且系统上列出的任何卷都以其名称清晰明了,而不是随机分配的名称。最后,命名卷可以挂载在目标上的任何位置,如果您有多个数据源(例如配置文件与数据库),则可以选择挂载哪些卷。

非常感谢您的解释!这是很棒的东西!向Docker团队致敬。我一直在尝试寻找更多关于此的文档,但运气不太好。https://docs.docker.com/engine/userguide/containers/dockervolumes/只是模糊地讨论了您所描述的内容,并且没有涉及到您所描述的推送/拉取镜像时数据保留的神奇之处。您知道有关此的更深入的文档吗? - James Haskell
这里有一些解释:https://madcoda.com/2016/03/docker-named-volume-explained/. - James Haskell
在测试中发现,当您运行一个空命名卷时,它会自动获取映像卷数据的行为。我没有看到其他关于这个细节的文档,但它与容器基础卷发生的情况完全相同,以便进行轻松过渡。您镜像内部的数据是如何设计您的Dockerfile的一部分,我建议将其保持到最少。对于其他所有内容,我建议创建一个实用程序容器来进行导入/导出/备份。 - BMitch

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