Docker容器中的配置管理

时间:2017-02-16 06:18:26

标签: docker continuous-deployment devops configuration-management

目前我有配置文件存储在GitHub中。我有一个格式如下的json文件 {     DEV:           { key1 : val1, key2 : val2 },     PROD:           { key1 : val1, key2 : val2 } }

我的构建系统克隆git repo,构建项目并创建Docker镜像并存储在私有Docker注册表中。我将jar文件和配置文件复制到Docker镜像中。每当我旋转一个容器时,我都会注入一个环境变量(ENV = DEV / PROD),我的代码使用它来根据环境读取配置。

我在这里有几个问题:

  • 维护特定于环境的配置的最佳方法是什么?

  • 配置文件可能包含敏感数据,如api密钥和密码,当我构建Docker镜像时,如何加密,存储和解密?

  • 如果我想更改某些配置,我需要触发构建,因为我的配置文件放在Docker镜像中。我可以将配置文件放在Docker容器之外作为卷,以便我可以替换配置文件并重新启动容器,以便代码读取更新的配置吗?如果我想放置在Docker容器之外,我还可以使用任何集群管理工具进行容器编排/管理(Kubernetes / ECS)吗?
  • 通过重新启动容器而不是构建新的docker镜像并部署新容器,使在Docker容器中运行的应用程序读取更新配置的方法是什么?

2 个答案:

答案 0 :(得分:1)

  1. ENV变量很好。如果你有一个非常复杂的系统,你可以旋转Consul和/或Vault来管理安全配置,但是如果你的系统很小,那么一团糟就不值得付出努力。
  2. 您可以将所有配置加密为哈希,并使用只知道应用程序的密钥对其进行解密。
  3. 使用docker-compose。它允许完美的机制 - 您实际请求的机制,例如docker-compose.yml

    version: "2"  
    services:   
      server:
        hostname: server
        container_name: server
        image: serverBla
        build: ./server
        env_file:
          - ./config/config.env
    
  4. 文件./config/config.env是您的“动态”配置。您只需重新创建容器即可刷新应用内的值。 据我所知,docker-compose适用于你提到的任何事情。

答案 1 :(得分:1)

我对你的大部分问题的回答是"Vault by Hashicorp"

您可以在您的环境中启动Vault群集,让容器连接到,并在启动和运行时从Vault检索机密。实现秘密检索的最简单方法是在启动时将秘密读入容器并推送到容器的ENV中。

如果您更进一步,您可以使用语言级保管库客户端库在应用程序运行时检索和刷新机密,从而无需重新启动容器以检索新机密。

这如何符合您的要求?

  • 维护特定于环境的配置的最佳方法是什么?

我会说Vault。如果需要,可以使用Puppet和Hiera将秘密写入文件或文件夹,但这意味着将秘密写入磁盘并不理想。 TMK K8s存储未经加密的秘密,这也是不理想的。我更喜欢这里的保险柜。每个环境都有自己的Vault群集,并且具有特定于环境的配置'。

  • 配置文件可能包含敏感数据,如api密钥和 秘密我在构建Docker时如何加密,存储和解密 图像?

见上文。保险柜存储秘密加密的秘密。使用您的Vault令牌(如果需要,可以通过卷装入容器)访问密码并解密它们。然后,您可以在开始容器主过程之前将它们推送到ENV,或者进行更紧密的集成,并使Vault成为应用程序逻辑的一部分。

  • 如果我想更改某些配置,我需要触发构建 因为我的配置文件放在Docker镜像中。我可以吗 将配置文件放在Docker容器外部作为卷,以便我可以 替换配置文件并重新启动容器,以便更新代码 CONFIGS?如果我想放在Docker容器之外,我还可以 使用任何集群管理工具进行容器 编排/管理(Kubernetes / ECS)?

这个问题的答案高度依赖于配置所包含的 。如果它特定于代码修订版,我强烈建议将其与代码捆绑在一起,以防止代码和配置中出现任何不匹配。

如果它实际上独立于代码(例如:调整值或秘密),我将它们扔进Vault - 为什么当它们存储在加密的秘密管理系统中时将它们放在一个文件中?

但是,如果您的心脏设置在文件上,您可以轻松地将它们从已知卷安装到已知路径,并且所有调度系统(包括Nomad现在)都允许使用已部署的容器进行卷安装。

  • 在Docker容器中运行应用程序的方法是什么? 通过重新启动容器而不是构建来更新配置 一个新的docker镜像并部署一个新容器?

使用保险柜:如果您希望秘密仅在启动时更改,则envconsul是您的朋友。

请参阅上文,了解我对配置值的运行时更改的看法。

实际执行此操作的tl; dr是为了创建一个' startup'脚本,它是容器的入口点。启动脚本将从您选择的任何管理系统(卷装入,Vault,文件等)中检索秘密,并准备好供应用程序读取。

启动脚本然后启动主应用程序的运行过程。

希望这有帮助!

PS:我不为Hashicorp工作,但我确实喜欢他们的软件来处理容器。通过购买Hashicorp的不同软件可以获得很多你可以从K8s获得的单一解决方案。单个应用程序(Hashicorp)允许您选择和混合所需的解决方案,但也需要更高的维护开销。 K8s是一个相当沉重的锁定,但是你可能想要的大多数事情都需要,而不需要学习任何其他东西。

祝你好运