You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在生产环境中以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 06:10:27