Docker Registry 官方镜像主要分为 v1 和 v2 两个版本。v1 基于 Python 编写,而 v2 改用 Go 语言,两者的 API 差异较大。本文将分别演示基于 SSL 和登录认证的两种版本搭建流程。
Registry v2 搭建
环境准备:CentOS 7,Docker 1.8+。
首先拉取官方镜像:
docker pull registry:2
生成证书
注意 Common Name 应填写服务器域名,仅使用 IP 测试可能会失败。执行以下命令生成自签名证书:
mkdir -p certs && openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt
将证书复制到 Docker 信任目录。假设私服域名为 172.16.71.52.xip.io,端口为 5000:
cp certs/domain.crt /etc/docker/certs.d/172.16.71.52.xip.io:5000/ca.crt
配置认证
使用 htpasswd 工具生成密码文件。请替换为你的用户名和密码:
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn username password > auth/htpasswd
启动容器
确保 5000 端口未被占用,启动后建议通过 docker logs 检查是否有报错:
docker run -d -p 5000:5000 --restart=always --name registry \
-v $(pwd)/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
推送与验证
在 push 或 pull 之前,请先登录私服:
docker login 172.16.71.52.xip.io:5000
docker tag redis 172.16.71.52.xip.io:5000/redis
docker push 172.16.71.52.xip.io:5000/redis
验证镜像是否入库,可检查外部挂载的数据卷目录,通常位于 /var/lib/docker/registry/v2/repositories。
Registry v1 说明
v1 版本较老,搭建相对繁琐,通常配合 Nginx 处理 SSL 和认证。若遇到 HTTPS 连接报错(如 EOF),需在 Docker 守护进程配置中添加 --insecure-registry 参数,或者将 CA 证书放入指定目录。
修改配置文件示例:
vim /etc/default/docker
# 增加一行
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=172.16.71.52.xip.io:5000"
service docker restart

