Docker Compose配置Vault的差异及生产模式持久化问题求助
解决方案:Docker Compose配置生产模式Vault实现持久化+UI访问
先明确你两个配置的核心问题
vault-server配置的问题
你虽然挂载了卷,但环境变量里加了VAULT_DEV_ROOT_TOKEN_ID,这个变量会强制Vault以Dev模式启动。Dev模式默认用内存存储所有数据,挂载的./vault/file卷完全没用,所以容器重启后数据必然丢失。Dev模式默认启用Web UI,所以你能访问http://localhost:8204/ui/。
vault_dev配置的问题
你用entrypoint: vault server -dev明确指定了Dev模式,同时设置VAULT_DEV_LISTEN_ADDRESS: "0.0.0.0:8205",但端口映射是8205:8200——容器内Vault监听的是8205端口,你却把主机的8205映射到容器的8200,端口不匹配,自然访问不了UI。而且同样是Dev模式,持久化根本不生效。
实现三个需求的正确配置
要满足生产模式、持久化、UI访问,必须完全抛弃Dev模式的所有配置,用Vault的生产模式配置文件+正确的容器挂载。
1. 准备Vault配置文件
在你的Docker Compose同级目录下创建vault/config文件夹,里面新建config.hcl文件,内容如下:
# 存储后端:用文件存储,对应容器内的/vault/file目录 storage "file" { path = "/vault/file" } # 监听配置:开启HTTP服务,允许外部访问,启用Web UI listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 # 测试用可以关闭TLS,生产环境建议开启 } # 启用Web UI ui = true # 如果没有添加IPC_LOCK权限,可以开启这个(二选一) # disable_mlock = true
2. Docker Compose配置
替换你原来的配置,用下面的内容:
version: '3.8' services: vault-server: image: vault:latest ports: - "8200:8200" environment: VAULT_ADDR: "http://0.0.0.0:8200" cap_add: - IPC_LOCK # 锁定内存,防止Vault内存被交换到磁盘,增强安全性 volumes: - ./vault/config:/vault/config:ro # 只读挂载配置文件 - ./vault/file:/vault/file:rw # 读写挂载数据存储目录 - ./vault/logs:/vault/logs:rw # 日志目录(可选) command: vault server -config=/vault/config/config.hcl
3. 启动后的关键操作(生产模式必须做)
生产模式下Vault启动后是密封状态,不能直接使用,必须完成初始化和 unseal:
- 启动容器:
docker-compose up -d - 进入容器执行初始化命令:
执行后会输出5个 unseal密钥和1个根令牌,一定要保存好这些内容——丢失的话就无法恢复Vault里的数据。docker exec -it vault-server vault operator init - 执行 unseal操作(需要用3个不同的 unseal密钥):
docker exec -it vault-server vault operator unseal <第一个密钥> docker exec -it vault-server vault operator unseal <第二个密钥> docker exec -it vault-server vault operator unseal <第三个密钥> - 用根令牌登录:
之后就可以正常创建密钥、配置Vault了,所有数据都会存在docker exec -it vault-server vault login <根令牌>./vault/file目录下,容器重启后不会丢失。
4. 访问Web UI
完成unseal后,直接访问http://localhost:8200/ui/,用之前生成的根令牌登录即可。
内容的提问来源于stack exchange,提问作者udani
相关产品推荐
相关产品推荐

