开发模式下Vault能否不使用in memory存储?Docker部署数据丢失如何解决
问题根源
你当前使用的Vault Docker镜像默认以开发服务器模式启动,该模式下所有数据仅存储在内存中,即使配置了持久化卷也不会写入磁盘,因此设备或容器重启后数据会全部丢失。
解决方案步骤
1. 新增Vault配置文件
在你的docker-compose.yml同级目录下创建config文件夹,在文件夹内新建vault.hcl配置文件,指定磁盘持久化存储:
storage "file" { path = "/vault/file" } listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 } api_addr = "http://127.0.0.1:8200" disable_mlock = true
本地测试场景下开启disable_mlock可避免内存锁定权限问题,生产环境不建议开启。
2. 修改docker-compose.yml配置
调整vault服务的启动命令,挂载新增的配置文件,移除开发模式专属的环境变量:
version: "3.8" services: vault: env_file: - .env networks: - public image: vault # 覆盖默认启动命令,使用配置文件启动服务模式 command: server -config=/vault/config/vault.hcl restart: unless-stopped ports: - 8200:8200 cap_add: - IPC_LOCK container_name: "${TARGET_ENVIRONMENT}_${COMPOSE_PROJECT_NAME}_vault" volumes: - ./config:/vault/config - vault-logs:/vault/logs - vault-file:/vault/file labels: - "traefik.enable=true" - "traefik.http.routers.vault.service=vault" - "traefik.http.routers.vault.entrypoints=https" - "traefik.http.routers.vault.rule=Host(`vault.${HOST_URL}`)" - "traefik.http.routers.vault.tls=true" - "traefik.http.routers.vault.tls.certresolver=letsEncrypt" - "traefik.http.services.vault.loadbalancer.server.port=8200" volumes: vault-logs: vault-file: networks: public: external: true
同时修改你的.env文件,删除开发模式专属的VAULT_DEV_ROOT_TOKEN_ID配置:
COMPOSE_PROJECT_NAME=vault VAULT_ADDR=http://127.0.0.1:8200
3. 首次启动初始化
启动容器后执行以下操作完成初始化,后续重启无需重复操作:
- 执行初始化命令:
docker exec -it 你的容器名 vault operator init - 终端会输出5个解封密钥和1个Root Token,将这些内容妥善保存在本地
- 依次执行3次解封命令:
docker exec -it 你的容器名 vault operator unseal 你保存的解封密钥,每次输入一个不同的密钥 - 解封完成后即可正常使用Vault,所有密钥会持久化存储在本地Docker卷中,重启不会丢失
如果本地测试不想每次重启容器都手动解封,可以写个简单的本地脚本自动执行解封命令即可。
内容的提问来源于stack exchange,提问作者Andrey Bushman
相关产品推荐
相关产品推荐

