将 Vault 与 docker-compose 文件结合使用

问题描述 投票:0回答:3

目前我正在使用 docker-compose 文件来设置我的开发/生产环境。我正在使用环境变量来存储机密、数据库凭据等。经过一番搜索,我发现 Vault 可用于保护凭据。我尝试了几个使用 Vault 的基本示例,但我仍然不知道如何将 Vault 与 docker-compose 文件一起使用。有人能指出我正确的方法吗?如果 Vault 不是 docker-compose 的一个好的解决方案,我可以使用哪些机制来保护凭证,而不是将它们作为纯文本存储在环境中。

docker docker-compose dockerfile hashicorp-vault
3个回答
34
投票

这是我当前在开发中使用 Vault 的 docker-compose 配置,但我在生产中使用专用服务器(不是 Docker)。

# docker_compose.yml
version: '2'
services:
    myvault:
        image: vault
        container_name: myvault
        ports:
          - "127.0.0.1:8200:8200"
        volumes:
          - ./file:/vault/file:rw
          - ./config:/vault/config:rw
        cap_add:
          - IPC_LOCK
        entrypoint: vault server -config=/vault/config/vault.json

如果您必须重建容器,卷安装可确保保存保管库配置。

要使用“文件”后端,使此设置可移植到 Docker/Git,您还需要创建一个名为

config
的目录并将此文件放入其中,名为
vault.json
:

# config/vault.json
{
  "backend": {"file": {"path": "/vault/file"}},
  "listener": {"tcp": {"address": "0.0.0.0:8200", "tls_disable": 1}},
  "default_lease_ttl": "168h",
  "max_lease_ttl": "0h"
}

备注:
尽管

ROOT_TOKEN
在此配置中是静态的(不会在容器构建之间更改),但每次必须解封保管库时,为
VAULT_TOKEN
发出的任何生成的
app_role
都将失效。

我发现当容器重新启动时,Vault 有时会被密封。


28
投票

我有一个稍微不同的版本:(主要添加了一些环境变量)

docker-compose.yml

version: '3'

services:

    vault:
      image: vault:latest
      volumes:
        - ./vault/config:/vault/config
        - ./vault/policies:/vault/policies
        - ./vault/data:/vault/data
      ports:
        - 8200:8200
      environment:
        - VAULT_ADDR=http://0.0.0.0:8200
        - VAULT_API_ADDR=http://0.0.0.0:8200
        - VAULT_ADDRESS=http://0.0.0.0:8200
      cap_add:
        - IPC_LOCK
      command: vault server -config=/vault/config/vault.json

vault.json:

{                                    
  "listener":  {                     
    "tcp":  {                        
      "address":  "0.0.0.0:8200",  
      "tls_disable":  "true"         
    }                                
  },                                 
  "backend": {                       
    "file": {                        
      "path": "/vault/file"          
    }                                
  },                                 
  "default_lease_ttl": "168h",       
  "max_lease_ttl": "0h",
  "api_addr": "http://0.0.0.0:8200"
}  

如果我想在容器外部测试保管库:我这样做(例如):http://localhost:8200/v1/sys/seal-status

如果我想在容器内进行测试:我这样做(例如):http://vault:8200/v1/sys/seal-status

我是用laradock实现的。


0
投票

单文件版本

version: '3.6'

services:
  vault:
    image: vault:1.13.3
    healthcheck:
      retries: 5
    restart: always
    ports:
      - 8200:8200
    environment:
      VAULT_ADDR: 'https://0.0.0.0:8200'
      VAULT_LOCAL_CONFIG: '{"listener": [{"tcp":{"address": "0.0.0.0:8200","tls_disable":"1"}}], "ui": true, "storage": [{"file": {"path":"/vault/data"}}]}'
    cap_add:
      - IPC_LOCK
    volumes:
      - ./vault/config:/vault/config
      - ./vault/data:/vault/data
    command: vault server -config vault/config/local.json

© www.soinside.com 2019 - 2024. All rights reserved.