Skip to content

私有镜像仓库部署

Docker Registry 是一个用于存储和分发 Docker 镜像的服务器端应用程序。本文将介绍如何部署和使用私有 Docker Registry。

最简化安装 Docker Registry

使用 Docker 运行 Registry 容器:

bash
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  registry:2

配置 HTTPS(可选但推荐)

为了安全起见,建议配置 HTTPS。首先创建证书:

bash
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt

然后使用证书运行 Registry:

bash
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /path/to/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

3. 配置认证(可选)

3.1 使用文件存储认证信息

创建密码文件:

bash
mkdir -p auth
docker run --entrypoint htpasswd httpd:2 -Bbn username password > auth/htpasswd

使用认证运行 Registry:

bash
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /path/to/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  registry:2

3.2 使用 ConfigMap 存储认证配置(Kubernetes 环境)

在 Kubernetes 环境中,可以使用 ConfigMap 来存储认证配置,这样更容易管理和更新认证信息。

  1. 创建包含认证信息的 ConfigMap:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: registry-auth
data:
  htpasswd: |
    username:$2y$05$LxQxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXx
  http_secret: "your-random-secret-string"  # 用于生成状态令牌
  1. 在 Registry 部署配置中引用 ConfigMap:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry
spec:
  template:
    spec:
      containers:
      - name: registry
        image: registry:2
        volumeMounts:
        - name: auth-volume
          mountPath: /auth
        env:
        - name: REGISTRY_AUTH
          value: "htpasswd"
        - name: REGISTRY_AUTH_HTPASSWD_REALM
          value: "Registry Realm"
        - name: REGISTRY_AUTH_HTPASSWD_PATH
          value: "/auth/htpasswd"
        - name: REGISTRY_HTTP_SECRET
          valueFrom:
            configMapKeyRef:
              name: registry-auth
              key: http_secret
      volumes:
      - name: auth-volume
        configMap:
          name: registry-auth
          items:
          - key: htpasswd
            path: htpasswd

关于 REGISTRY_HTTP_SECRET

REGISTRY_HTTP_SECRET 是一个重要的安全配置项,它用于:

  1. 生成和验证状态令牌(state token)
  2. 防止跨站请求伪造(CSRF)攻击
  3. 确保 Registry 的 API 请求安全性

建议:

  • 使用随机生成的字符串作为 secret
  • 在生产环境中必须设置此值
  • 定期更换 secret 以提高安全性
  • 确保所有 Registry 实例使用相同的 secret

使用说明

1. 配置 Docker 客户端

编辑 /etc/docker/daemon.json

json
{
  "insecure-registries": ["your-registry-domain:5000"]
}

重启 Docker 服务:

bash
systemctl restart docker

2. 推送镜像

bash
# 标记镜像
docker tag your-image:tag your-registry-domain:5000/your-image:tag

# 推送镜像
docker push your-registry-domain:5000/your-image:tag

3. 拉取镜像

bash
docker pull your-registry-domain:5000/your-image:tag

维护建议

  1. 定期备份 Registry 数据
  2. 监控磁盘使用情况
  3. 定期清理未使用的镜像
  4. 保持 Registry 版本更新

常见问题

1. 无法推送镜像

  • 检查 Registry 是否正常运行
  • 确认 Docker 客户端配置正确
  • 验证网络连接和防火墙设置

2. 认证失败

  • 确认用户名和密码正确
  • 检查 htpasswd 文件权限
  • 验证认证配置是否正确

参考资源