docker-compose 服务的集中配置

Posted

技术标签:

【中文标题】docker-compose 服务的集中配置【英文标题】:Centralised configuration of docker-compose services 【发布时间】:2016-02-02 08:47:56 【问题描述】:

想象一个不平凡的docker compose 应用程序,在 web 应用程序前面有 nginx,以及一些链接的数据存储:

web:
  build: my-django-app
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - redis
    - mysql
    - mongodb
nginx:
  image: nginx
  links:
    - web
redis:
  image: redis
  expose:
    - "6379"
mysql:
  image: mysql
  volumes:
    - /var/lib/mysql
  environment:
    - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    - MYSQL_DATABASE=myproject
mongodb:
  image: mongo

数据库很容易配置(目前),容器公开了非常好的环境变量来控制它们(参见mysql 容器),但是nginx 呢?我们需要为此模板化一个 vhost 文件,对吧?

我不想推出自己的图像,这需要为每个更改的配置重新构建,从不同的 devs 设置到 test,通过 登台制作。如果我们想以轻量级的方式通过翻转配置选项来进行 A/B 测试,该怎么办?

这里需要一些集中配置管理,也许是由 docker-compose 控制的可以将配置文件写入共享卷的东西?

随着新服务的添加,这一点只会变得更加重要(想象一下微服务云,而不是本例中的单体网络应用)

在 docker-compose 项目中管理配置的正确方法是什么?

【问题讨论】:

我很想在 envs 中保留配置(这里的基本原理12factor.net/config),但是您无法使用简单的键/值轻松配置哪些服务,例如上面的 nginx 示例? 最简单的解决方案就是编写一个入口点脚本,用环境变量中的值填充 nginx 配置文件,然后启动 nginx。这能回答你的问题吗? 谢谢阿德里安,这确实适用于 nginx,但是下一个和下一个呢,似乎很奇怪,没有现有的解决方案(etcd,confd?)模式 或者,您是说,根据您的经验,一个小小的 entrypoint.sh 是否足以引导每个容器? 我在回答中扩展了我的评论。我认为这在绝大多数情况下就足够了,而且肯定是一种常见的模式。 【参考方案1】:

通常,您会发现大多数容器使用入口点脚本通过使用环境变量填充配置文件来配置应用程序。有关此方法的高级示例,请参阅 entrypoint script 的 Wordpress official image。

因为这是一种常见的模式,Jason Wilder 创建了dockerize 项目来帮助自动化流程。

【讨论】:

以上是关于docker-compose 服务的集中配置的主要内容,如果未能解决你的问题,请参考以下文章

使用 docker-compose 将 json 写入 syslog

docker-compose

Pycharm docker-compose解释器不加载库

docker-compose

基于fabric配置文件的Docker-compose学习

使用docker-compose部署极狐gitlab