オープンソースのウェブ型GitリポジトリマネージャーであるGitLabを、今回はDockerを使って構築してみたいと思います。本格的にGitLabを使う場合には専用のLinuxサーバを構築して、そこにGitLabをインストールするのが一般的ですが、今回はローカル環境でDockerを使ってGitLabを構築してCI/CDの動作確認を行っていきます。
環境
今回は次の環境でGitLabを構築しています。
| 環境 | バージョン | 備考 |
|---|---|---|
| Ubuntu | 22.04 LTS | WSL2で構築 |
| Docker | 24.0.6 | https://get.docker.com/でインストール |
| Docker Compose | 2.21.0 | 標準にインストールされている |
| GitLab | 16.4.1 | Docker Composeで構築 |
| GitLab Runner | 16.4.0 | Docker Composeで構築 |
GitLabの構築
今回はGitLabをDocker Composeで構築します。次の手順で構築します。
- hostsの設定
- Dockerデーモンの設定変更
- Docker Composeファイルの作成
- GitLabの起動
hostsの設定
- IPアドレスの確認
まずは、DockerホストのIPアドレスを確認します。このIPアドレスは、GitLabの設定に使用します。
コマンド実行
hostname -I
次のように一番最初に表示されるIPアドレスをコピーしておいてください。

- hostsファイルの編集(ホストOS)
ホストOSのhostsファイルを編集します。(Macの場合は/etc/hosts、Windowsの場合はC:\Windows\System32\drivers\etc\hostsファイルを編集します。)次の行を追加してください。<IPアドレス>の部分は先に確認したIPアドレスを入れてください。
/etc/hosts
<IPアドレス> gitlab.local

Gitクライアントの設定
GitLabのリモートリポジトリをGitクライアントで操作するために、Gitクライアントの設定を行います。
- Gitの設定
Gitの設定を行います。次のコマンドを実行してください。
コマンド実行
git config --global user.name "<ユーザ名>"
git config --global user.email "<メールアドレス>"
<ユーザ名>と<メールアドレス>はGitLabにログインするときに使うものです。GitLabにログインするときに使うユーザ名とメールアドレスを入力してください。
Dockerデーモンの設定変更
今回GitLabはContainer RegistryをTLSで保護していないため、Dockerコマンドを使ったGitLab CI/CDジョブを実行するには次の設定を行う必要があります。
- Dockerデーモンの設定変更
- Dockerデーモンの設定変更
Dockerデーモンの設定を変更します。/etc/docker/daemon.jsonを作成します。
コマンド実行
echo '{ "insecure-registries":["gitlab.local:5000"] }' | sudo tee /etc/docker/daemon.json
insecure-registriesにgitlab.local:5000を設定しています。これはGitLabのContainer RegistryのURLで、TLSで保護されていないためinsecure-registriesに設定する必要があります。
- Dockerデーモンの設定変更
/etc/default/dockerを編集します。sedコマンドで書き換えます。
コマンド実行
sudo sed -i 's/^#DOCKER_OPTS=.*/DOCKER_OPTS="--insecure-registry gitlab.local:5000"/' /etc/default/docker
DOCKER_OPTSに--insecure-registry gitlab.local:5000を設定しています。これはGitLabのContainer RegistryのURLで、TLSで保護されていないためDOCKER_OPTSに設定する必要があります。
- Dockerデーモンの再起動
Dockerデーモンを再起動して設定を反映します。
コマンド実行
sudo systemctl restart docker
これでDockerデーモンの設定変更は完了です。
Docker Composeファイルの作成
次にdocker-compose.ymlを作成します。
- ディレクトリの作成
~/gitlabディレクトリを作成します。
- Docker Composeファイルの作成
Ubuntuのホームディレクトリの中にgitlabディレクトリを作成して、docker-compose.ymlファイルを作成し、次の内容を記述します。
gitlab/docker-compose.yml
version: '3.7'
services:
web:
image: 'gitlab/gitlab-ce:16.4.1-ce.0'
restart: always
hostname: 'gitlab.local'
container_name: gitlab-ce
environment:
GITLAB_OMNIBUS_CONFIG: |
# GitLabのURLを設定
external_url 'http://gitlab.local:8090'
gitlab_rails['gitlab_host'] = 'gitlab.local:8090'
nginx['listen_port'] = 8090
# GitLab Container Registryを有効化
registry_external_url 'http://gitlab.local:5000'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_api_url'] = "http://gitlab.local:5000"
registry['enable'] = true
registry_nginx['enable'] = false
registry['registry_http_addr'] = "gitlab.local:5000"
# リソース軽減するために不要な機能を停止
sidekiq['max_concurrency'] = 10
puma['worker_processes'] = 0
postgresql['shared_buffers'] = "512MB"
gitlab_rails['gitlab_kas_enabled'] = false
grafana['enable'] = false
prometheus_monitoring['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
ports:
- '8090:8090'
- '5000:5000'
volumes:
- ./gitlab/config:/etc/gitlab
- ./gitlab/logs:/var/log/gitlab
- ./gitlab/data:/var/opt/gitlab
networks:
- gitlab
extra_hosts:
- gitlab.local:host-gateway
gitlab-runner:
image: gitlab/gitlab-runner:alpine3.18-v16.4.0
container_name: gitlab-runner
restart: always
depends_on:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./gitlab-runner:/etc/gitlab-runner
networks:
- gitlab
extra_hosts:
- gitlab.local:host-gateway
networks:
gitlab:
name: gitlab-network
services.web.environment.GITLAB_OMNIBUS_CONFIGは次の設定を行っています。
今回はGitLabのアクセスするURLをhttp://gitlab.local:8090に設定したいため次の項目を設定しています。
external_url:GitLabのURLgitlab_rails['gitlab_host']:GitLabのホスト名nginx['listen_port']:GitLabのポート番号
また、GitLabのメモリ使用量を調整するために次の項目を設定しています。
sidekiq['max_concurrency']:Sidekiqの最大並列数puma['worker_processes']:Pumaのワーカープロセス数prometheus_monitoring['enable']:Prometheusの有効化postgresql['shared_buffers']:PostgreSQLの共有バッファ
これでGitLabのDocker Composeファイルが作成できました。
GitLabの起動
それでは作成したdocker-compose.yamlを使ってGitLabを起動します。
- コンテナの起動
docker-compose.ymlがあるディレクトリで次のコマンドを実行します。
コマンド実行
cd ~/gitlab
docker compose up -d
- コンテナの起動確認
次のようにコンテナが作成され起動します。

次のコマンドでコンテナの状態を確認します。
コマンド実行
docker compose ps
次のようにコンテナの状態が表示されます。STATUSがUpになっていることを確認します。

これでGitLabのコンテナが起動しました。
GitLabの起動が完了するまでには数分かかります。しばらくお待ちください。
GitLabの動作確認
次にGitLabの動作確認を行います。
- ブラウザでGitLabにアクセス
ブラウザで次のURLにアクセスします。
http://gitlab.local:8090
- GitLabのログイン画面の確認
次のようにGitLabのログイン画面が表示されることを確認します。

GitLabへのログイン
GitLabにログインします。
- 初期パスワードの確認
GitLabの初期状態で作成されているユーザはrootです。初期設定のパスワードは次のコマンドで確認できます。
rootの初期パスワード確認コマンド
docker exec -it gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password
次のように初期パスワードが表示されます。

- GitLabにログイン
このパスワードを使ってGitLabにログインします。

ログインが成功すると次のような画面が表示されます。

GitLabアカウントのパスワード変更
GitLabのアカウントのパスワードを変更します。
- パスワード変更画面の表示
GitLabのトップ画面の左上のアイコンをクリックして「Edit profile」をクリックします。

- パスワード変更画面の表示
User Settings画面が表示されますので、左の「Password」をクリックします。そして「Current password」に先に確認したパスワードを入力し、「New password」と「Password comfirmation」には新しいパスワードを入力して「Save password」ボタンをクリックします。
- パスワードが弱いとエラーになります。パスワードは8文字以上で、英字と数字を含めてください。(例:
fullness123)

- 再ログイン
パスワード変更が完了すると再ログインが必要になります。再ログインしてください。
これでパスワード変更は完了です。
GitLab Runnerの登録
次にGitLab Runnerを登録します。GitLab RunnerはGitLabのCI/CDのジョブを実行するためのサービスです。GitLab RunnerはGitLabの管理画面から登録できます。
Resistration Tokenの確認
GitLab Runnerの登録にはResistration Tokenが必要です。Admin AreaのCI/CDのRunnersの画面から確認できます。
- Admin AreaのCI/CDのRunnersの画面にアクセス
GitLabのトップ画面にて/を押して検索欄にadminと入力して「Admin Area / Dashboard」をクリックします。

- Resistration Tokenの確認
GitLabの管理画面で次の項目を確認します。
「CI/CD」->「Runners」の画面から「New instance runner」の左の「:」をクリックして「Resistration Token」を確認します。

GitLab Runnerの登録
確認したRegistration Tokenを使ってGitLab Runnerを登録します。
- 環境変数の設定
GitLab Runner登録時に必要な情報を環境変数に設定します。次のコマンドを実行してください。
まず、<Registration Token>の部分には先に確認したRegistration Tokenを入れてください。
コマンド実行
export RUNNER_TOKEN=<Registration Token>
次にホストのIPアドレスを環境変数に設定します。次のコマンドを実行してください。
コマンド実行
export HOST_IP=$(hostname -I | cut -d' ' -f1)
- GitLab Runnerの登録
次のコマンドを実行してGitLab Runnerを登録します。<Registration Token>の部分には先に確認したRegistration Tokenを入れてください。
コマンド実行
docker exec -it gitlab-runner gitlab-runner register \
--non-interactive \
--url http://gitlab.local:8090 \
--registration-token "$RUNNER_TOKEN" \
--executor docker \
--docker-image docker:latest \
--description "docker-runner" \
--tag-list "docker" \
--run-untagged \
--locked="false" \
--access-level="not_protected" \
--docker-extra-hosts "gitlab.local:$HOST_IP" \
--docker-privileged \
--docker-volumes "/cache" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
--docker-volumes "/etc/default/docker:/etc/default/docker" \
--docker-volumes "/etc/docker/daemon.json:/etc/docker/daemon.json"
次のようにRegister runner succeededと表示されれば登録完了です。

ちなみに上記のコマンドは次のような設定を行っています。
--url:GitLabのURL--registration-token:Registration Token--executor:実行環境(今回はDocker)--docker-image:Job実行時のデフォルトのDockerイメージ--description:GitLab Runnerの説明--tag-list:GitLab Runnerに設定するタグ--run-untagged:タグのないジョブを実行するかどうか--locked:GitLab Runnerをロックするかどうか--access-level:GitLab Runnerのアクセスレベル(not_protectedは誰でも使える)--docker-extra-hosts:Dockerコンテナ内からGitLabにアクセスするための設定--docker-privileged:Dockerコンテナを特権モードで実行するかどうか--docker-volumes:Dockerコンテナのボリュームの設定
- GitLab Runnerの確認
GitLabのRunner画面にて登録したRunnerが表示されていることを確認します。

これでGitLab Runnerの登録が完了しました。
GitLabプロジェクトの作成
GitLabプロジェクトを作成します。
- GitLabプロジェクトの作成
GitLab画面の左上にある「+」をクリックして「New project/repository」をクリックします。

「Create blank project」ボタンをクリックします。

- プロジェクト設定の入力
次のように入力して「Create project」ボタンをクリックします。
- Project name:
test - Project URL:
http://gitlab.local:8090/root - Project Slug:
test - Visibility Level:
Private

プロジェクトが作成されます。

「Clone」ボタンをクリックして表示されるURLをコピーします。

GitLabリポジトリをローカルにクローン
GitLabのリポジトリをローカルにクローンします。
- リモートリポジトリをクローン
ホームディレクトリ/home/ubuntuで次のコマンドを実行します。
コマンド実行
cd /home/ubuntu
git clone <GitLabのリポジトリURL>
- ログイン
GitLabのログイン画面が表示されますので、先ほど変更したパスワードでログインします。

次のようにtestディレクトリが作成され、GitLabのリポジトリがローカルにクローンされます。

GitLab CI/CDパイプラインの作成
GitLab CI/CDパイプラインを作成します。
- GitLab CI/CIファイルの作成
それではGitLab CI/CDのジョブを作成してみましょう。GitLab CI/CDのジョブは.gitlab-ci.ymlというファイルに記述します。.gitlab-ci.ymlはGitLabプロジェクトのルートディレクトリに作成します。作成したら次の内容を記述します
test/.gitlab-ci.yml
build:
tags:
- docker
stage: test
image: openjdk:17
script:
- java -version
上記はopenjdk:17のDockerイメージを使ってjava -versionを実行するジョブを定義しています。tagsにdockerを設定しています。これはGitLab Runnerの設定でdockerというタグを設定しているためです。tagsに設定したタグのRunnerがジョブを実行します。
- GitLab CI/CDジョブの実行
GitLab CI/CDジョブを実行します。ローカルリポジトリをコミットしてプッシュします。
コマンド実行
cd test
git add .
git commit -m "first commit"
git push origin main

- GitLab CI/CDジョブの実行確認
プッシュが完了するとGitLabのプロジェクト画面にてジョブが実行されます。矢印の箇所をクリックするとジョブの詳細を確認できます。

ジョブの詳細が表示されます。ジョブに成功していると次のように表示されます。矢印の箇所をクリックするとジョブのログが表示されます。

- ジョブのログの確認
ジョブのログが表示されます。ジョブのログにはjava -versionの実行結果が表示されています。

このようにGitLab CI/CDのジョブを作成して実行することができました。
Dockerコマンドを使ったGitLab CI/CDジョブの作成
それではDockerコマンドを使ったCI/CDジョブを作成します。
- GitLab CI/CDファイルの修正
.gitlab-ci.ymlを次のように編集します。
test/.gitlab-ci.yml
build:
tags:
- docker
stage: test
image: openjdk:17 script:
- java -version - docker run hello-world
上記はdockerのDockerイメージを使ってdocker run hello-worldを実行するジョブを定義しています。
- GitLab CI/CDジョブの実行
GitLab CI/CDジョブを実行します。次のコマンドを実行します。
コマンド実行
cd /home/ubuntu/test
git add .
git commit -m "update .gitlab-ci.yml"
git push origin main
- GitLab CI/CDジョブの実行確認
プッシュが完了するとGitLabのプロジェクト画面にてジョブが実行されます。次のようにdocker run hello-worldが実行されていることが確認できます。

これでGitLab CI/CDのジョブでDockerコマンドを使うことができました。
まとめ
今回はGitLabをDocker Composeで構築してCI/CDの動作確認を行いました。GitLabをDocker Composeで構築することでローカル環境でGitLabを構築してCI/CDの動作確認を行うことができます。
GitLabを使ってCI/CDを実行することで、開発者はコードをリポジトリにプッシュするだけで自動的にテストやビルド、デプロイを行うことができます。GitLabを使ってCI/CDを実行することで開発者は開発に集中することができます。




