Docker ComposeでGitLabを起動

# Docker Composeとは
- Dockerコンテナの設定をyamlファイルで定義し、構築・管理が行えるツール
    - `docker container run`コマンドのオプションなどをファイルで定義するイメージ
- 複数個のコンテナを扱える

## メリット
- 設定をコードで管理できる(IaC)
- 複数個のコンテナを扱う場合は
    - runコマンドを何回も打たなくて済む
    - コンテナ同士の依存関係をファイルで定義できる

# 実行環境
- OS
    - Amazon Linux 2
- 前提
    - Docker 18.06.1-ceがインストール済み

# インストール
- Dockerエンジンのパッケージには含まれていないので別途インストールが必要
- Docker for Windows/Macには含まれている
- 公式ドキュメントに沿って実行
    - https://docs.docker.com/compose/install/

## 手順
- 資源をダウンロード

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

- 実行権限を付与

```
$ sudo chmod +x /usr/local/bin/docker-compose
```

- バージョンが表示されれば成功

```
$ docker-compose version
docker-compose version 1.24.1, build 4667896b
docker-py version: 3.7.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j  20 Nov 2018
```

# 実行

## yamlファイル
- 今回は例としてGitLabのコンテナを動かす

```docker-compose.yaml
version: '3.7'
services:
  gitLab:
    image: gitlab/gitlab-ce:latest
    ports:
     - "80:80"
    volumes:
     - '/srv/gitlab/config:/etc/gitlab'
     - '/srv/gitlab/logs:/var/log/gitlab'
     - '/srv/gitlab/data:/var/opt/gitlab'
```
- version
    - Docker 18.06では3.7に対応
    - Docker Engineのバージョンに依存するので注意
        - https://docs.docker.com/compose/compose-file/
- servicesの配下に適当な名前を付与し、その配下に設定を記述する
- image
    - 起動させるDockerイメージ
- ports
    - ホスト側とコンテナ側で何番のポートをフォワーディングするかを指定
    - pオプションに該当
- volumes
    - コンテナからマウントするホストのパスを指定
    - vオプションに該当

- 上記の設定は`docker container run`コマンドの場合は次のコマンドに該当する

```
$ docker container run gitlab/gitlab-ce:latest -p 80:80 -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab
```

## 実行
- `docker-compose up`のコマンドで実行可能

```
$ docker-compose -f ./docker-compose.yaml up -d
```

- f オプションでyamlファイルを指定できるが、カレントパスにdocker-compose.yaml(yml)という名前のファイルがあれば省略可能
    - カレントパス以外のパスにあるファイルや、他の名前が付いているファイルを指定する場合は必須
    - これ以外のdocker-composeコマンドでもファイルを参照するので、基本的にカレントディレクトリにファイルがある状態で操作するべき
- d オプションでコンテナをデタッチモード(バックグラウンドでの実行)で起動される
- 以下のコマンドで起動が確認できる

```
$ docker-compose  ps
         Name                       Command                       State                          Ports
---------------------------------------------------------------------------------------------------------------------
gitlab_gitLab_1          /assets/wrapper                  Up (health: starting)   22/tcp, 443/tcp, 0.0.0.0:80->80/tcp
```

### 名前に関して
- [プロジェクト名] _ [サービス名] _ [採番された番号]で命名される
    - プロジェクト名
        - 環境変数「COMPOSE_PROJECT_NAME」に指定されている値
        - 設定されていない場合はyamlファイルが配置されているフォルダ名が設定される
    - サービス名
        - docker-compose.yamlのservicesで指定した名前
    - 採番された番号
        - スケールする場合にコンテナ毎に採番される
        - スケールしていない場合は1が付与される
- 参考
    - http://docs.docker.jp/compose/reference/envvars.html#compose-project-name

## 停止
- 以下のコマンドで停止できる

```
$ docker-compose stop
Stopping gitlab_gitLab_1        ... done
```

# 実行(複数コンテナ)
## yamlファイル
- GitLabのCIツールであるGitLab Runnerを同時に構築する

```docker-compose.yaml
version: '3.7'
services:
  gitLab:
    image: gitlab/gitlab-ce:latest
    ports:
     - "80:80"
    volumes:
     - '/srv/gitlab/config:/etc/gitlab'
     - '/srv/gitlab/logs:/var/log/gitlab'
     - '/srv/gitlab/data:/var/opt/gitlab'
  gitLab-runner:
    image: gitlab/gitlab-runner:latest
    volumes:
     - '/srv/gitlab-runner/config:/etc/gitlab-runner'
     - '/var/run/docker.sock:/var/run/docker.sock'
    networks:
     mynet:
      ipv4_address: 172.20.0.3
    depends_on:
      - gitLab
```

- 同じようにservicesを定義すればよい
- 今回はgitLab-runnerという名前で追記
- depends_onを記載することでコンテナ間の依存関係を定義できる
    - GitLabが起動した後にRunnerを起動させたいので、Runnerのdepends_onにGitLabのサービス名を指定しておく

## 実行
- 先ほどと同様に起動する

```
$docker-compose -f ./docker-compose.yaml up -d
Starting gitlab_gitLab_1 ... done
Starting gitlab_gitLab-runner_1 ... done
```