Dockerでredmine, jenkins, gitlab, nexus3, archiva の開発環境を構築する

# 本稿の目的

* Dockerを開発に新規導入したいが、あまりスキルのないSEが環境構築する際に活用する手順の確立。

# ホスト環境の前提条件

* OS:Ubuntu x64

# Dockerのインストール
フリーのDocker環境としては、Docker CE(Community Edition)とDocker Compose が公開されている。前者はDockerエンジン呼ばれる仮想化やDockerイメージの管理を行うDockerの本体である。後者は複数のDockerイメージを連携して動作させる場合に用いるオプションツールである。

## Docker CE
* [Ubuntuのインストール手順](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#set-up-the-repository)の`Install using the repository`を参考に、Docker CEをインストールする。

## Docker Compose

* docker composeをダウンロードする。

```bash
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```
* 実行権限を付与する。

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

* インストール完了を確認する。

```bash
docker-compose --version
```

# よく使う開発ツールの導入

独断と偏見で、以下の開発ツールを採用した。

* [GitLab](https://hub.docker.com/r/gitlab/gitlab-ce/)
    * 日本語対応：有
* [Redmine](https://hub.docker.com/_/redmine/) 
    * 日本語対応：有
* [Jenkins](https://hub.docker.com/r/jenkinsci/jenkins/)
    * 日本語対応：有
* [Nexus3](https://hub.docker.com/r/sonatype/nexus3/)
    * 日本語対応：無
* [archiva](https://hub.docker.com/r/xetusoss/archiva/)
    * 日本語対応：有

## docker-composeファイル作成

```yaml:docker-compose.yml
version: '3.1'

services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'localhost:80'
    volumes:
      - 'gitlab-etc:/etc/gitlab'
      - 'gitlab-logs:/var/log/gitlab'
      - 'gitlab-data:/var/opt/gitlab'
    ports:
      - '80:80'
      - '10081:10081'
      - '10082:10082'
      - '10443:443'
      - '10022:22'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost:80'
        mattermost_external_url 'http://localhost:10081'
        registry_external_url 'http://localhost:10082'
    links:
      - 'gitlab-runner'
      - 'gitlab-specific-runner'
      - 'nexus'

  gitlab-runner:
    image: 'gitlab/gitlab-runner:latest'
    restart: always
    volumes:
      - 'gitlab-runner-etc:/etc/gitlab-runner'
      - 'gitlab-runner-home:/home/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.soc'

  gitlab-specific-runner:
    image: 'gitlab/gitlab-runner:latest'
    restart: always
    volumes:
      - 'gitlab-specific-runner-etc:/etc/gitlab-runner'
      - 'gitlab-specific-runner-home:/home/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.soc'

  redmine:
    image: 'redmine:latest'
    restart: always
    ports:
      - '23000:3000'
    volumes:
      - 'redmine-files:/usr/src/redmine/files'
    environment:
      REDMINE_DB_POSTGRES: 'redmine-db'
      REDMINE_DB_PASSWORD: 'example'
    links:
      - 'gitlab'

  redmine-db:
    image: 'postgres:latest'
    restart: always
    volumes:
      - 'redmine-db-data:/var/lib/postgresql/data'
    environment:
      MYSQL_ROOT_PASSWORD: 'example'
      MYSQL_DATABASE: 'redmine'

  nexus:
    image: 'sonatype/nexus3:latest'
    restart: always
    ports:
      - '48081:8081'
    volumes:
      - 'nexus-data:/nexus-data'
 
  jenkins:
    image: 'jenkins:latest'
    restart: always
    volumes:
      - 'jenkins-home:/var/jenkins_home'
    ports:
      - '58080:8080'
      - '50000:50000'
    links:
      - 'gitlab'
      - 'nexus'

  archiva:
    image: 'xetusoss/archiva'
    restart: always
    volumes:
      - 'archiva-data:/archiva-data'
    ports:
      - '1080:8080'

volumes:
  gitlab-etc:
  gitlab-logs:
  gitlab-data:
  gitlab-runner-etc:
  gitlab-runner-home:
  gitlab-specific-runner-etc:
  gitlab-specific-runner-home:
  redmine-files:
  redmine-db-data:
  nexus-data:
  jenkins-home:
  archiva-data:
```

## 動作確認
コンソールで以下のコマンドを実行。

```bash:up.sh
docker-compose -f docker-compose.yml up -d
```

ブラウザで以下のリンク先を表示できることを確認する。（JenkinsとNexus3は立ち上がりに若干時間がかかる）

* GitLab
    * GitLab http://localhost/gitlab/
    * Mattermost 
    * GitLab Pages
    * GitLab Resistory
* Redmine http://localhost/redmine/
* Nexus3 http://localhost/nexus/
* Jenkins http://localhost/jenkins/
* archiva http://localhost/archiva/

初期ユーザとパスワードは以下の通り。

| NAME    | USER  |    PASSWORD     |
|:--------|:------|:----------------|
| GitLab  | root  | 初期表示画面で設定 |
| Redmine | admin | admin           |
| Nexus3  | admin | admin123        |
| Jenkins | - | /var/jenkins_home/secrets/initialAdminPassword に記載されたハッシュ値|
| archiva | admin | 初期設定画面で設定 |


Jenkinsのハッシュ値は以下のコマンドでコンテナに入って確認する。

```bash
docker exec -it docker_jenkins_1 bash
```


# volumeの代わりにローカルディレクトリを使う場合
JenkinsとNexus3のDocker Imageだけは事前にホスト側に特定のユーザでディレクトリを作成して置かなければならない。

```bash:jenkins.sh
#!/bin/sh

mkdir -p /srv/jenkins
chown -R 1000 /srv/jenkins
```

```bash:nexus.sh
#!/bin/sh

mkdir -p /srv/nexus/nexus-data
chown -R 200 /srv/nexus/nexus-data
```

# 参考サイトリスト

* [docker-compose コマンドまとめ](https://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f)
* [docker コマンド チートシート](https://qiita.com/voluntas/items/68c1fd04dd3d507d4083)
* [YAML 基本記法まとめ](https://qiita.com/gcfuji/items/5f8e4c5795ce41b214d1)
* [Docker Compose - docker-compose.yml リファレンス](https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa)
* [jenkins README.md](https://github.com/jenkinsci/docker/blob/master/README.md)
* [gitlab README.html](https://docs.gitlab.com/omnibus/docker/README.html) 
* [redmine README](https://hub.docker.com/_/redmine/) 
* [Docker volumeの削除](https://qiita.com/Ikumi/items/b319a12d7e2c9f7b904d)