docker secret 是 swarm 模式下原生加密凭证机制,仅在 manager 节点生效,以只读内存文件挂载至 /run/secrets/;需 docker swarm init 初始化,通过 docker secret create 创建(不支持查看明文),服务中用 --secret 挂载,应用须直接读文件而非转环境变量。
docker secret 是 swarm 模式下原生支持的加密凭证注入机制,它不把密码写进镜像、不暴露在环境变量里、也不落盘到容器文件系统,而是运行时以只读内存文件形式挂载到 /run/secrets/,用完即焚。
必须满足的前提条件
Secret 只在 Docker Swarm 集群中有效,且所有操作必须在 manager 节点执行:
- 先初始化 Swarm:
docker swarm init(单节点也需执行) - 确认当前是 manager 节点:
docker info | grep Role应显示Manager - 独立容器(
docker run)或非 Swarm Compose(v2.x)不支持 Secret
创建与存储敏感数据
Secret 内容加密后存入 Raft 分布式日志,创建后无法查看明文,也无法导出:
- 从标准输入创建(推荐用于随机密钥):
openssl rand -base64 24 | docker secret create db_root_pass - - 从本地文件创建:
docker secret create tls_cert ./server.crt - 查看已存在 Secret 列表:
docker secret ls(不显示内容) - 删除前请确认无服务正在使用:
docker secret rm db_root_pass
在服务中挂载并使用 Secret
Secret 必须通过 --secret 显式绑定到 service,容器内以文件形式存在,不可写、不可执行:
- 默认挂载:
docker service create --name api --secret db_root_pass nginx:alpine→ 容器内可读/run/secrets/db_root_pass - 自定义路径与权限:
--secret source=db_root_pass,target=passwd,uid=1001,mode=0400 - Compose 文件中声明(v3.1+):
secrets:块 +external: true复用已有 Secret - 多个 Secret 可重复使用
--secret,例如同时挂载数据库密码和 TLS 证书
应用内安全读取方式
务必避免将 Secret 内容转为环境变量——进程列表、日志、调试信息都可能泄露:
- Shell 脚本:
DB_PASS=$(cat /run/secrets/db_root_pass | tr -d '\n\r') - Python:
with open('/run/secrets/db_root_pass') as f: password = f.read().strip() - 检查文件权限:
ls -l /run/secrets/db_root_pass应为-r--r--r--(0444) - 更新凭据需重建 Secret + 滚动更新服务:
docker service update --secret-rm old --secret-add new myapp











