Docker容器中的配置管理

6

目前我的配置文件存储在GitHub中。我有一个单独的json文件,格式如下:

{ DEV: { key1 : val1, key2 : val2 }, PROD: { key1 : val1, key2 : val2 } }

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

我有几个问题:

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

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

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

  • 使在Docker容器中运行的应用程序在重新启动容器而不是构建新的Docker镜像和部署新的容器后读取更新的配置的方法是什么?

2个回答

2
我的大多数回答都会是"Hashicorp的Vault"
您可以在您的环境中启动一个Vault集群,并让您的容器在启动和运行时连接到Vault并获取密钥。最简单的实现方式是在容器启动时将密钥读入容器并推送到容器的ENV中。
如果您进一步进行,可以使用语言级别的Vault客户端库来检索和刷新密钥,从而在应用程序运行时删除重新启动容器以检索新密钥的必要性。
这与您所问的有什么关系呢?
  • 如何维护特定于环境的配置的最佳方法?
我会说Vault。如果需要,您可以使用Puppet和Hiera将密钥写入文件或文件夹,但这意味着将密钥写入磁盘,这不是理想的。据我所知,K8s在休息时存储未加密的密钥,这也不是理想的。在这里,我更喜欢Vault。每个环境都有自己的Vault集群,因此有了您的“特定于环境的配置”。
配置文件可能包含敏感数据,例如API密钥和秘密信息。我该如何在构建Docker映像时加密、存储和解密?
请参考上面的内容。Vault可以加密保存机密信息。使用您的Vault令牌(如果需要,您可以通过卷将其挂载到容器中)来访问并解密这些机密信息。然后,在启动容器的主进程之前,您可以将它们推送到您的环境变量中,或者进行更紧密的集成,并使Vault成为应用程序逻辑的一部分。
如果我想更改某些配置,我需要触发构建,因为我的配置文件放置在Docker映像内部。我是否可以将配置文件作为卷放置在Docker容器外部,以便我可以替换配置文件并重新启动容器,以便代码读取更新的配置?如果我想将它放在Docker容器外部,我是否仍然可以使用任何容器编排/管理的集群管理工具(如Kubernetes/ECS)?
对此的答案高度依赖于配置文件中包含的内容。如果它与代码版本有关,则强烈建议将其与代码捆绑在一起,以防止代码和配置不匹配。
如果它与代码(例如:调整值或密码)有效地独立,我会把它们放在Vault中——既然可以将它们存储在加密的秘密管理系统中,为什么要把它们放在一个文件中呢?
不过,如果你一心想要使用文件,你可以很容易地从已知的卷挂载到已知的路径,所有的调度系统(包括现在的Nomad)都允许在部署的容器中挂载卷。
有一个问题是:如何使运行在Docker容器中的应用程序只需重新启动容器即可读取更新后的配置,而无需构建新的docker镜像和部署新的容器?
使用Vault:如果您希望仅在启动时更改密码,则envconsul是您的好帮手。
请参见上文对于我的关于运行时更改配置值的意见。
实际执行的tl;dr是创建一个“启动”脚本,该脚本是容器的入口点。启动脚本将从您选择的任何管理系统(卷挂载、Vault、文件等)检索密码,并准备好供您的应用程序读取。
启动脚本然后启动您的主应用程序的运行过程。
希望这可以帮助您!
PS:我不是Hashicorp的员工,但我喜欢他们用于处理容器的软件。通过购买Hashicorp的不同软件可以获得很多东西,但你也可以通过K8s作为单一解决方案来获得这些功能。单个应用程序(Hashicorp)允许您选择并混合所需的解决方案,但也需要更高的维护成本。K8s是一个相当沉重的锁定,但大多数情况下,您可能想要的功能都能够满足,而无需学习其他任何内容。

祝好运


1
  1. ENV variables are fine. IF you have really complex system you can spin Consul and/or Vault to manage secure configuration, but if your sistem is small, the mess do not worth the effort.
  2. You can encrypt all configuration into hash, and decrypt it with the key only know to application.
  3. Use docker-compose. It allows perfect mechanism - the one you actually requesting here, example of the docker-compose.yml:

    version: "2"  
    services:   
      server:
        hostname: server
        container_name: server
        image: serverBla
        build: ./server
        env_file:
          - ./config/config.env
    
文件./config/config.env是您的“动态”配置。您只需重新创建容器即可刷新应用程序内部的值。 据我所知,docker-compose与您提到的任何内容都可以很好地配合使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接