docker-compose:在哪里存储服务的configuration?

我正在使用docker-compose / docker-machine构build一个ELK(elasticsearch / logstash / kibana)堆栈。 该计划是将其部署到数字海洋液滴,并在需要时使用Swarm对其进行缩放。

它工作得很好,但我有点困惑,我应该为服务存储configuration(例如logstash的configuration文件,或者nginx的SSL证书)。

起初,我只是将一个主机目录挂载为卷。 问题是所有的configuration文件必须在docker主机上可用,所以我必须将它们同步到数字水滴。

然后我想我有一个非常聪明的想法:创build一个包含所有configuration的数据容器,并让其他服务使用volumes_from访问它:

 config: volumes: - /conf build: context: . # this just copies the conf folder into the image dockerfile: /dockerfiles/config/Dockerfile logstash: image: logstash:2.2 volumes_from: - config 

这种方法的问题变得非常明显:每次我改变任何configuration,我需要停止所有容器链接到configuration容器,重新创buildconfiguration图像和容器,然后再次启动服务。 对于正常运行时间不是很好。

那么,最好的方法是什么? 理想情况下,configuration文件将在一个容器内,所以我可以将它发送到任何地方。

解决这个问题的一个常见的解决scheme是将负载平衡器放在服务之前。 这样,当你想改变configuration,你可以启动一个新的容器,负载平衡器将会把它拿起来,然后停止旧的容器。 没有停机时间,它可以让你重新加载configuration。

另一种select可能是使用命名卷。 然后你可以修改指定卷的内容,使用它的任何容器都会看到新的文件。 但是,如果您使用swarm使用多个节点,则需要使用支持多主机卷的卷驱动程序。

您是否考虑过使用扩展机制并覆盖设置文件? 将第二docker-compose.override.yml放在与主要撰写文件相同的目录中,或者在撰写文件中使用显式扩展名。 看到

https://docs.docker.com/compose/extends/

这样你就可以以透明的方式集成一个configuration文件,或者通过环境variables来控制你想要改变的参数,这些环境variables在覆盖组合中是不同的。