在CI/CD流水线中,镜像管理一直是开发者面临的痛点。当团队规模扩大,公共镜像仓库的限速和隐私问题逐渐凸显,而商业解决方案又往往价格不菲。本文将带你用最简配置,在HTTP协议下搭建一个与GitLab深度集成的私有Container Registry,无需购买SSL证书,特别适合中小团队快速搭建内部镜像托管服务。
私有镜像仓库的核心价值在于可控性和集成度。与直接使用Docker Hub或第三方服务不同,GitLab内置的Container Registry能够无缝对接CI/CD流程,实现从代码提交到镜像部署的全链路自动化。
基础组件需求:
典型的开发场景中,我们会遇到这些具体需求:
bash复制# 验证Docker环境
docker --version
docker-compose --version
与传统HTTPS配置不同,HTTP方案需要特别注意Docker守护进程的信任设置。以下是经过生产验证的配置模板,已过滤掉非必要参数。
gitlab.rb核心配置段:
ruby复制registry_external_url 'http://your.gitlab.domain:5050'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "your.gitlab.domain"
gitlab_rails['registry_port'] = "5050"
registry['registry_http_addr'] = "0.0.0.0:5050"
registry_nginx['listen_port'] = 5050
对应的docker-compose.yml需要特别注意端口映射:
yaml复制services:
gitlab:
image: gitlab/gitlab-ee:latest
ports:
- "80:80"
- "5050:5050" # Registry服务端口
volumes:
- ./gitlab/config:/etc/gitlab
- ./gitlab/data:/var/opt/gitlab
重要提示:所有涉及域名的配置需保持一致,包括gitlab.rb、docker-compose.yml以及后续客户端配置
由于采用HTTP协议,需要配置Docker客户端信任私有仓库地址。不同操作系统的配置方式有所差异:
Linux/macOS:
bash复制# 编辑或创建daemon.json
sudo nano /etc/docker/daemon.json
添加以下内容(需替换实际域名):
json复制{
"insecure-registries" : ["your.gitlab.domain:5050"]
}
Windows(Docker Desktop):
"insecure-registries": ["your.gitlab.domain:5050"]配置生效后需要重启Docker服务:
bash复制sudo systemctl restart docker # Linux
完成服务端部署后,可以通过完整工作流验证Registry是否正常:
bash复制# 测试镜像推送流程
docker pull nginx:alpine
docker tag nginx:alpine your.gitlab.domain:5050/your-project/nginx:test
docker login your.gitlab.domain:5050
docker push your.gitlab.domain:5050/your-project/nginx:test
在GitLab CI中集成时,.gitlab-ci.yml需要包含认证步骤:
yaml复制build_image:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE .
- docker push $CI_REGISTRY_IMAGE
常见问题排查指南:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接被拒绝 | 防火墙限制 | 检查5050端口是否开放 |
| 认证失败 | 密码包含特殊字符 | 使用访问令牌替代密码 |
| 推送超时 | 镜像体积过大 | 分阶段构建或优化Dockerfile |
私有仓库运行稳定后,需要关注存储管理和性能调优:
存储清理策略:
ruby复制# 在gitlab.rb中添加
registry['storage']['delete']['enabled'] = true
registry['storage']['delete']['olderthan'] = "90d"
定期维护命令:
bash复制# 查看仓库磁盘使用情况
docker exec -it gitlab du -sh /var/opt/gitlab/gitlab-rails/shared/registry
# 执行垃圾回收
docker exec -it gitlab gitlab-ctl registry-garbage-collect
对于高频使用的团队,建议考虑这些进阶配置:
实际部署中发现,当并发推送超过10个镜像时,适当调整Registry的并发参数能显著提升性能:
ruby复制registry['storage']['cache']['blobdescriptor'] = 'redis'
registry['redis']['host'] = 'redis.service'
registry['redis']['port'] = 6379