Docker Registry是Docker官方推出的轻量级私有镜像仓库解决方案,相较于Harbor等可视化工具,它具备部署简单、资源占用低的优势,非常适合中小规模容器环境的镜像管理需求。本文将从实际运维场景出发,详细拆解Registry的基础部署、HTTP/HTTPS访问配置、镜像推送拉取、缓存加速及安全认证全流程,精准解决私有仓库部署中的核心痛点,助力开发者快速搭建可用的私有镜像仓库。
一、核心问题:Docker访问Registry的HTTPS限制
Docker客户端默认强制采用HTTPS协议访问Registry,若私有仓库未配置SSL证书、仅支持HTTP访问,会触发经典报错:
1
| Get https://192.168.0.110:5000/v1/_ping: http: server gave HTTP response to HTTPS client
|
该问题的核心原因的是:Docker客户端默认向Registry发起HTTPS请求,但未配置SSL的Registry仅能返回HTTP响应,导致通信链路中断。针对此问题,我们提供两种解决方案,分别适配测试/内网和生产环境。
方案A:临时放宽HTTP限制(测试/内网环境)
通过修改Docker启动参数,允许指定私有仓库的HTTP访问,配置简单高效,适合内网测试场景(生产环境不推荐,存在安全风险)。具体步骤如下:
- 编辑Docker服务配置文件,添加HTTP访问信任参数:
1 2 3
| vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.0.110:5000
|
- 重启Docker服务,使配置生效:
1 2
| systemctl daemon-reload systemctl restart docker.service
|
配置完成后,执行docker pull 192.168.0.110:5000/panda/mysql:v1即可正常拉取私有仓库镜像。
方案B:配置HTTPS加密访问(生产环境)
生产环境需保障镜像传输安全,必须通过SSL证书实现HTTPS加密访问,具体步骤如下:
1. 准备SSL证书
需提前准备CA根证书(CA_Cert.pem)、服务端证书(my.crt)及私钥(myprivate.key),证书绑定的域名需与Registry访问域名一致(如www.my.com),同时在客户端`/etc/hosts`中配置域名与Registry服务器IP的映射关系,避免域名解析失败。
1 2 3 4 5
| ls -l /root/cert_test/
|
2. 启动带HTTPS的Registry容器
通过环境变量指定证书和私钥路径,将证书目录挂载到容器内部,确保Registry能正常读取证书:
1 2 3 4 5 6 7
| docker run -d \ -v /var/my_registry/:/var/lib/registry \ -v /root/cert_test/:/etc/cert.d \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/cert.d/my.crt \ -e REGISTRY_HTTP_TLS_KEY=/etc/cert.d/myprivate.key \ -p 5000:5000 \ my_registry
|
3. 客户端信任CA证书
以CentOS系统为例,将CA根证书导入系统信任列表,确保客户端能正常识别HTTPS证书:
1 2
| cp CA_Cert.pem /etc/pki/ca-trust/source/anchors/ update-ca-trust
|
验证HTTPS访问有效性:
1 2
| curl -I https://www.my.com:5000/ docker pull www.my.com:5000/panda/my_registry
|
二、Registry基础部署与镜像管理
1. 基础部署(无认证)
快速部署无认证的Registry,适合内网临时测试,核心是拉取官方镜像、启动容器并实现数据持久化:
1 2 3 4 5 6 7 8 9
| docker pull registry
docker run -d -p 5000:5000 \ --restart=always \ --name="registry" \ -v /opt/registry:/var/lib/registry \ registry
|
2. 客户端配置私有仓库信任
客户端需配置私有仓库信任,才能正常与Registry通信,编辑/etc/docker/daemon.json文件:
1 2 3 4
| { "registry-mirrors": ["https://阿里云加速地址"], # 可选配置,加速官方镜像拉取 "insecure-registries": ["10.4.7.7:5000"] # 信任私有仓库的HTTP访问 }
|
保存配置后,重启Docker服务(systemctl restart docker),客户端即可正常识别私有仓库。
3. 镜像推送与拉取
(1)镜像打标签(核心步骤)
Docker镜像推送至私有仓库前,必须按指定格式打标签,格式为:仓库IP:端口/自定义路径/镜像名:标签,否则无法正常推送:
1 2
| docker tag centos:6.9 10.4.7.7:5000/jerry/centos:v6.9
|
(2)推送镜像到私有仓库
1
| docker push 10.4.7.7:5000/jerry/centos:v6.9
|
(3)拉取私有仓库镜像
1
| docker pull 10.4.7.7:5000/jerry/centos:v6.9
|
(4)仓库镜像查询(无原生search命令)
原生Registry不支持docker search命令,需通过REST API查询镜像信息,常用查询命令如下:
1 2 3 4 5
| curl -XGET http://10.4.7.7:5000/v2/_catalog
curl -XGET http://10.4.7.7:5000/v2/jerry/centos/tags/list
|
三、Registry缓存配置:代理官方仓库
对于内网多台主机使用容器的场景,配置Registry缓存官方镜像,可实现“一次拉取、本地缓存、多次复用”,大幅提升镜像拉取速度,减少外网带宽消耗。
1. 修改Registry配置文件
创建config-example.yml配置文件,添加代理配置,指向Docker官方仓库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3 proxy: remoteurl: https://registry-1.docker.io
|
2. 构建自定义Registry镜像
1
| docker build -t docker-registry:v0.1 .
|
3. 启动缓存仓库
挂载配置文件和数据目录,启动缓存版Registry容器:
1 2 3 4 5 6
| docker run -d -p 5000:5000 \ --restart=always \ --name docker-registry \ -v $(pwd)/config-example.yml:/etc/docker/registry/config.yml \ -v /home/registry:/var/lib/registry \ docker-registry:v0.1
|
4. 客户端配置镜像加速
修改客户端/etc/docker/daemon.json,将私有仓库设为镜像源,实现官方镜像缓存拉取:
1 2 3
| { "registry-mirrors":["http://10.4.7.7:5000"] }
|
重启Docker服务后,客户端拉取官方镜像(如docker pull node:8.4.0-onbuild)时,Registry会自动从官方仓库拉取并缓存,后续拉取相同镜像时,直接从本地缓存返回,速度大幅提升。
四、安全加固:添加用户名密码认证
默认部署的Registry无任何认证机制,内网所有用户均可自由推送、拉取甚至删除镜像,存在极大安全风险。通过htpasswd配置HTTP基本认证,可实现用户名密码校验,提升仓库安全性。
1. 生成密码文件
安装httpd-tools工具,生成用户名密码文件,用于Registry认证校验:
1 2 3 4 5 6 7 8 9 10 11
| yum install httpd-tools -y
mkdir /opt/registry-auth -p
htpasswd -Bbn oldguo 123 > /opt/registry-auth/htpasswd
htpasswd -Bbn newuser newpass >> /opt/registry-auth/htpasswd
|
2. 启动带认证的Registry容器
挂载密码文件目录,通过环境变量指定认证方式和密码文件路径,启动带认证的Registry:
1 2 3 4 5 6 7 8
| docker run -d -p 5000:5000 \ -v /opt/registry-auth/:/auth/ \ -v /opt/registry:/var/lib/registry \ --name register-auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \ registry
|
3. 客户端认证访问
配置认证后,客户端推送、拉取镜像前必须先登录私有仓库,输入正确的用户名和密码:
1 2
| docker login 10.4.7.7:5000 docker push 10.4.7.7:5000/jerry/centos:v6.9
|
五、常见问题解答
1. 配置缓存后能否正常下载官方镜像?
可以。Registry的proxy配置会自动代理官方仓库,客户端拉取官方镜像时,Registry会先检查本地是否有缓存:有缓存则直接返回,无缓存则从官方仓库拉取并缓存,不影响正常使用。
2. 能否直接执行pull centos:6.9,省略私有仓库前缀?
不能。Docker默认优先从Docker Hub拉取镜像,原生Registry不支持省略仓库前缀的拉取方式。若需实现该功能,可替换为Harbor等增强型仓库工具,或手动修改镜像标签为短名称(不推荐,易造成镜像混淆)。
3. 执行docker search查询私有仓库镜像失败,如何解决?
原生Registry未实现docker search的API兼容,无法直接通过该命令查询。可通过REST API查询(如curl -XGET http://10.4.7.7:5000/v2/_catalog);若需可视化搜索、镜像管理功能,建议替换为Harbor(基于Registry开发,功能更完善)。
六、总结
Docker Registry作为轻量级私有镜像仓库,是中小规模容器环境的优选方案,核心优势在于部署简单、资源占用低、可灵活扩展。本文梳理的核心要点的如下:
测试/内网环境:优先采用--insecure-registry配置,快速开启HTTP访问,提升部署效率;
生产环境:必须配置HTTPS加密访问+用户名密码认证,双重保障镜像传输和存储安全;
性能优化:通过配置镜像缓存代理,减少外网依赖,提升内网镜像拉取速度,降低带宽消耗;
镜像管理:严格遵循“仓库IP:端口/路径/镜像名:标签”的标签格式,通过REST API查询镜像信息。
通过本文的步骤配置,可快速搭建一个安全、高效的Docker私有镜像仓库,满足企业内网容器镜像的存储、管理和分发需求,为容器化部署提供可靠的镜像支撑。