我目前正在构建一个Docker Swarm集群,它由3个管理节点和3个工作节点组成。我将要在这个设置中部署的应用程序包括一个Laravel后端,需要将其代码分布在多个容器中以实现可扩展性。我已经尝试过使用GlusterFS卷和带有Ceph后端的rex-ray作为共享存储来处理我的卷,但是GlusterFS不够可靠,而Ceph在我的情况下有点过于强大和复杂 :)
当前的设置看起来像这样。我在Docker之外运行Percona集群,在这些服务器上运行GlusterFS,并简单地将它们挂载到Docker Workers中。
Docker Managers
+-------------------------------------------------------------+
| |
| +---------+ +---------+ +---------+ +---------+ |
| | | | | | | | | |
| | HAproxy +---+ HAproxy +---+ HAproxy +----+ SSL | |
| | | | | | | | Manager | |
| +----+----+ +----+----+ +----+----+ +---------+ |
| | | | |
+-------------------------------------------------------------+
| | |
| | | Docker Workers
+-------------------------------------------------------------+
| | | | |
| +----+-------------+-------------+--------------------+ |
| | | |
| | Applicaties | |
| | | |
| +---+--------------+---------------+--------------+---+ |
| | | | | |
| | | | | |
| +---+----+ +---+----+ +----+---+ +----+---+ |
| | Mysql | | Mysql | | Mysql | | Mysql | |
| | LB +-----+ LB +-----+ LB +-----+ LB | |
| +---+----+ +----+---+ +----+---+ +----+---+ |
| | | | | |
| +---------------+-------+------+--------------+ |
| | | | |
+-------------------------------------------------------------+
| | |
| | |
| | |
+-------+--------+ +--------+-------+ +--------+-------+
| | | | | |
| MySQL01 | | MySQL02 | | MySQL03 |
| Gluster01 +-----+ Gluster02 +----+ Gluster03 |
| | | | | |
+----------------+ +----------------+ +----------------+
然后我将它们装入 PHP 容器中,就像这样:
--mount type=bind,source=/mnt/client-data,target=/var/www/html/
这个方法虽然可行,但速度非常慢。页面加载时间约为10秒,当文件没有挂载时(它们存在于容器中),页面加载时间约为2-3秒。
我了解到Flocker,这似乎非常有趣,但我认为flocker卷只能挂载在一个容器上。这是真的吗?
我正在尝试的另一种解决方案是,每次创建新容器时从git拉取代码。这实际上是一个不错的解决方案,但拉取代码和运行composer需要大约5分钟,当我推送更新时,我需要重新启动所有容器。
如何在多个主机(甚至数据中心)的不同容器之间共享我的代码是最好的解决方案?目前我可以访问许多不同的存储后端(Ceph、NFS、gluster),创建一个新的存储后端也不是问题。
编辑:为什么在这种情况下Gluster不可靠?我可能说错了...使用卷驱动程序插件在Gluster上使用docker卷时,卷通常会在创建服务时很好地挂载,但如果在群集中发生重新调度,则卷很少再次挂载。我稍后会研究这个问题,以确定出了什么问题,但我目前没有太多空闲时间。事实上,Gluster是可靠的。只是在这种情况下不可靠。