CLOVER🍀

That was when it all began.

セルフホスティングしているGitLabのコンテナレジストリーを有効にして、GitLab CI/CDで使えるようにする

これは、なにをしたくて書いたもの?

セルフホスティングしているGitLabのコンテナレジストリーを有効にする方法と、GitLab CI/CDで使えるようにする方法をメモしておこうかなと。

だいぶハマったので…。

GitLabのコンテナレジストリ

GitLabのコンテナレジストリーは、設定によっては自動的に有効になっているようです。

The container registry is automatically enabled and available on your GitLab domain, port 5050 if you’re using the built-in Let’s Encrypt integration.

GitLab container registry administration | GitLab Docs

どうやら有効になるのは、HTTPSを設定した時みたいですけどね。HTTPで構成した場合は有効にはなりませんでした。

有効にするにはこちらに従って、gitlab.rbregistry_external_urlを設定します。

GitLab container registry administration / Container registry domain configuration / Configure container registry under an existing GitLab domain

設定後は、gitlab-ctl reconfigureを実行すればコンテナレジストリーが使えるようになっています。

How to restart GitLab / Linux package installations / Reconfigure a Linux package installation

GitLabのコンテナレジストリーをGitLab CI/CDから使う

コンテナレジストリーを使えるようにした時は、GitLab CI/CDから使うことが多いでしょう。

その時の.gitlab-ci.ymlの設定例やDocker-in-Dockerで使う例は、以下に載っています。

Build and push container images to the container registry | GitLab Docs

Docker-in-Dockerを使う時は、GitLab Runnerの設定をしておく必要があります。privilegedの指定と、volumesで証明書のマウントをしておくことに
なりますね。

Use Docker-in-Docker

あと、HTTPで使おうとする場合はDocker-in-Dockerの指定でちょっとハマるかもしれません。

このあたりを踏まえて、ちょっと試してみます。

環境

今回の環境はこちら。

$ sudo gitlab-rake gitlab:env:info

System information
System:         Ubuntu 24.04
Current User:   git
Using RVM:      no
Ruby Version:   3.2.8
Gem Version:    3.6.9
Bundler Version:2.7.1
Rake Version:   13.0.6
Redis Version:  7.2.10
Sidekiq Version:7.3.9
Go Version:     unknown

GitLab information
Version:        18.3.1
Revision:       bccd1993b5d
Directory:      /opt/gitlab/embedded/service/gitlab-rails
DB Adapter:     PostgreSQL
DB Version:     16.8
URL:            http://192.168.0.6
HTTP Clone URL: http://192.168.0.6/some-group/some-project.git
SSH Clone URL:  git@192.168.0.6:some-group/some-project.git
Using LDAP:     no
Using Omniauth: yes
Omniauth Providers:

GitLab Shell
Version:        14.44.0
Repository storages:
- default:      unix:/var/opt/gitlab/gitaly/gitaly.socket
GitLab Shell path:              /opt/gitlab/embedded/service/gitlab-shell

Gitaly
- default Address:      unix:/var/opt/gitlab/gitaly/gitaly.socket
- default Version:      18.3.1
- default Git Version:  2.50.1.gl1

GitLabは192.168.0.6で動作しているものとします。

GitLab Runner。

$ gitlab-runner --version
Version:      18.3.0
Git revision: 9ba718cd
Git branch:   18-3-stable
GO version:   go1.24.4 X:cacheprog
Built:        2025-08-21T12:21:12Z
OS/Arch:      linux/amd64

Docker。

$ docker version
Client: Docker Engine - Community
 Version:           28.3.3
 API version:       1.51
 Go version:        go1.24.5
 Git commit:        980b856
 Built:             Fri Jul 25 11:34:09 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.3.3
  API version:      1.51 (minimum version 1.24)
  Go version:       go1.24.5
  Git commit:       bea959c
  Built:            Fri Jul 25 11:34:09 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

GitLab Runnerは、GitLabとは別のホストで動作しているものとします。

GitLabのコンテナレジストリーを有効にする

GitLabのコンテナレジストリーを有効にするには、ドキュメントに習ってgitlab.rbregistry_external_urlを設定します。

GitLab container registry administration / Container registry domain configuration / Configure container registry under an existing GitLab domain

デフォルトではコメントアウトされているので

/etc/gitlab/gitlab.rb

# registry_external_url 'https://registry.example.com'

今回は以下のように設定しました。HTTPです。

registry_external_url 'http://192.168.0.6:5050'

GitLabを再設定。

$ sudo gitlab-ctl reconfigure

これでGitLabの再設定と再起動が行われ、GitLabプロジェクトでコンテナレジストリーにアクセスできるようになっています。

GItLab Runner/Docker Executorで使う

利用できるようにしたコンテナレジストリーをDocker Executorで使えるようにしましょう。

まずはDocker Daemoninsecure-registriesの設定をしておきます。

/etc/docker/daemon.json

{
  "insecure-registries" : ["192.168.0.6:5050"]
}

Docker Daemonを再起動。

$ sudo systemctl restart docker

この後は、特にHTTPで使いたい場合はDocker-in-Dockerの設定を.gitlab-ci.ymlでどう書きたいかで変わってくる気がします。

こんな感じでDocker-in-Dockerのservice設定に--insecure-registryを書いてよいのであれば

image-build:
  stage: ...
  services:
    - name: docker:28.3.3-dind
      command: ["--insecure-registry=192.168.0.6:5050"]
  image: docker:28.3.3
  script:
    - |
      echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
      docker image build -t $CI_REGISTRY_IMAGE/[image-name]:[tag] .
      docker image push $CI_REGISTRY_IMAGE/[image-name]:[tag]

GitLab Runner(Docker Executor)はこんな登録方法になります。

$ RUNNER_TOKEN=...
$ sudo gitlab-runner register \
  --non-interactive \
  --url "http://192.168.0.6/" \
  --token "$RUNNER_TOKEN" \
  --executor "docker" \
  --docker-image ubuntu:24.04 \
  --docker-privileged \
  --docker-volumes "/certs/client" \
  --description "....."

※ この設定であればDocker Daemonの設定は不要では?と思うかもしれませんが、コンテナレジストリーに格納したイメージをpullする時に結局必要になります

こんな感じで.gitlab-ci.ymlには--insecure-registryを書きたくない、ということであれば

image-build:
  stage: ...
  services:
    - docker:28.3.3-dind
  image: docker:28.3.3
  script:
    - |
      echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
      docker image build -t $CI_REGISTRY_IMAGE/[image-name]:[tag] .
      docker image push $CI_REGISTRY_IMAGE/[image-name]:[tag]

/var/run/docker.sockをマウントするとよいでしょう。

$ RUNNER_TOKEN=...
$ sudo gitlab-runner register \
  --non-interactive \
  --url "http://192.168.0.6/" \
  --token "$RUNNER_TOKEN" \
  --executor "docker" \
  --docker-image ubuntu:24.04 \
  --docker-privileged \
  --docker-volumes "/certs/client" \
  --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
  --description "....."

これはDocker outside of Dockerというものですね。

Use Docker-in-Docker

おわりに

セルフホスティングしているGitLabのコンテナレジストリーを有効にして、GitLab CI/CDで使えるようにしてみました。

HTTPで扱おうとするととてもハマる気がするので、素直にHTTPSにした方がいいんでしょうね…。ハマったのは全部HTTPの部分です…。

ただ、こうやっていろいろ試すとだいぶ理解が進んだ気はします。