Docker ComposeでRocket.Chatを立ち上げる


前の記事
[CentOS7にDockerとDocker Composeをインストールする](http://qiita.com/salmonosushi/items/63e0fddc98f9fa7b6673)
に、Rocket.Chatを立ち上げました。

構築手順は以下のサイトのサイトを参考にしています。
[Rocket.Chat Docs](https://rocket.chat/docs/installation/docker-containers/docker-compose)
[Docker Composeを使ったRocketChatのインストールと基本的な使い方](http://www.atmarkit.co.jp/ait/articles/1609/29/news019.html)


補足で、自分が分からなかったところの説明を付け加えています。

#事前準備
* DockerとDocker Composeのインストール(前の記事参照)
* VirtualBoxのポートフォワード設定(今回は3000：3000に設定）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/6fa40b1f-efa7-00d9-0b4f-cc5688cdc518.png)


#各コンテナイメージを取得する

* MongoDBのイメージを取得

```
docker pull mongo
```

* Rocket.Chatのイメージを取得

```
docker pull rocketchat/rocket.chat
```


# Docker Composeファイルの作成

* MongoDBのデータをホスト側にマウントするためのディレクトリを作成

```
mkdir -p /var/www/rocket.chat/data/runtime/db
mkdir -p /var/www/rocket.chat/data/dump
```

* Docker Composeファイルを作成

```
vi /var/www/rocket.chat/docker-compose.yml
```



```docker-compose.yml

version: '2'

services:
  rocketchat:
    image: rocketchat/rocket.chat:latest
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    depends_on:
      - mongo
    ports:
      - 3000:3000

  mongo:
    image: mongo:latest
    restart: unless-stopped
    volumes:
     - ./data/db:/data/db
     - ./data/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0

  mongo-init-replica:
    image: mongo:latest
    command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
    depends_on:
      - mongo
      
```

私はローカルに立てたので、
今回はymlファイルにROOT_URLは設定しておらず、<http://localhost:3000>　になっています。
環境に応じてIPを変更する必要があります

# Rocket.Chatの起動

```
cd /var/www/rocket.chat/
docker-compose up -d
```


そして、
http://localhost:3000/
に接続すると、Rocket.Chatが表示されました。

![news019_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/185546/71fd7c5a-1902-bf06-254f-b675d97a68c1.jpeg)


#補足
## docker-compose.ymlの書き方
### バージョンについて  
参考：[Compose ファイル・リファレンス](http://docs.docker.jp/compose/compose-file.html#compose-file-versioning)
バージョン1とバージョン2(推奨)があります。

* バージョン1
 composeファイルでバージョンを指定しないとき、バージョン1として認識される。今後廃止予定。  

* バージョン2
 冒頭でバージョンを指定する必要がある。services キーの下で全てのサービスを定義する。バージョン２のファイルは Compose 1.6.0 以上 でサポートされており、実行には Docker Engine 1.10.0 以上 が必要。

```
version: '2'
services:
  サービス名1: 
　　build: .
   
  サービス名2:
    image: 
```

※ バージョン3もありそうだけど、今回は保留
参考：[Compose file version 3 reference](https://docs.docker.com/compose/compose-file/)

###depends_on
composeファイルは初めて書いたけど、基本的にdockerコマンドを叩くときのオプションとあまり変わらないんだなあという認識です。今回使ったものの中で、初めて見たdepends_onについてのみ調べました。
参考：[Compose ファイル・リファレンス](http://docs.docker.jp/compose/compose-file.html#depends-on)

* depends_on  
 サービスの依存関係を指定。この依存関係に従ってサービスの起動の順番が決まる。上のcomposeファイルを例に挙げると、docker-compse upを実行した場合、rocketchatとmongo-init-replicaはmongoに依存しているので、立ち上がる順番は①mongo→②rocketchat、mongo-init-replica。  
docker-compose up rocketchatとサービス名を指定して実行しても、依存関係があるので、mongoが立ち上がってからrocketchatが立ち上がる。

linkが高度になったものがdepends_onなのか？と思ったけれど、バージョン2ではそもそもlink機能は不要なものになっているよう。
参考：[docker-compose depends_onとlinksの違い](http://qiita.com/sivertigo/items/9baa73d922a68788402b)

##docker-composeコマンド
###docker-composeコマンド一覧（今回使ったやつだけ）


|    コマンド    |   説明     |     
|:----------|---------------|:------------------------|
| up  | ymlに定義されているサービスをすべて立ち上げる        | 
| run  (サービス名) | 指定されたサービスのみ立ち上げる       |
| down     | ymlに定義されているサービスをすべて削除する |
| stop     | サービスをすべて停止する   | 
| start     | サービスをすべて開始する   | 
| ps     | コンテナの起動状態を確認する   | 


###up,run,startの違い
参考：[よくある質問と回答](http://docs.docker.jp/compose/faq.html#up-run-start)

* up  
一般的にはupを使う。upだと、composeファイルで定義されたすべてのサービスを起動させることができる。作成済みでないコンテナにも使える。
* run  
指定されたサービスひとつだけ起動させる。だからrunの後ろにはサービス名が必要。
* start  
すでに作成済みのコンテナのみに適用される。止まっているコンテナを開始するだけで、新しく作ることができない。  

#感想
* ファイルさえ書けたら、あっというまにRocketChatが立ち上がったので、とても便利でした。
* VirtualBoxの中でdockerを使ったら、ポートフォワードを2回しなければならないことに気づかず、そこで少し躓きました。