GitLab Container Registry: 基本設定と利用方法

はじめに

前回の記事ではLinuxサーバーにGitLabを構築する方法について解説しました。今回からは構築したGitLabの様々な機能について紹介していきます。今回はGitLabのコンテナレジストリを利用してコンテナイメージを格納したり、格納したイメージをpullして取得する方法を解説します。

前提条件

  • 本記事で解説する環境は、Omnibusパッケージを用いてインストールしたLinux版GitLabを利用しています。
  • GitLabのエディションはCommunity Editionを利用しています。
  • また、GitLab本体およびGitLab Container Registryの双方にカスタムドメインを割り当て、自己署名証明書を導入しています。
  • 詳細な環境情報については前回の記事をご参照ください。

GitLab Container Registryとは

コンテナレジストリとは、アプリケーションのコンテナイメージを保存・管理し、チーム内やシステム間で共有するための仕組みです。GitLabにはこのコンテナレジストリ機能が標準で搭載されており、追加の外部サービスを利用しなくても、GitLabのプロジェクト内でイメージのビルドから保存、配布までを完結できます。特に、Docker Hubのように一般公開を前提としたパブリックレジストリと比べると、GitLab Container Registryは閉域環境や社内ネットワークでプライベートに運用できる点が大きな強みです。
パブリックレジストリとプライベートレジストリの利用スタイルの違いは以下のとおりです。

項目パブリックレジストリ
(例: Docker Hub, Quay.io)
プライベートレジストリ
(例: GitLab Container Registry, Harbor)
利用範囲全世界のユーザーがアクセス可能組織やチームの内部利用に限定可能
接続要件インターネット接続が必須閉域ネットワークや社内環境でも利用可能
認証・制御公開イメージは誰でも取得可能、制御は限定的細かいアクセス制御が可能
メリットOSSイメージを容易に入手可能配布セキュリティやガバナンスを自社内で統制可能
デメリットRate Limitや可用性リスクをサービス提供者に依存自社運用では構築・保守費用が発生

また、ソースコードのリポジトリとコンテナイメージを同じGitLab上で管理できるため、CI/CDパイプラインとシームレスに連携できます。その結果、コードの変更からイメージのビルド、デプロイまでを一貫したワークフローとしてシンプルかつ安全に実現できます。

設定方法

GitLab Container Registryは、Omnibus版GitLabでは基本的にインストール直後から有効になっています。ただし、独自ドメインを使いたい場合やデータ格納パスを変更したい場合には、構成ファイル /etc/gitlab/gitlab.rb を編集して設定を行います。

主な設定項目は以下のとおりです。

  • 公開 URL:registry_external_url
  • TLS 証明書と秘密鍵:registry_nginx[‘ssl_certificate’] / registry_nginx[‘ssl_certificate_key’]
  • レジストリのデータ保存先:gitlab_rails[‘registry_path’]

設定例:

registry_external_url "https://registry.gitlab.local.example.com"
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.local.example.com.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.local.example.com.key"
gitlab_rails['registry_path'] = "/mnt/gitlab-registry"

編集後は以下を実行して反映します。

$ gitlab-ctl reconfigure

参考:
GitLab container registry administration
前回記事:GitLabとコンテナプラットフォームの連携 | SIOS Tech. Lab

レジストリ基本操作

レジストリの基本操作は次のとおりです。

  • レジストリへのログイン
  • ローカルからコンテナイメージをpush
  • レジストリからコンテナイメージをpull

以下では実際の手順を紹介します。なお、操作例はRHEL環境でPodmanを使用していますが、Docker環境ではpodmanをdockerに置き換えてください。

レジストリへのログイン

$ podman login registry.gitlab.local.example.com
Username: <GitLabのユーザー名>
Password: <ログインするユーザーのパスワード>

Login Succeeded!

※ログイン認証について:
ユーザー名とパスワードでもログイン可能ですが、実運用ではPersonal Access Token (PAT) の利用が推奨されます。PATのスコープにはread_registryとwrite_registryを指定してください。ログイン時のパスワード欄にPATを入力すればより安全にpush/pullすることが可能です。

イメージのpush

ブラウザからGitLabのコンソール画面にログインし、任意のプロジェクトを作成します。
GitLabプロジェクトの作成方法についてはこちらの記事も参考にしてください。

プロジェクトの [デプロイ] > [コンテナレジストリ] メニューに移動すると、そのプロジェクト専用のレジストリが表示されます。
レジストリURLは以下の形式になります。
<コンテナレジストリの公開URL>/<ユーザー名またはグループ名>/<プロジェクト名>

※Namespaceの確認方法:
個人所有のプロジェクト → namespaceはユーザー名
グループ配下のプロジェクト → namespaceはグループ名
GitLabプロジェクトのURLを見ると確認できます。
例:
https://gitlab.local.example.com/demo-group/hello-nginx→namespaceはdemo-group、projectはhello-nginx

参考:GitLab container registry

作成したプロジェクトのレジストリにイメージを格納してみます。
今回のデモでは、nginxをベースにしたシンプルなWebサーバーのコンテナを作成します。サンプルのindex.htmlをコンテナ内に組み込み、ブラウザからアクセスするとページが表示される仕組みです。
まずは、GitLabにアクセス可能な作業用端末にログインし、ターミナルを起動します。
任意のディレクトリで以下のようなサンプルのDockerfileとindex.htmlを作成します。

$ vi Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
$ vi index.html
<!doctype html>
<html lang="ja">
  <meta charset="utf-8">
  <title>Hello GitLab Registry</title>
  <h1>Hello GitLab Registry</h1>
</html>

Dockerfileを作成したディレクトリで以下のコマンドを実行し、イメージをビルドします。

$ podman build -t <レジストリのパス>/<イメージ名>:<任意のタグ> .

# 実行例
$ podman build -t registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0 .

イメージのビルドが成功したら、イメージをGitLabのレジストリにpushします。

$ podman push <レジストリのパス>/<イメージ名>:<任意のタグ>

# 実行例
$ podman push registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0
The push refers to repository [registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx]
001b285e90c0: Pushed 
...(省略)
v1.0: digest: sha256:98ed22db613e039a43ceb3416a66fcdfc7b6f040d1f1435acc20406cb1725504 size: 2196

GitLabのコンソール画面にログインし、イメージをpushしたプロジェクトのレジストリ画面に移動します。
pushしたコンテナイメージがGitLabのレジストリに保存されたことが確認できます。

イメージのpull

今度はGitLabのレジストリからイメージを取得してみます。
まずはローカルの同名イメージを削除します。

$ podman rmi registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0 registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0 2>/dev/null || true
Untagged: registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0
...(省略)
Deleted: sha256:0a9426ad0f5bca69d275b08131d490b512b022a943ac0a65cc8b651945b288ca

GitLabのレジストリから先ほどpushしたイメージを指定してローカルにpullします。

$ podman pull <レジストリのパス>/<イメージ名>:<任意のタグ>

# 実行例
$ podman pull registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0
v1.0: Pulling from registry-test-group/registry-test-project/nginx
...(省略)
Status: Downloaded newer image for registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0
registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0

pullしたイメージを利用してコンテナを起動します。

$ podman run --rm -d --name hello-nginx -p 8080:80 registry.gitlab.local.example.com/registry-test-group/registry-test-project/nginx:v1.0

ブラウザを起動し、http://localhost:8080にアクセスするとビルドしたイメージ内のindex.htmlの内容が表示されます。

これでレジストリから取得したイメージを利用してコンテナを起動できることが確認できました。

まとめ

今回はGitLab Container Registryの設定方法と基本操作について紹介しました。GitLabのレジストリは、Docker Hubと同じ感覚で利用できるだけでなく、ソースコードと同じ場所で統合管理できる点が強みです。次回は、イメージの公開範囲の制御やガベージコレクションなど、運用に役立つ応用設定について紹介します。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です