CentOS7下Docker GitLab搭建Container Registry容器镜像仓库全攻略

一、环境准备与前置条件

1.1 系统与Docker环境要求

在CentOS7系统上部署Container Registry前,需确保满足以下条件:

  • 系统版本:CentOS 7.x(推荐7.9 LTS)
  • Docker版本:Docker CE 19.03+(支持Registry 2.x)
  • 存储空间:至少50GB可用磁盘空间(根据镜像规模调整)
  • 网络配置:开放5000端口(默认Registry端口)或自定义端口

安装Docker CE的步骤如下:

  1. # 卸载旧版本(如有)
  2. sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  3. # 安装依赖
  4. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  5. # 添加Docker仓库
  6. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  7. # 安装Docker CE
  8. sudo yum install -y docker-ce docker-ce-cli containerd.io
  9. # 启动并设置开机自启
  10. sudo systemctl enable --now docker

1.2 GitLab容器部署基础

GitLab容器需通过gitlab/gitlab-ce镜像部署,建议使用docker-compose管理生命周期。关键配置参数包括:

  • GITLAB_OMNIBUS_CONFIG:覆盖默认配置
  • external_url:设置GitLab访问地址
  • registry_external_url:配置Registry访问地址

示例docker-compose.yml片段:

  1. version: '3'
  2. services:
  3. gitlab:
  4. image: gitlab/gitlab-ce:latest
  5. container_name: gitlab
  6. restart: unless-stopped
  7. environment:
  8. GITLAB_OMNIBUS_CONFIG: |
  9. external_url 'http://gitlab.example.com'
  10. registry_external_url 'http://registry.example.com:5000'
  11. gitlab_rails['registry_enabled'] = true
  12. ports:
  13. - "80:80"
  14. - "443:443"
  15. - "5000:5000" # Registry端口
  16. volumes:
  17. - ./config:/etc/gitlab
  18. - ./logs:/var/log/gitlab
  19. - ./data:/var/opt/gitlab

二、Container Registry核心配置

2.1 启用Registry服务

通过GitLab Omnibus配置启用Registry:

  1. gitlab.rb中添加:
    1. registry['enable'] = true
    2. registry_external_url 'http://registry.example.com:5000'
    3. registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/registry.crt"
    4. registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/registry.key"
  2. 重新加载配置:
    1. sudo gitlab-ctl reconfigure

2.2 存储后端配置

Registry支持多种存储驱动,推荐使用本地存储或对象存储:

  • 本地存储(测试环境):
    1. registry['storage_delete_enabled'] = true
    2. registry['storage'] = {
    3. 's3' => {
    4. 'accesskey' => 'AKIA...',
    5. 'secretkey' => '...',
    6. 'bucket' => 'gitlab-registry',
    7. 'region' => 'us-east-1'
    8. }
    9. }
  • 对象存储(生产环境):
    1. # 安装s3fs-fuse(如需挂载S3)
    2. sudo yum install -y s3fs-fuse
    3. echo "AKIA...:..." > ~/.passwd-s3fs
    4. chmod 600 ~/.passwd-s3fs
    5. s3fs gitlab-registry /var/opt/gitlab/registry -o passwd_file=~/.passwd-s3fs -o umask=000

2.3 认证与权限控制

Registry与GitLab集成认证,需配置:

  • JWT令牌验证
    1. registry['auth'] = {
    2. 'token' => {
    3. 'realm' => 'https://gitlab.example.com/jwt/auth',
    4. 'service' => 'container_registry',
    5. 'issuer' => 'gitlab-issuer'
    6. }
    7. }
  • 项目级权限:通过GitLab的Protected BranchesDeploy Keys控制推送权限。

三、安全加固实践

3.1 HTTPS证书配置

为Registry启用TLS加密:

  1. 生成自签名证书(生产环境建议使用CA证书):
    1. openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    2. -keyout /etc/gitlab/ssl/registry.key \
    3. -out /etc/gitlab/ssl/registry.crt \
    4. -subj "/CN=registry.example.com"
  2. gitlab.rb中指定证书路径:
    1. nginx['ssl_certificate'] = "/etc/gitlab/ssl/registry.crt"
    2. nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/registry.key"

3.2 访问控制策略

  • IP白名单:通过Nginx配置限制访问:
    1. location / {
    2. allow 192.168.1.0/24;
    3. deny all;
    4. proxy_pass http://registry:5000;
    5. }
  • 速率限制:防止DDoS攻击:
    1. registry['storage_delete_enabled'] = true
    2. registry['limit'] = {
    3. 'read' => { 'interval' => '1m', 'average' => '100' },
    4. 'write' => { 'interval' => '1m', 'average' => '50' }
    5. }

四、高级使用场景

4.1 镜像签名与验证

使用cosign对镜像签名:

  1. # 安装cosign
  2. curl -LO https://github.com/sigstore/cosign/releases/download/v2.0.0/cosign-linux-amd64
  3. chmod +x cosign-linux-amd64
  4. sudo mv cosign-linux-amd64 /usr/local/bin/cosign
  5. # 签名镜像
  6. cosign sign --key cosign.key registry.example.com:5000/myproject/myimage:v1

4.2 跨项目镜像共享

通过Group-Level Registry实现共享:

  1. 在GitLab组设置中启用Shared RunnersContainer Registry
  2. 推送镜像时指定组路径:
    1. docker tag myimage registry.example.com:5000/mygroup/myproject/myimage:v1
    2. docker push registry.example.com:5000/mygroup/myproject/myimage:v1

4.3 监控与日志分析

  • Prometheus监控
    1. # docker-compose.yml片段
    2. prometheus:
    3. image: prom/prometheus
    4. volumes:
    5. - ./prometheus.yml:/etc/prometheus/prometheus.yml
    6. ports:
    7. - "9090:9090"
  • 日志分析:通过ELK栈集中管理Registry日志:
    ```bash

    配置Filebeat收集Registry日志

    filebeat.inputs:

  • type: log
    paths:
    • /var/log/gitlab/registry/config.log
      output.logstash:
      hosts: [“logstash:5044”]
      ```

五、故障排查与优化

5.1 常见问题解决

  • 502 Bad Gateway:检查Nginx配置和Registry容器状态。
  • 镜像推送失败:验证认证令牌和存储配额。
  • 性能瓶颈:调整registry['concurrent']参数(默认100)。

5.2 性能优化建议

  • 缓存层:使用CDN缓存高频访问镜像。
  • 数据库调优:调整PostgreSQL的shared_bufferswork_mem
  • 水平扩展:通过GitLab HA部署实现Registry负载均衡。

六、总结与最佳实践

  1. 生产环境建议

    • 使用对象存储(如S3/MinIO)替代本地存储
    • 启用镜像签名和内容信任
    • 定期清理未使用的镜像层
  2. 备份策略

    1. # 备份Registry数据
    2. sudo tar -czvf registry-backup-$(date +%Y%m%d).tar.gz /var/opt/gitlab/registry
  3. 升级路径

    • 测试环境验证新版本兼容性
    • 使用gitlab-ctl backup创建备份
    • 遵循GitLab官方升级指南

通过以上配置,您可在CentOS7下构建一个高可用、安全的Container Registry,实现与GitLab的无缝集成,满足企业级DevOps流程需求。实际部署时,建议先在测试环境验证所有配置,再逐步推广至生产环境。