1. 概述

GitLab 作为领先的 DevOps 平台,不仅提供 Git 版本控制功能,还集成了软件开发生命周期各阶段所需的多种工具。其中,GitLab Container Registry 是一个强大的容器镜像管理解决方案,可直接在 GitLab 项目中使用。结合 GitLab CI,它使 GitLab 成为自动化和加速 DevOps 流程的一站式平台。

本文将介绍如何在自托管(Self-managed)GitLab 实例上启用容器镜像仓库,管理员需要在 Omnibus GitLab 安装中进行配置。同时,我们也会演示如何在自托管和 SaaS 环境中使用该仓库。


2. GitLab 容器镜像仓库简介

GitLab 8.8 引入了 GitLab Container Registry,这是一个完全集成、安全且私有的容器仓库。它允许团队直接在 GitLab 基础设施中存储和管理容器镜像。其主要特性包括:

无需额外安装软件,配置简单快捷
用户和组权限由 GitLab 全权管理,权限控制统一
每个项目自动拥有独立的容器仓库,无需手动创建仓库
与 GitLab CI/CD 无缝集成,可通过流水线直接构建、推送和拉取镜像

GitLab Container Registry 可通过 GitLab 界面和 API 访问,非常适合已经使用 GitLab 进行版本控制和持续集成的团队,能够实现所有流程集中化管理。


3. 为自托管 GitLab 配置容器仓库

GitLab Container Registry 与 GitLab 完全集成。但在使用 Omnibus 安装包部署的自托管 GitLab 上启用该功能,通常需要额外配置。相比之下,GitLab SaaS 版本(即 GitLab.com)默认已配置好,仓库域名为 registry.gitlab.com

3.1 启用 GitLab 容器仓库

只需配置仓库监听的域名即可启用 GitLab 容器仓库。在进行配置前,建议先检查当前配置是否已更改,可以通过对比默认配置模板与当前配置文件:

$ sudo gitlab-ctl diff-config

该命令会显示当前配置与默认配置之间的差异,有助于确认默认参数是否被修改。

GitLab 容器仓库可以配置在 GitLab 主域名下使用特定端口,也可以使用独立域名。在 /etc/gitlab/gitlab.rb 中找到并取消注释 registry_external_url,根据需求设置值:

  • 复用 GitLab 域名 + 端口(推荐复用证书):
registry_external_url 'https://gitlab.example.com:5050'

⚠️ 注意:避免使用端口 5000,它是 GitLab 内部组件与仓库通信的默认端口。

  • 使用独立域名
registry_external_url 'https://registry.gitlab.example.com'

GitLab 默认推荐使用 HTTPS,但也可使用 HTTP。如果证书不在 /etc/gitlab/ssl/ 路径下,需手动指定路径:

registry_nginx['ssl_certificate'] = "/path/to/certificate.pem"
registry_nginx['ssl_certificate_key'] = "/path/to/certificate.key"

设置证书权限:

$ chmod 600 /etc/gitlab/ssl/registry.domain.com.*

通常,配置文件中注释表示默认值,无需手动启用 registry.enable = true,因为该功能默认已开启。

3.2 管理容器仓库存储路径

默认镜像存储路径为 /var/opt/gitlab/gitlab-rails/shared/registry,若需自定义路径,可在配置文件中修改:

gitlab_rails['registry_path'] = "/path/to/registry/storage"

GitLab 也支持对象存储,如 S3、Azure、GCS 等,详细配置可参考官方文档。

3.3 应用配置变更

完成配置后,执行以下命令使配置生效:

$ sudo gitlab-ctl reconfigure

4. 使用 GitLab 容器镜像仓库

启用容器仓库后,即可开始管理 Docker 镜像。

4.1 推送 Docker 镜像到 GitLab 仓库

首先使用 GitLab 账号登录仓库:

$ docker login registry.gitlab.example.com

进入 GitLab 项目页面,选择左侧菜单 Deploy > Container Registry(新版本)或 Packages and Registries > Container Registry(旧版本)查看仓库界面:

GitLab Container Registry

根据 GitLab 的镜像命名规范:

<registry server>/<namespace>/<project>[/<optional path>]

例如:

$ docker build -t registry.gitlab.example.com/mynamespace/myproject/myimage:latest .

然后推送镜像:

$ docker push registry.gitlab.example.com/mynamespace/myproject/myimage:latest

4.2 在 GitLab CI/CD 中使用容器仓库

GitLab Container Registry 最强大的功能之一是与 CI/CD 流水线的集成。通过使用 GitLab 预定义变量,可实现自动登录和推送镜像:

build:
  image: $CI_REGISTRY/mynamespace/myproject/ubuntu:20.10.16
  stage: build
  services:
    - $CI_REGISTRY/mynamespace/myproject/docker:20.10.16-dind
    - alias: docker
  script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG

该配置中使用了 $CI_REGISTRY$CI_REGISTRY_IMAGE 等变量,并通过 dind(Docker-in-Docker)在 CI 环境中运行 Docker 构建,确保构建过程一致且隔离。


5. 总结

本文介绍了 GitLab Container Registry 的基本功能及其与 GitLab 的无缝集成。通过启用容器仓库、配置存储路径、以及与 CI/CD 的集成,我们可以简化容器镜像的管理和发布流程。

无论是管理少量容器镜像还是跨多个项目的大规模镜像仓库,GitLab Container Registry 都提供了一个安全、可扩展的解决方案,是 DevOps 实践中值得推荐的工具。


原始标题:Enable and Use GitLab Container Registry