2016-06-10 60 views
2

我有一个使用SQLite数据库(它是每天由cron运行的数据收集器)的Python应用程序。我想要使​​用Docker在AWS或Google Container Engine上部署它。我看到三个主要步骤:
1. Containerize并在本地测试应用程序。
2.在AWS或GCE上部署并运行应用程序。
3.定期备份数据库并将其下载回本地存档。使用卷创建Docker应用程序创建

近期文章(在Docker上,StackOverflow和其他地方)表示,自1.9以来,卷现在是处理持久数据的推荐方式,而不是“数据容器”模式。为了将来的兼容性,我总是喜欢使用首选的,惯用的方法,但Volumes似乎比数据容器更具挑战性。我错过了什么?

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

  • 建立一个基本映像的所有静态程序和配置文件。
  • 从该映像创建一个数据容器映像并将我的数据库和备份目录复制到它(Dockerfile中的简单COPY)。
  • 将两个图像都推送到Docker Hub。
  • 将它们拉到AWS。
  • 运行数据和基础映像,使用“-volume-from”来引用数据。

使用“泊坞窗卷创建”:

  • 我不清楚怎么我的数据库复制到卷。
  • 我很不清楚如何让这个数据库(包含数据库)达到AWS或GCE ...你不能推/卷一个卷。

我错过了关于卷的内容吗?
有没有很好的使用卷来做我想做的事情?
按照我的步骤3,是否有推荐的,惯用的方法来备份和下载数据(使用数据容器模式或卷)?

回答

2

当您第一次使用空的已命名卷时,它将首先使用图像的卷数据的副本(与基于主机的卷完全覆盖主机目录的装载点不同)。因此,您可以将主映像中的卷内容初始化为卷,将该映像上载到注册表并将该映像下载到目标主机,在该主机上创建一个命名卷,将映像指向该命名卷(使用docker- compose使最后两个步骤变得简单,它最多只有2个命令,最多为docker volume create <vol-name>docker run -v <vol-name>:/mnt <image>),并且它将填充您的初始数据。

从基于容器的卷或命名卷检索数据是一个相同的过程,您需要将该卷挂载到容器中并将导出/备份运行到您的外部位置。唯一的区别是在命令行中,而不是--volumes-from <container-id>您有-v <vol-name>:/mnt。您也可以使用相同的流程将数据导入到卷中,从而无需使用卷中的数据初始化应用程序映像。

新工艺的最大优点是它清楚地将数据从容器中分离出来。您可以清除系统上的所有容器,而不用担心丢失数据,并且系统上列出的任何卷的名称都是明确的,而不是随机分配的名称。最后,命名卷可以安装在目标上的任何位置,并且如果您有多个数据源(例如配置文件vs数据库),则可以选择要装入的卷。

+0

非常感谢您的解释!这是伟大的东西!向Docker团队表示敬意。我一直在试图找到更多关于这方面的文档,并没有太多的运气。 https://docs.docker.com/engine/userguide/containers/dockervolumes/只是模糊地讨论了你所描述的内容,并没有涉及到按照/拉取图像时保留的数据的魔力描述。你知道更多关于这方面的深入文档吗? –

+0

这解释了一下:https://madcoda.com/2016/03/docker-named-volume-explained/。 –

+0

对于一个空的已命名卷在运行时自动获取图像卷数据的副本的行为,我已经通过测试发现,但没有看到有关该详细信息的任何其他文档,但它确切地反映了容器发生的情况基于卷的容易过渡。你的图像中的数据是你如何设计Dockerfile的一部分,我会保持最低限度。对于其他任何事情,我会为导入/导出/备份创建一个实用程序容器。 – BMitch