如何在生产环境中以HTTPS方式运行Hashicorp Vault Docker镜像(禁用mlock)
如何在生产环境中以HTTPS方式运行Hashicorp Vault Docker镜像(禁用mlock)
嗨,我之前也踩过类似的坑,生产环境配置Vault确实比dev模式麻烦不少,我来一步步帮你理清楚:
首先得解决你提到的local.json问题——这大概率是因为你没正确指定Vault的配置文件路径,或者配置里有错误导致的。Vault在生产模式下默认会加载/vault/config/目录下的HCL配置文件,而不是找什么local.json,咱们从正确的配置开始:
1. 创建生产环境用的Vault配置文件(vault.hcl)
新建一个vault.hcl文件,写入以下内容,重点配置禁用mlock、HTTPS监听和存储后端:
# 禁用mlock,容器环境下通常无法获取IPC_LOCK权限,直接在这里关闭即可 disable_mlock = true # 存储后端,生产环境可以用Consul、S3等,这里先用本地文件存储做示例(需要持久化挂载) storage "file" { path = "/vault/data" } # 配置HTTPS监听,指定证书和密钥路径 listener "tcp" { address = "0.0.0.0:8200" tls_cert_file = "/vault/tls/server.crt" tls_key_file = "/vault/tls/server.key" } # 设置Vault对外的API地址,要和你后续访问的域名/IP一致 api_addr = "https://你的Vault服务器IP或域名:8200"
2. 生成HTTPS证书(自签或真实证书)
如果暂时没有CA签发的真实证书,可以用OpenSSL生成自签证书:
# 先创建本地目录,用来存放证书、配置和数据,后续挂载到容器 mkdir -p ./vault/{tls,data} # 生成自签证书,替换CN字段为你的Vault服务器IP或域名 openssl req -x509 -newkey rsa:4096 -keyout ./vault/tls/server.key -out ./vault/tls/server.crt -days 365 -nodes -subj "/CN=你的Vault服务器IP或域名"
3. 启动生产模式的Vault容器
用Docker命令启动,注意挂载配置文件、证书目录和数据目录(确保数据持久化,重启容器不会丢失):
sudo docker run --name=prod-vault \ -v $(pwd)/vault.hcl:/vault/config/vault.hcl \ -v $(pwd)/vault/tls:/vault/tls \ -v $(pwd)/vault/data:/vault/data \ -p 8200:8200 \ hashicorp/vault:latest server
这里不要加-dev参数,这样就是生产模式了,Vault会自动加载你挂载的vault.hcl配置,不会再找local.json。
4. 初始化并Unseal Vault(生产模式必须步骤)
生产模式下Vault不会自动初始化,需要手动执行:
# 进入容器执行初始化命令 sudo docker exec -it prod-vault vault operator init
执行后会输出5个unseal密钥和1个root令牌,一定要把这些内容妥善保存!然后用其中3个不同的unseal密钥执行unseal操作(需要执行3次):
# 每次输入一个unseal密钥,执行3次完成unseal sudo docker exec -it prod-vault vault operator unseal
unseal完成后,用root令牌登录:
sudo docker exec -it prod-vault vault login # 输入刚才的root令牌即可
5. 配置Node.js客户端(hashi-vault-js)连接
确保你的Node服务能访问Vault的8200端口,然后可以通过环境变量或代码配置连接:
- 用环境变量配置(推荐):
export VAULT_ADDR="https://你的Vault服务器IP或域名:8200" export VAULT_TOKEN="你的root令牌或专用应用令牌" # 如果用的是自签证书,测试阶段可以临时禁用证书校验,生产建议把证书加入信任链 export NODE_TLS_REJECT_UNAUTHORIZED=0
- 代码里直接配置(示例):
const { Vault } = require('hashi-vault-js'); const fs = require('fs'); const vault = new Vault({ baseUrl: 'https://你的Vault服务器IP或域名:8200', token: '你的令牌', // 自签证书情况下,指定证书路径让客户端信任 https: { ca: fs.readFileSync('./vault/tls/server.crt') } }); // 测试连接 async function testVaultConnection() { try { const healthStatus = await vault.health(); console.log('Vault连接成功:', healthStatus); } catch (err) { console.error('Vault连接失败:', err); } } testVaultConnection();
常见问题排查
- 还是提示找不到
local.json?检查Docker挂载的配置文件路径是否正确,确保vault.hcl被挂载到了容器的/vault/config/目录下。 - TLS连接失败?检查容器内
/vault/tls/目录下是否有证书文件,且配置里的路径和实际一致,同时API地址要和证书的CN字段匹配。 - 数据丢失?确认
./vault/data目录正确挂载到容器,且本地目录权限足够让容器读写(可以先临时设置chmod 777 ./vault/data,生产环境再调整为更严格的权限)。
备注:内容来源于stack exchange,提问作者David Ajibade
相关产品推荐
相关产品推荐

