proxy環境下でDocker Composeを用いてCentOS7上にGitLab Dockerを作成

# はじめに
どうも！生産技術部のエンジニアです。弊社ではエクセルで作った台帳を用いた、ナウいプログラムの管理を行っています。
最近までは、これで問題なく運用出来ていましたが、人手が介在する事による品質トラブルが重なり、この度、システマチックに管理する事となりましたｗ
社内で発生する品質トラブルに立ち向かうため、Gitサーバを立ち上げましたので作業手順をここに残します。

（電気メカ系の生技にとって、GitとかLinuxとかオーパーツ。。。）


GitLab関連の投稿済み内容

* [Docker Composeを用いてCentOS7上でGitLab Runner Dockerを作成](https://qiita.com/TomoyukiSugiyama/items/b17800d4e142e3dc549b)
* [GitLab Mattermostの導入 - SSO設定、"webhook is blocked"対応](https://qiita.com/TomoyukiSugiyama/items/0d828ee2325095a7f247)
* [GitLab CIでGitのブランチを自動生成](https://qiita.com/TomoyukiSugiyama/items/b850945955ab530660ed)
* [生産技術部のGit開発環境はこれだ！(オンプレミス環境/Gitブランチモデル)](https://qiita.com/TomoyukiSugiyama/items/f9d1f5bcc0a0a35de903)
* [Git タグを自動更新 〜マージされるトピックブランチ毎に更新ルールを変える〜](https://qiita.com/TomoyukiSugiyama/items/a921a5ba12180b10f6ce)
* [Dockerで立ち上げたGitLabの定期バックアップ方法](https://qiita.com/TomoyukiSugiyama/items/e9da7c873654cb86a14d)
* [Dockerで立ち上げたGitLab MattermostでMattermost CLIを利用する](https://qiita.com/TomoyukiSugiyama/items/4eb2b5af46393b85abde)
* [mattermostでBOTから複数のチームに通知を一斉送信する](https://qiita.com/TomoyukiSugiyama/items/3b194814d9cc218c5f1f)

# 環境
* CentOS : 7.6.1810
* Docker-CE : 19.03.1
* Docker Compose : 1.25.0
* GitLab-CE Docker: 12.2.0-ce.0


# 各種プロキシ設定
プロキシ環境下で外部にアクセスする場合、各コマンド毎にプロキシ設定が必要になる。
gitlabをインストールするまでに、yum、curl、dockerを利用するため、各々のプロキシ設定を行う。

* OS全体にプロキシを適用

```vim:/etc/profile
PROXY='proxy.example.com:8888' # proxyサーバのドメインとポートを指定
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
export https_proxy=$PROXY
export HTTPS_PROXY=$PROXY
```
ファイルを保存し以下を実行して設定を反映

```bash:
$ source /etc/profile
```
* yumのプロキシ設定

```vim:/etc/yum.conf
proxy=http://proxy.example.com:8888
```
* curlのプロキシ設定

```~/.curlrc
proxy = http://proxy.example.com:8888
```
* dockerのプロキシ設定

[Docker公式のプロキシ設定マニュアル][link-dockerproxy]に従い設定する。

```bash:
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ vim /etc/systemd/system/docker.service.d/http-proxy.conf
```
`http-proxy.conf`を編集する。

```vim:http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8888" "NO_PROXY=localhost"
```

設定を再読み込み

```bash:
$ systemctl daemon-reload
```
[link-dockerproxy]:https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

# Firewallの設定
gitlabを外部に公開するために、Firewallの設定を行う。CentOS7におけるファイアウォールの設定コマンド一覧は、[ここ][link-1]を参照する。http,ssh等の80、22番ポートを使用するサービスが起動中の場合は、gitlabで利用するポートを80から4080番ポート、22から4022番ポートに変更する。もしくは、サービスを停止する。今回は、２２番のみポートの変更を行います。

|項目   |値   |概要 |
|---|---|---|
|gitlab:ports|80:80|外部に公開するポート番号|
|gitlab:ports|4022:22|外部に公開するポート番号|

変更にあたり、利用するポートのファイアウォールを設定する。

```bash:
$ firewall-cmd --add-port=80/tcp --zone=public --permanent
$ firewall-cmd --add-port=4022/tcp --zone=public --permanent
$ firewall-cmd --reload
success
```


[link-1]:https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e

# Dockerのインストール
[Docker公式のマニュアル][link-docker]に従ってインストールする。
古いバージョンのDockerがインストールされている場合は削除する。

```bash:
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
```
* 必要なパッケージのインストール

```bash:
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```
* レポジトリの追加

```bash:
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
* Dockerのインストール

```bash:
$ sudo yum install docker-ce docker-ce-cli containerd.io
```
GPG keyを許可するように求められたら、以下と一致する事を確認し許可する。
`060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35`

* Dockerの起動

```bash:
$ sudo systemctl start docker
```
サーバ起動時に、自動的にDocker Engineも起動したい場合は、こちらのコマンドも実行

```bash:
$ systemctl enable docker
```

Docker Composeの最新版をインストールする。最新版は[ここ][link-docernew]を参照する。

```bash:
# Docker Composeの最新版をダウンロードする
# `1.25.0` の値はバージョンに応じて変更する
$ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

# GitLabのインストール・起動

[GitLab公式のマニュアル][link-gitlabdocker]をベースに`docker-compose.yml`を作成する。`docker-compose.yml`とは、Dockerコンテナの起動オプションを記載したファイルです。
公式からの変更点を以下に示します。

|項目   |値   |概要 |
|---|---|---|
|gitlab:ports|80:80|外部に公開するポート番号|
|gitlab:ports|4022:22|外部に公開するポート番号|

`docker-compose.yml`は以下の様に記載する。

```docker-compose.yml
web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://gitlab.example.com'
      gitlab_rails['gitlab_shell_ssh_port'] = 4022
      # Add any other gitlab.rb configuration here, each on its own line
  ports:
    - '80:80'
    - '443:443'
    - '4022:22'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'
```

`docker-compose.yml`のあるディレクトリで実行し、構築完了

```bash:
# Dockerの起動およびリロード
$ docker-compose up -d
# Dockerの停止
$ docker-compose down
```

[link-docker]:https://docs.docker.com/install/linux/docker-ce/centos/
[link-docernew]:https://github.com/docker/compose/releases
[link-gitlabdocker]:https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose

# ログの確認
GitLabが正常に立ち上がっている事を確認するため、起動中のDockerコンテナのログを表示する。
GitLabが立ち上がるまでに5分程度かかります。

* 現在起動中のコンテナの一覧を表示

```bash:
$ docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED              STATUS                                 PORTS                                                            NAMES
xxxxxxxxxxxx        gitlab/gitlab-ce:latest   "/assets/wrapper"   About a minute ago   Up About a minute (health: starting)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4022->22/tcp   gitlab_web_1
```
* ログの確認

```bash:
# リアルタイムで表示
$ docker logs -f gitlab_web_1
# タイムスタンプを追加して表示
$ docker logs -t gitlab_web_1
```

立ち上がった後、ローカルから`http://localhost`または、外部から`http://gitlab.example.com`にアクセスしログインページが表示されることを確認する。

#GitLabの設定（オプション）
`docker-compose.yml`にGitLabの設定を追加することも出来ますが、`gitrab.rb`の設定を反映したい場合の方法を説明します。`gitrab.rb`とは、GitLabの各種設定を記載したファイルです。まず、Docker ComposeでGitLabのコンテナを作成した場合、GitLabのコマンドは以下の様に実行する必要があります。

```bash:
# 通常のgitlab-ctlコマンド
$ gitlab-ctl [command and options...]
↓
# dockerを使った場合のgitlab-ctlコマンド
$ docker exec -it gitlab_web_1 gitlab-ctl [command and options...]
```

`gitrab.rb`に追加したい設定を記入し、設定を反映する。

```bash:
$ docker exec -it gitlab_web_1 gitlab-ctl reconfigure
```

# 最後に
知識が足りない部分は先人の力を借りて、無事に立ち上げる事ができました。間違っている内容があれば連絡ください！
今回は、GitLabの立上げまでを取り上げましたが、GitLabから社内メールサーバへ通知メールを送る設定やGitLabに同封されたチャットアプリ(Mattermost)との連携を行いました。また、GitLab Runnnerの導入も実施予定となっています。そして、一番重要な生産技術の業務フローにあったGitの運用手順についても検討しています。

うまく運用出来ましたら、記事にしたいと思います。

# ご参考

* [Custom Docker daemon options](https://docs.docker.com/config/daemon/systemd/#httphttps-proxy)
* [Get Docker Engine - Community for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/)
* [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose)
* [Install GitLab using docker-compose](https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose)
* [CentOSのCUIでProxyを使う方法いろいろ](https://qiita.com/hirohiro77/items/cdf6d8baa619c0e0e82d)
* [CentOS 7 firewalld よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)
* [Docker調査　~ログ編~](https://qiita.com/HommaHomma/items/f943fa3397bc3f386057)