docker secret 是 swarm 模式下专用于安全存储和分发敏感数据的原生机制,仅在 swarm 集群生效,内容加密存于 raft 日志,运行时以只读文件挂载至 /run/secrets/,不落盘、不入镜像。

Docker Secret 是 Docker Swarm 模式下专为安全存储和分发敏感数据(如密码、API 密钥、TLS 证书)设计的原生机制。它不适用于独立容器(docker run),仅在 Swarm 集群中生效,且 Secret 内容以加密形式存储于 Raft 日志,并仅在运行时以临时文件方式挂载进容器内存(/run/secrets/ 目录),不会留存于镜像或容器层。
创建并管理 Secret
Secret 必须在 Swarm manager 节点上创建,支持从文件、标准输入或命令行传入值:
- 从文件创建:
echo "mydbpass123" | docker secret create db_password - - 从本地文件读取:
docker secret create app_tls_cert ./cert.pem - 查看列表:
docker secret ls,注意 Secret 值不可直接查看(docker secret inspect不显示内容) - 删除需谨慎:
docker secret rm db_password,删除后所有使用它的服务将无法启动新任务
在 Swarm Service 中使用 Secret
Secret 通过 --secret 参数挂载到服务,容器内默认以只读文件形式出现在 /run/secrets/<name></name>:
- 简单挂载(使用默认名称和路径):
docker service create --name web --secret db_password nginx:alpine - 自定义目标路径与文件名:
docker service create --secret source=db_password,target=passwd,uid=101,gid=101,mode=0400 ... - 多个 Secret 可重复使用
--secret参数;也可通过 Compose 文件声明(v3.1+):secrets:<br> db_password:<br> external: true
并在 service 的secrets:下引用
在容器内安全读取 Secret
应用应直接读取 /run/secrets/<name></name> 文件内容,而非通过环境变量传递(避免泄露到进程列表或日志):
- Shell 脚本示例:
DB_PASS=$(cat /run/secrets/db_password) - Python 示例:
with open('/run/secrets/db_password', 'r') as f: password = f.read().strip() - 务必检查文件权限(默认 0444),避免写入或误删;挂载后不可修改内容,更新需先
docker secret rm再重建,并滚动更新服务
注意事项与常见误区
Secret 是 Swarm 特性,非 Swarm 环境(如单机 docker-compose up)无法使用;替代方案需借助第三方工具(如 HashiCorp Vault)或构建时参数(不推荐用于生产敏感信息):
- Secret 不支持动态重载——应用需自行监听文件变更或重启任务
- Secret 名称不能含下划线(
_),建议用短横线(-)分隔 - Secret 大小限制为 500KB,超限需拆分或改用外部密钥管理服务
- Swarm 节点必须启用 TLS 加密通信,否则 Raft 日志中的 Secret 加密可能被绕过










