Kanon関連コンテナをまとめて起動する〜KanonOrchestra

# はじめに

Kanon, Jenkins, MariaDBのコンテナ化ができたので、これらのコンテナをまとめて扱う方法を作ってみました。Kanonの世界なら、「お友達のHud美さん、マリアちゃんと楽団を作ったよ。」ってかんじでしょうか。
docker, docker-composeのセットアップ済で、データの永続化などについてある程度の知識があることを前提にしています。

# 構成

## リポジトリ

リポジトリは https://bitbucket.org/okazakiyuji/kanonorchestra/src/default/ です

## ファイル/フォルダ

ファイルはイメージ化しているので意外に少ないです。

|ファイル/フォルダ名 |内容                             |
|:-----------------|:--------------------------------|
|.env              |proxy設定をコンテナに渡す          |
|create-env.sh     |proxy設定をもとに.envを作る       |
|docker-compose.yml|コンテナを起動するためのファイル   |
|jenkins_home      |jenkinsのプロジェクトとHud美さんなど<br>マウントして使用|

主に変更するファイルのdocker-compose.ymlを見てみましょう。リポジトリの中のものはデータの永続化に必要なVolume関連はすべてコメントにしてあります。次にあげるのはVolumeのコメントを外した例です。

```docker-compose.yml
version: '2'
services:
  db01:
    image: okazakiyuji/mariadb
    volumes:
      - db01-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=kanonrpw
      - TZ="Asia/Tokyo"
    restart: always
  kanon01:
    image: okazakiyuji/kanoncontainer:v0.2b1
    hostname: kanon01
    volumes:
      - kanon01-opt:/opt/kanon
      - kanon01-etc:/etc/opt/kanon
      - kanon01-var:/var/opt/kanon
      - kanon01-auth:/etc/opt/auth
    environment:
      - MYSQL_HOST=db01
      - MYSQL_PORT=3306
      - MYSQL_USER=root
      - MYSQL_USER_PASSWORD=kanonrpw
      - KANON_HOST=kanon01
    env_file: .env
    ports:
      - "8001:80"
    links:
      - db01
    restart: always
  jenkins:
    image: okazakiyuji/jenkins
    links:
      - kanon01
    hostname: jenkins
    env_file: .env
    ports:
      - "8088:8080"
    volumes:
      - ./jenkins_home:/var/jenkins_home:rw
    restart: always
volumes:
  db01-data:
    driver: local
  kanon01-opt:
    driver: local
  kanon01-var:
    driver: local
  kanon01-etc:
    driver: local
  kanon01-auth:
    driver: local
```
サービスをコピーしてポートなどぶつからないようにしていただければ複数のサービスを起動することも可能です。


## コンテナ（サービス）

|サービス名         |内容                             |
|:-----------------|:--------------------------------|
|db01         |MariaDB TracプロジェクトのDB用       |
|Kanon01         |Apache+Trac+SVN/HG/Git             |
|Jenkins         |ほぼJenkinsの標準コンテナです       |

# 使い方

 * まずはリポジトリからファイルを取得します

```hg clone https://okazakiyuji@bitbucket.org/okazakiyuji/kanonorchestra```

 * proxyが必要な環境ではcreate-env.shを実行し.envファイルを作成します
 * docker-compose.ymlを編集します
 * コンテナを起動します

```
docker-compose up -d
```
 * サンプルプロジェクトを作成します

```
docker-compose exec kanon01 /tmp/create-sample-project.sh
```
 * プロジェクトを作成します
 次のコマンドを実行して質問に答えていってください

```
docker-compose exec kanon01 /opt/kanon/bin/kanon-create-project プロジェクト名
```
 * ブラウザでサーバ:ポート8001に接続しTracが動いていることを確認してください
<img width="724" alt="trac.png" src="https://qiita-image-store.s3.amazonaws.com/0/223941/6ff9d6b3-263c-1ec6-1b7e-a2bdd17b33bd.png">


 * ブラウザでサーバ:ポート8088に接続しJenkinsが動いていることを確認してください
<img width="846" alt="jenkins.png" src="https://qiita-image-store.s3.amazonaws.com/0/223941/91d159fa-db9b-eae6-590d-5e0e4c90aa8d.png">


# 複数プロジェクト
Kanonは標準で複数プロジェクトに対応していますが、隣のプロジェクトがインストールしたプラグインや登録ユーザの影響を受けないようにするために１仮想マシンに数プロジェクトに抑える運用することが多いと思います。今回はコンテナになっているので、docker-composeファイルのkanon01コンテナをコピーして02,03と増やすだけで済みます。次にKanon2コンテナ構成のdocker-compose.ymlがいるを挙げています。これを参考にしてください。

```docker-compose.yml
version: '2'
services:
  db01:
    image: okazakiyuji/mariadb
    volumes:
      - db01-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=kanonrpw
      - TZ="Asia/Tokyo"
    restart: always
  kanon01:
    image: okazakiyuji/kanoncontainer:v0.2b2
    hostname: kanon01
    volumes:
      - kanon01-opt:/opt/kanon
      - kanon01-etc:/etc/opt/kanon
      - kanon01-var:/var/opt/kanon
      - kanon01-auth:/etc/opt/auth
    environment:
      - MYSQL_HOST=db01
      - MYSQL_PORT=3306
      - MYSQL_USER=root
      - MYSQL_USER_PASSWORD=kanonrpw
      - KANON_HOST=kanon01
    env_file: .env
    ports:
      - "8001:80"
    links:
      - db01
    restart: always
  kanon02:
    image: okazakiyuji/kanoncontainer:v0.2b2
    hostname: kanon02
    volumes:
      - kanon02-opt:/opt/kanon
      - kanon02-etc:/etc/opt/kanon
      - kanon02-var:/var/opt/kanon
      - kanon02-auth:/etc/opt/auth
    environment:
      - MYSQL_HOST=db01
      - MYSQL_PORT=3306
      - MYSQL_USER=root
      - MYSQL_USER_PASSWORD=kanonrpw
      - KANON_HOST=kanon01
    env_file: .env
    ports:
      - "8002:80"
    links:
      - db01
    restart: always
  jenkins:
    image: okazakiyuji/jenkins
    links:
      - kanon01
    hostname: jenkins
    env_file: .env
    ports:
      - "8088:8080"
    volumes:
      - ./jenkins_home:/var/jenkins_home:rw
    restart: always
volumes:
  db01-data:
    driver: local
  kanon01-opt:
    driver: local
  kanon01-var:
    driver: local
  kanon01-etc:
    driver: local
  kanon01-auth:
    driver: local
  kanon02-opt:
    driver: local
  kanon02-var:
    driver: local
  kanon02-etc:
    driver: local
  kanon02-auth:
    driver: local
```

# これから
とりあえずは、マウントしているボリュームをバックアップしておけば大丈夫ですが、私がやっている方法をもう少し使えないか検討中です。