config.json

~/.docker/config.json 是 Docker 客户端(不是Docker守护进程)的核心配置文件,主要用于存储与镜像仓库交互的认证信息和部分客户端设置

通常情况下,不建议手动编辑或创建这个文件。执行 docker login <仓库地址> 命令是更安全、可靠的方式,Docker客户端会自动处理格式并更新此文件。同时,请确保文件权限设置为 600,以防其他用户读取敏感信息:chmod 600 ~/.docker/config.json

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "dXNlcm5hbWU6cGFzc3dvcmQ="
    },
    "your.private.registry": {
      "username": "your_name",
      "password": "your_password",
      "email": "email@example.com"
    }
  },
  "credsStore": "desktop",
  "experimental": "enabled",
  "stackOrchestrator": "kubernetes",
  "HttpHeaders": {
    "User-Agent": "Docker-Client"
  },
  "psFormat": "table {{.ID}}\\t{{.Names}}\\t{{.Status}}"
}
字段名 说明
auths 最重要的字段,以键值对形式存储不同镜像仓库的认证信息。键(key)是仓库地址,值(value)包含认证凭证。
credsStore 指定一个全局的凭据存储助手(如desktop,osxkeychain, wincred, pass),让Docker将认证信息保存在操作系统的安全密钥链中,而不是以明文存储在 auths 里,这更安全。
credHelpers 为特定的仓库指定专用的凭据助手。优先级高于 credsStore。常用于AWS ECR、Google GCR等需要动态获取临时令牌的云服务仓库。
HttpHeaders 设置Docker客户端发送给镜像仓库的HTTP请求头
psFormat docker ps 命令的输出格式
experimental 是否开启docker 客户端实验功能
stackOrchestrator 镜像仓库的编排器

机制原理

凭证管理机制

当执行 docker login 命令时,Docker 客户端会将输入的用户名和密码进行 Base64 编码,并写入 config.json 的 auths 字段。后续与对应 Registry 通信时,CLI 自动读取该凭据完成认证。在执行 docker logout 命令时,Docker 删除对应仓库的 auths 字段。`

凭证信息存储支持两种方式:

传统方式:auth 字段,其值是 用户名:密码 经过Base64编码后的字符串。这不是加密,仅是一种编码,可以轻易解码还原,因此存在安全风险。

分离方式:使用独立的 username 和 password 字段。

使用凭证存储(如 Docker Desktop 集成的密钥链 )可提升安全性,防止敏感信息以明文形式暴露在文件系统中。开发者可通过修改 credsStore 值切换不同的凭据辅助程序。如:"credsStore": "desktop"

credsStore

Docker 配置文件中的 credsStorecredHelpers 字段用于管理镜像仓库的认证信息,二者通过外部程序实现凭据的安全存储与调用。

与 credHelpers 的优先级:如果同时配置了 credHelpers(为特定仓库指定助手)和 credsStore,对于在 credHelpers 中列出的仓库,会优先使用 credHelpers 指定的助手。

credsStore 它用来指定一个系统级的凭据管理工具,将所有镜像仓库的登录凭证加密存储在操作系统的安全服务中,而不是以明文或 Base64 编码形式保存在 config.json 文件里。

在操作系统层面管理密钥:

不同的操作系统有不同的内置助手:

操作系统 默认的 credsStore 值 后端系统服务
macOS osxkeychain macOS 钥匙串 (Keychain)
Windows wincred Windows 凭据管理器 (Credential Manager)
Linux pass GNU Privacy Guard (GPG) 加密的密码存储文件
Docker Desktop desktop 基于 Docker Desktop 内置的安全机制存储

对于 Linux 系统,如果没有 pass,常用的替代品还有 secretservice (兼容 GNOME Keyring、KWallet 等)。

desktop 仅在有 Docker Desktop 环境才可用, 而 Docker Desktop 可能涉及商业收费。

使用凭据助手提升密钥安全性(以ecr-login为例)

在容器化部署中,安全访问私有镜像仓库是关键环节。AWS ECR 通过 Docker 凭据助手简化身份验证流程,避免明文暴露长期凭证。

在云平台管理密钥:

不同的公有云厂商提供了不同的方式来管理密钥, 可以通过通过 credsstore管理,但是更推荐使用下文的 credHelpers 管理。

例如 AWS 提供 ecr-login 的方式支持

首先需安装 apt/yum/dnf install amazon-ecr-credential-helper 并配置 Docker 客户端:

{
  "credsStore": "ecr-login"
}

该配置位于 ~/.docker/config.json,指示 Docker 使用 ecr-login 工具自动获取临时令牌。

  1. 当执行 docker pull/push 时,Docker 调用凭据助手
  2. 助手通过 AWS SDK 获取 STS 临时凭证,有效期通常为12小时
  3. 自动生成 Base64 编码的认证信息供 Docker 使用

此机制实现最小权限原则,显著降低密钥泄露风险。

credHelpers

Docker 配置文件中的 credsStorecredHelpers 字段用于管理镜像仓库的认证信息,二者通过外部程序实现凭据的安全存储与调用。

credHelpers 个比 credsStore 更精细、优先级更高的配置项,它允许你为不同的镜像仓库指定不同的专用凭证助手。

在大型企业中,容器镜像的拉取频繁且涉及多个私有仓库,手动管理认证信息既低效又存在安全风险。凭据助手通过与操作系统级密钥链或企业身份系统集成,实现安全、自动化的凭据获取。

在云平台,例如,在 Amazon ECR 的上有个私有的镜像 123456789.dkr.ecr.us-east-1.amazonaws.com/my-image:latest

  1. 需要首先需安装 apt/yum/dnf install amazon-ecr-credential-helper
  2. 编辑配置文件:编辑 ~/.docker/config.json 添加 credHelpers 字段。
{
  "credHelpers": {
    "123456789.dkr.ecr.us-east-1.amazonaws.com": "ecr-login", // AWS 私有镜像仓库
    "gcr.io": "gcloud", // Google容器注册表
    "asia.gcr.io": "gcloud", // Google亚洲镜像
    "my.private.registry:5000": "pass" // 私有仓库,使用pass助手
  }
}
  1. 无需运行 docker login,直接执行 docker pull 123456789.dkr.ecr.us-east-1.amazonaws.com/my-image:latest。助手会自动调用 AWS API 获取临时令牌。适用于 AWS ECR 等需动态认证的场景。后者通过 IAM 角色获取签名的登录密码,避免长期凭证暴露。

企业集成优势:

  • 支持单点登录(SSO)与 OAuth2 集成,提升安全性
  • 动态生成短期凭据,符合最小权限原则
  • 集中审计凭据使用行为,满足合规要求
云平台 / 服务 凭证助手名称 (credHelpers 值) 需要安装的程序
AWS ECR ecr-login docker-credential-ecr-login (通过包管理器安装)
Google GCR/Artifact Registry gcloud 由 gcloud CLI 提供 (gcloud auth configure-docker)
Azure Container Registry (ACR) acr-env Docker本身已内置支持,或使用 Azure CLI
阿里云 ACR acr-credential-helper 主要用于集群内免密组件,本地使用较少
私有仓库 (使用系统密钥链) osxkeychain, wincred, pass 操作系统自带或 Docker Desktop 提供

HttpHeaders

HTTP请求中的headers用于传递客户端与服务器之间的元数据,广泛应用于身份验证、内容协商和缓存控制等场景。

常见使用场景

  • 认证授权:通过Authorization头携带JWT或Basic认证信息
  • 内容类型标识:使用Content-Type告知服务器请求体格式(如application/json)
  • 跨域控制:服务端通过Access-Control-Allow-Origin响应头管理CORS策略