Docker 1.12:多个副本,单个数据库

随着Docker 1.12引入新的“swarm模式”,我们一直试图将我们的应用程序迁移到容器上,并利用swarm模式的编排和集群。

我们的应用程序需要运行一些初始数据库脚本才能启动。 我们并没有将数据库打包到我们的dockerized应用程序中,以便它可以遵循无状态的微服务架构,并且多个容器最终会与单个数据库实例(目前)进行通信。

在创build服务时,我们不能使用--replicascreate service命令,因为多个实例会试图在单个数据库上创build表并失败。 尽pipe我们的脚本会检查数据库是否已经build立,并跳过创build,但是由于所有容器同时启动,所以不能使用。

我们找不到任何等待 –我们可以利用docker工人来解决这个问题的机制。 如果我们只能在第一个创build数据库的时候启动第二个容器(并且暴露了端口 ),但是我们怎么能为此configuration容器间通信呢?

或者,像flywaydb的工具可以帮助某种方式吗?

这应该如何用于生产?

从Flyway FAQ :

多个节点可以并行迁移吗? 是! Flyway使用数据库的locking技术来协调多个节点。 这可以确保即使即使您的应用程序的多个实例同时尝试迁移数据库,它仍然有效。 群集configuration完全受支持。

没有简单的方法来协调容器之间的这种。 它基本上需要分布式locking解决scheme。 获取锁的第一个容器可以创build数据库,而其他没有获取锁的容器需要等待。

在AWS中,您可以利用DynamoDB。 DynamoDB支持条件更新。 容器首先尝试使用“attribute_not_exists(yourKey)”在DynamoDB中创buildlocking键。 第一次创作会成功,其他作品将被拒绝。 第一个容器需要在DynamoDB中创build另一个键来指示数据库已准备就绪。 其他容器只是等待,直到准备好键被创build。

或者你可以在你的服务部署脚本中完成。 该脚本可以创build1个副本的服务。 然后继续检查是否创build数据库。 如果是的话,扩展服务,如docker service update yourservicce --replicas 5