【実験】Dockerを使用してGitLabを構築してみる part1

今回は仮想化技術である「コンテナ化」の代表的なプラットフォームであるDockerを使用してGitLabを構築してみます。
恐らく長くなりそうなので、複数回に分けて投稿予定です。
加えて今回は実施しませんが次回以降に以前使用していたGitLabとデータの共有を出来るように設定したいと思います。

#事前準備
まずはサーバーにDockerをインストールします。
以下のコマンドでインストールを行います。

```
sudo yum -y install docker
```

インストール完了後、起動と自動起動の有効化を行います。

```
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
```

Dockerを起動後、テスト用イメージである```hello-world```を取得します。
プル完了後、```docker images```コマンドでイメージが追加されたか確認します。

```
※以降、sudo省略
docker images
docker pull hello-world
docker images #正常にプル出来ていればlatestというタグ名のイメージが存在している
```

取得の確認が出来たら、上記イメージはもう不要なので、削除します。
削除は以下のコマンドで実行します。

```
docker images #削除対象のIMAGE IDを確認する
docker rmi <削除対象IMAGE ID>
docker images #削除されているか確認する
```

以上で動作確認を含めた事前準備は完了です。

#GitLabイメージの取得・インストール
GitLabの取得は以下のコマンドで実施出来ます。

```
docker pull gitlab/gitlab-ce
docker images #表示結果にgitlab-ceが存在していれば正常にプル完了
```

続いてGitLabのインストールを実施しますが、その前にGitLabの各種ファイルを保存するローカル環境変数を指定します。

```
mkdir /srv/gitlab
export GITLAB_HOME=/srv/gitlab
```

準備が整いましたら、以下のコマンドでGitLabのインストールを行います。

```
docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ce:<タグ名(変更していなければlatest)>
```

上記コマンド実行後すぐにプロンプトに戻ります。
現在のインストール状況を知りたい場合は以下のコマンドを実行し、そのまましばらく待ちます。
プロンプトへ戻りましたら完了です。

```
docker logs -f gitlab
```

##トラブルシュート
インストール時にぶち当たったトラブルとその回避策を残します。
###ポート番号の重複
もし以下のようなエラーが返ってきた場合は、GitLabインストールコマンドのうち、「--publish 22:22」の部分を「--publish <任意のポート番号>:22」といった形で変更します。
当然のことながら指定するポート番号はウェルノウンポート(0～1023)以外でなおかつ使われていないポート番号を指定します。

```
Error response from daemon: driver failed programming external connectivity on endpoint gitlab-ce (～省略～): Error starting userland proxy: listen tcp 0.0.0.0:22: bind: address already in use.
```

###謎のパーミッション拒否

```docker logs -f gitlab```コマンド実行中に、permission deniedといったメッセージが表示されてプロンプトに戻される場合がありますが、これは***SElinux***の仕業です。
対処方法としてはSElinuxを無効にするか、インストールコマンドの--volumeの値の後ろに以下のように```:Z```を追加します。

```
～中略～
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
～以下略～
```

###インストール失敗によるプロセス名重複

一度エラーでインストールが失敗すると、プロセスが不完全な状態で起動されてしまうので、そのまま再度インストールしようとすると同名プロセスが存在しているといったエラーで弾かれます。
そんな時は以下の流れでゴミプロセスを削除します。

```
docker ps -a #gitlabプロセスが存在している
docker rm -f gitlab
docker ps -a #gitlabプロセスが消えていればOK
```

プロセスの削除完了後、念の為GitLab関連のディレクトリも全て削除しておきます。

```
rm -rf /srv/gitlab/config/
rm -rf /srv/gitlab/data/
rm -rf /srv/gitlab/logs/
```

###インストール処理が無限ループする（原因不明）
こちらは原因不明ですが、同じ処理を延々と繰り返している状態となります。
どこから発生しているか正確にはわかりませんが、以下のlogが起点となりそれ以降延々と繰り返しているように見受けられます。

```
Running handlers:
Running handlers complete
Chef Infra Client finished, 526/1456 resources updated in 04 minutes 21 seconds
Notes:
It seems you haven't specified an initial root password while configuring the GitLab instance.
On your first visit to  your GitLab instance, you will be presented with a screen to set a
password for the default admin account with username `root`.
gitlab Reconfigured!
Checking for an omnibus managed postgresql: OK
Checking if postgresql['version'] is set: OK
Checking if we already upgraded: OK
The latest version 12.5 is already running, nothing to do
==> /var/log/gitlab/sshd/current <==
～以降ループ発生～
```

対処方法としては、まず一度```ctrl + c```で```docker logs -f gitlab```を中断し、続けて以下のコマンドでreconfigureを手動実行します。

```
docker exec -it gitlab gitlab-ctl reconfigure
※「gitlab Reconfigured!」と表示された次の行でプロンプトに戻れば成功
```

GitLabインストール実行時にそのままreconfigureを実行する流れのようですが、どういう訳かそれだとうまく行かないようです。

#GitLabのweb画面にアクセス
インストール完了後、ブラウザにて```http://<サーバーのIPアドレス>```へアクセスします。
rootパスワードの設定画面が表示されれば無事成功です。
![git01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/d188ec23-4972-1b03-d937-33ea1d762312.png)
rootパスワードを設定し、ログイン画面に移行します。
![git02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/f9a70d84-19eb-13e4-3c68-86fcee38d1aa.png)
ログインができて以下の画面が表示されていればGitLabインストールの一連の流れは完了です。
![git03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/88907857-f2f5-b0f0-bacb-859413800406.png)

今回はここまでです。
次回へ続きます。