docker-compose:存储服务配置的位置?

时间:2016-03-09 21:43:53

标签: docker docker-compose docker-machine

我正在使用docker-compose / docker-machine构建一个ELK(elasticsearch / logstash / kibana)堆栈。计划是将其部署到digitalocean droplet,如果需要,使用Swarm进行缩放。

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

首先,我刚刚将主机目录挂载为卷。问题是所有配置文件必须在docker主机上可用,所以我必须将它们同步到digitalocean droplet。

然后我认为我有一个非常明智的想法:创建一个包含所有配置的数据容器,让其他服务使用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

这种方法的问题变得非常明显:每次更改任何配置时,我都需要停止链接到配置容器的所有容器,重新创建配置映像和容器,然后再次启动服务。对正常运行时间不太好:(。

那么,最好的方法是什么?理想情况下,配置文件将位于容器内,因此我可以将其发送到任何地方。

2 个答案:

答案 0 :(得分:2)

此问题的一个常见解决方案是将负载均衡器放在服务前面。这样,当您想要更改配置时,您可以启动一个新容器,负载均衡器将启动它,然后停止旧容器。没有停机时间,它可以让你重新加载配置。

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

答案 1 :(得分:0)

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

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

通过这种方式,您可以以透明的方式集成配置文件,或者通过覆盖组合中不同的环境变量来控制您想要更改的参数。