如何配置極狐GitLab Docker 容器映象倉庫

极狐GitLab發表於2024-03-07

本文作者:徐曉偉

GitLab 是一個全球知名的一體化 DevOps 平臺,很多人都透過私有化部署 GitLab 來進行原始碼託管。極狐GitLab 是 GitLab 在中國的發行版,專門為中國程式設計師服務。可以一鍵式部署極狐GitLab。

極狐GitLab Docker 私庫開啟配置與使用方式

文件

  1. 極狐GitLab 容器映象庫

  2. 容器映象庫身份驗證

  3. 構建容器映象並將其推送到容器映象庫

  4. 從容器映象庫中刪除容器映象

  5. 減少容器映象庫儲存

說明

  1. 極狐GitLab 等 商業 極狐GitLab 中可直接使用

  2. 如果是自建極狐 GitLab,需要配置極狐 GitLab 容器映象庫的域名(https/SSL)才能使用(docker 映象倉庫需要使用 https),如果沒有配置,則不能訪問 專案地址/container_registry(頁面會返回 404)

    1. 如果自己有域名,可在阿里雲、騰訊雲、華為雲、百度雲等平臺申請域名證書,大概在每個平臺/賬戶/域名/年可以免費申請20個

      1. 阿里雲SSL(https)證書免費申請
      2. 騰訊雲SSL(https)證書免費申請
      3. 華為雲SSL(https)證書免費申請
      4. 百度雲SSL(https)證書免費申請
    2. 如果沒有域名,需要使用下列命令建立域名,以 registry.example.com 域名為例(其中 GitLab 例項的 IP 是 192.168.80.14,也可以使用 IP 生成證書)

    # 以 CentOS 為例
    # 如果出現 -bash: openssl: command not found,請安裝 openssl:yum -y install openssl
    
    # 生成指定位數的 RSA 私鑰:ca.key
    openssl genrsa -out ca.key 2048
    
    # 根據 RSA 私鑰,生成 crt 證書:ca.crt
    # CN:設定你要使用的域名
    # -utf8:支援中文
    # openssl req -new -x509 -days 3650 -key ca.key -subj "/C=CN/ST=山東/L=青島/O=徐曉偉工作室/OU=徐曉偉工作室/CN=192.168.80.14/emailAddress=xuxiaowei@xuxiaowei.com.cn" -out ca.crt -utf8
    openssl req -new -x509 -days 3650 -key ca.key -subj "/C=CN/ST=山東/L=青島/O=徐曉偉工作室/OU=徐曉偉工作室/CN=registry.example.com/emailAddress=xuxiaowei@xuxiaowei.com.cn" -out ca.crt -utf8
    
    # 生成 server.csr、server.key
    # CN:設定你要使用的域名
    # -utf8:支援中文
    # openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=山東/L=青島/O=徐曉偉工作室/CN=192.168.80.14" -out server.csr -utf8
    openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=山東/L=青島/O=徐曉偉工作室/CN=registry.example.com" -out server.csr -utf8
    
    # 生成 ca.srl、server.crt
    # subjectAltName:設定 DNS、IP
    # openssl x509 -req -extfile <(printf "subjectAltName=IP:192.168.80.14") -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    openssl x509 -req -extfile <(printf "subjectAltName=DNS:registry.example.com") -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    

    最終生成了:ca.crt、ca.key、ca.srl、server.crt、server.csr、server.key,其中 server.crtserver.key 就是 Nginx 使用的證書

配置ab-packages/docker-configuration#%E9%85%8D%E7%BD%AE "配置的直接連結")

  1. 設定 容器映象庫 域名

    sudo vim /etc/gitlab/gitlab.rb
    
    # 注意這裡是 https
    registry_external_url 'https://registry.example.com'
    
    # 限制IP,防止與 GitLab Pages 衝突
    # registry_nginx['listen_addresses'] = ['192.168.80.3']
    
    # 指定證書位置
    # 下面是預設配置
    # registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/域名.crt"
    # registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/域名.key"
    
  2. 重新配置

    sudo gitlab-ctl reconfigure
    
  3. 檢視狀態是否有異常

    sudo gitlab-ctl status
    
  4. 檢視日誌是否有異常

    sudo gitlab-ctl tail nginx
    
    # 如果出現下方日誌,代表未找到 .crt 證書
    # 如果你使用的是阿里雲等平臺的Nginx證書,請將 .pem 檔案字尾名修改為 .crt
    # 除了字尾名外,證書檔名為 registry_external_url 配置的域名
    # 證書的位置是 /etc/gitlab/ssl,如:/etc/gitlab/ssl/registry.example.com.crt、/etc/gitlab/ssl/registry.example.com.key
    # 如果僅缺少證書報錯,將證書檔案上傳至指定位置後,nginx 會自動啟動(推薦手動配置一次)
    ==> /var/log/gitlab/nginx/error.log <==
    2023/06/25 14:55:18 [emerg] 21028#0: cannot load certificate "/etc/gitlab/ssl/registry.example.com.crt": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/gitlab/ssl/registry.example.com.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
    

    日誌資料夾:/var/log/gitlab

  5. 訪問 專案地址/container_registry ,如果返回的不是 404 說明已經配置好了

    1. 如果使用域名,則需要新增DNS(或修改本地 hosts)

    2. 如果是自己生成的證書,使用時需要忽略證書驗證:參見:

      1. Docker 容器 Nexus 配置 SSL/https
  6. 極狐GitLab Docker 容器映象庫憑證(公開專案拉取映象無需憑證) 其中 $CI_REGISTRY 是 極狐GitLab registry_external_url 設定的域名,可訪問 專案地址/container_registry 看到

    1. 使用者名稱/密碼

      # 推薦在個人電腦上使用
      docker login -u 使用者名稱 -p 密碼 $CI_REGISTRY
      
    2. CI_REGISTRY_USER CI/CD 變數:

      # 此變數對容器映象庫具有讀寫許可權,並且僅對一個作業有效。它的密碼也會自動建立並分配給 CI_REGISTRY_PASSWORD。
      docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
      
    3. CI 作業令牌:

      # 推薦在 GitLab Runner 流水線中使用
      docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
      
    4. 部署令牌:

      # 推薦在不是 GitLab Runner 流水線中使用
      # 對於讀(拉取)訪問,範圍為 read_registry。
      # 對於寫(推送)訪問,範圍為 write_registry。
      docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
      
    5. 個人訪問令牌:

      # 推薦在個人電腦上使用
      # 對於讀(拉取)訪問,範圍為 read_registry。
      # 對於寫(推送)訪問,範圍為 write_registry。
      docker login -u <username> -p <access_token> $CI_REGISTRY
      
  7. 域名證書驗證失敗:參見:Docker 容器 Nexus 配置 SSL/https 先在宿主機上信任域名,然後使用掛載卷對映 /etc/docker/certs.d 到容器內即可

    # 此處以 Docker 執行器為例
    
    [[runners]]
      name = "localhost.localdomain"
      url = "http://192.168.61.147/"
      id = 2
      token = "oy1n427tVsyLazho1RR4"
      token_obtained_at = 2023-06-15T07:25:14Z
      token_expires_at = 0001-01-01T00:00:00Z
      executor = "docker"
      [runners.cache]
        MaxUploadedArchiveSize = 0
      [runners.docker]
        tls_verify = false
        image = "ruby:2.7"
        privileged = true
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        # /etc/hosts:/etc/hosts:使用者指定DNS(hosts)
        # /etc/docker/certs.d:/etc/docker/certs.d:信任 docker 域名證書配置的資料夾
        volumes = ["/cache", "/etc/hosts:/etc/hosts", "/etc/docker/certs.d:/etc/docker/certs.d"]
        shm_size = 0
    

    更多關於極狐GitLab 的最佳實踐,請搜尋關注【極狐GitLab】公眾號或者登入極狐GitLab 官網 https://gitlab.cn 進行學習。

相關文章