要让Docker仓库支持镜像签名与内容信任,需部署Notary服务(server+signer)、配置Docker客户端启用DCT、为镜像签名推送,并确保证书域名、时间同步、daemon证书权限及trustPinning配置正确。

要让 Docker 仓库支持镜像签名与内容信任(Notary + DCT),核心是启用 Docker Content Trust(DCT)并配置可信的 Notary 服务。本地开发或私有环境通常用 Notary Server(配合 MySQL 或 SQLite)+ Notary Signer + 配置 Docker daemon 启用 DCT;生产环境建议结合 TLS、身份认证和高可用存储。
一、部署 Notary 服务组件
Notary 由两部分组成:服务端(notary-server)负责签发和验证元数据,签名服务(notary-signer)负责密钥操作与签名生成,二者需独立部署并通信。
- 使用官方镜像启动 MySQL(Notary 元数据后端):
docker run -d --name notary-mysql -e MYSQL_ROOT_PASSWORD=notary -e MYSQL_DATABASE=notary -p 3306:3306 -v $(pwd)/mysql-data:/var/lib/mysql mysql:8.0 - 生成 Notary 的 root 和 server 证书(用
notary-server自带的notary-keygen或 OpenSSL),确保server.crt域名匹配后续访问地址(如notary.example.com) - 启动
notary-server,挂载证书、配置文件(config.json指定 MySQL 地址、TLS 设置、trustPinning 等),监听 HTTPS 端口(如 4443) - 启动
notary-signer,同样挂载证书和配置,通过server_addr连接notary-server,启用 gRPC
二、配置 Docker 客户端启用内容信任
Docker 默认不开启内容信任。启用后,所有 docker pull/push 操作会自动校验签名(DOCKER_CONTENT_TRUST=1),且仅拉取已签名镜像。
- 设置环境变量:
export DOCKER_CONTENT_TRUST=1(可写入~/.bashrc持久生效) - 指定私有 Notary 服务地址:
export DOCKER_CONTENT_TRUST_SERVER=https://notary.example.com:4443 - 若使用自签名证书,需将
notary.example.com的 CA 证书添加到 Docker daemon 的信任链(/etc/docker/certs.d/notary.example.com:4443/ca.crt),否则连接失败
三、为镜像签名并推送(首次需生成密钥)
每个镜像仓库(如 my-registry.local/myapp)在首次启用 DCT 时,会自动生成根密钥(root key)和目标密钥(targets key),保存在 ~/.docker/trust/private/ 下。
- 构建并标记镜像:
docker build -t my-registry.local/myapp:1.0 . - 登录私有 registry:
docker login my-registry.local - 推送并自动签名:
docker push my-registry.local/myapp:1.0(DCT 启用后,此操作会触发 Notary 创建 targets 元数据并签名) - 可手动管理签名:
notary -s https://notary.example.com:4443 -d ~/.docker/trust list my-registry.local/myapp查看签名状态
四、验证签名与故障排查要点
签名验证发生在 docker pull 阶段。若镜像无有效签名,Docker 直接报错拒绝拉取(除非临时关闭 DCT)。
- 检查 Notary 服务是否健康:
curl -k https://notary.example.com:4443/v2/应返回 JSON;notary -s ... list能列出仓库说明服务可达 - 确认时间同步:Docker 和 Notary 服务系统时间偏差超过 15 分钟会导致 JWT 签名验证失败
- 签名失败常见原因:registry 地址与 Notary 中配置的
trustPinning不一致、证书域名不匹配、MySQL 连接超时、signer 无法访问 server 的 gRPC 端口 - 调试模式:启动
notary-server时加--log-level debug,查看日志中 “delegation”, “snapshot”, “timestamp” 元数据生成是否正常
不复杂但容易忽略:证书域名、时间同步、Docker daemon 证书目录权限、以及 Notary 配置中 trustPinning 的 registry 映射关系——这四项出错占签名失败问题的 80% 以上。










