これは、なにをしたくて書いたもの?
セルフホスティングしている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.rbのregistry_external_urlを設定します。
設定後は、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で証明書のマウントをしておくことに
なりますね。
あと、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.rbのregistry_external_urlを設定します。
デフォルトではコメントアウトされているので
/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 Daemonにinsecure-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というものですね。
おわりに
セルフホスティングしているGitLabのコンテナレジストリーを有効にして、GitLab CI/CDで使えるようにしてみました。
HTTPで扱おうとするととてもハマる気がするので、素直にHTTPSにした方がいいんでしょうね…。ハマったのは全部HTTPの部分です…。
ただ、こうやっていろいろ試すとだいぶ理解が進んだ気はします。