私有镜像仓库部署
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 来存储认证配置,这样更容易管理和更新认证信息。
- 创建包含认证信息的 ConfigMap:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: registry-auth
data:
htpasswd: |
username:$2y$05$LxQxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXx
http_secret: "your-random-secret-string" # 用于生成状态令牌
- 在 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
是一个重要的安全配置项,它用于:
- 生成和验证状态令牌(state token)
- 防止跨站请求伪造(CSRF)攻击
- 确保 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
维护建议
- 定期备份 Registry 数据
- 监控磁盘使用情况
- 定期清理未使用的镜像
- 保持 Registry 版本更新
常见问题
1. 无法推送镜像
- 检查 Registry 是否正常运行
- 确认 Docker 客户端配置正确
- 验证网络连接和防火墙设置
2. 认证失败
- 确认用户名和密码正确
- 检查 htpasswd 文件权限
- 验证认证配置是否正确