Docker Registry API v2 使用了一套基于 HTTP 的验证机制来确保安全性和访问控制。以下是关于 Docker Registry API v2 的验证机制的详细说明:
Docker Registry API v2 的验证机制通常涉及以下几个步骤:
- 客户端请求镜像:客户端向 Docker Registry 发送请求以拉取或推送镜像。
- Registry 响应 401 未授权:如果请求未携带有效的认证信息,Registry 会返回 401 Unauthorized 响应,并在
WWW-Authenticate头中包含认证服务的 URL 和所需的认证范围。 - 客户端获取令牌:客户端根据
WWW-Authenticate头中的信息,向认证服务发送请求以获取访问令牌(token)。 - 客户端使用令牌重新请求:客户端使用获取的令牌重新向 Registry 发送请求。此时,Registry 验证令牌并允许访问。
以下是一个典型的认证流程:
客户端发送请求以拉取镜像:
GET /v2/library/nginx/manifests/latest HTTP/1.1
Host: registry-1.docker.ioRegistry 返回 401 未授权响应,并在 WWW-Authenticate 头中包含认证服务的信息:
HTTP/1.1 401 Unauthorized
Content-Type: application/json
WWW-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:library/nginx:pull"客户端向认证服务请求令牌:
GET /token?service=registry.docker.io&scope=repository:library/nginx:pull HTTP/1.1
Host: auth.docker.io
Authorization: Basic <base64-encoded-credentials>认证服务返回访问令牌:
{
"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
}客户端使用获取的令牌重新向 Registry 发送请求:
GET /v2/library/nginx/manifests/latest HTTP/1.1
Host: registry-1.docker.io
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...Registry 验证令牌并返回成功响应:
HTTP/1.1 200 OK
Content-Type: application/vnd.docker.distribution.manifest.v2+json
...对于私有 Docker Registry,可以通过配置认证服务来启用认证机制。以下是一个配置示例:
首先,使用 htpasswd 创建用户:
docker run --rm --entrypoint htpasswd registry:2 -Bbn myuser mypassword > auth/htpasswd配置 Docker Registry 使用基本认证:
version: 0.1
log:
fields:
service: registry
storage:
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd使用 Docker Compose 启动 Registry:
version: '3'
services:
registry:
image: registry:2
ports:
- "5000:5000"
volumes:
- ./auth:/auth
- ./data:/var/lib/registry
environment:
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=basic-realm
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd在客户端使用认证信息访问私有 Registry:
docker login myregistrydomain.com
docker pull myregistrydomain.com/myimage:mytagDocker Registry API v2 使用基于令牌的认证机制来确保安全性。通过正确配置认证服务和使用令牌,客户端可以安全地访问 Docker Registry。对于私有 Registry,可以使用基本认证或其他认证方式来保护镜像仓库。