我正在使用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
这种方法的问题变得非常明显:每次更改任何配置时,我都需要停止链接到配置容器的所有容器,重新创建配置映像和容器,然后再次启动服务。对正常运行时间不太好:(。
那么,最好的方法是什么?理想情况下,配置文件将位于容器内,因此我可以将其发送到任何地方。
答案 0 :(得分:2)
此问题的一个常见解决方案是将负载均衡器放在服务前面。这样,当您想要更改配置时,您可以启动一个新容器,负载均衡器将启动它,然后停止旧容器。没有停机时间,它可以让你重新加载配置。
另一种选择可能是使用命名卷。然后,您只需修改指定卷的内容,使用它的任何容器都将看到新文件。但是,如果您使用swarm多个节点,则需要使用支持多主机卷的卷驱动程序。
答案 1 :(得分:0)
您是否考虑过使用扩展机制并覆盖设置文件?将第二个docker-compose.override.yml
放在与主要撰写文件相同的目录中,或在撰写文件中使用显式扩展名。参见
https://docs.docker.com/compose/extends/
通过这种方式,您可以以透明的方式集成配置文件,或者通过覆盖组合中不同的环境变量来控制您想要更改的参数。