Etherpad-liteをVPSにdocker入れてcentos:6コンテナにインストールしてみた

# 背景
* すでに運用中のVPSがあります。石狩あたりで動いています。そこでは、Etherpad-lite、MySQLをはじめとして、いろんなアプリケーションが動いています。
* 今回は、そこにポート番号を変えてあらたなEtherpad-liteをもう1つ動かします。既存の環境への影響を最小限ににするためにdockerを使います。
* Ethepad-liteのバックエンドのDBは、ホスト(ここではVPSのこと)で動いているMySQLが使えればいいのですが、ホストのMySQLはバージョンが5.1とちょっと古く、最新のEtherpad-liteとは合いません。そこで、MySQLもあらたにdockerで導入します。
* Etherpad-liteのログはホスト側のログディレクトリに吐き出します。
* Etherpad-lite導入がメインテーマなので、dockerはインストール済み(yum install docker-io)、centos:6のイメージは取得済みの状態から始めます。
* バージョンは次の通りです。
 * Etherpad-lite 1.5.7
 * CentOS6.7(←VPS)
 * MySQL5.7(←dockerイメージ)

# 大まかな流れ
次の通りです。
* ホスト側で公開用ポートを開けます(順番的には後でもいいです)。
* MySQLのコンテナを起動して、データベースを作成します。
* centos:6のコンテナを起動して、Etherpad-liteをインストールします。
* Etherpad-liteが動くことを確認したら、いったんcentos:6のコンテナからexitして、コンテナをイメージ化します。このイメージから再度コンテナを起動します。

# 具体的な手順
TIPS: 作業中にsshが切れてもすぐに戻れるように、実際は`screen`してから下記の手順を実行します。

## ホスト側で公開用ポートを開ける
現在のiptablesを表示します。

```cl
$ sudo iptables -L --line-numbers
```

公開用ポートを開けます。ホストの9001で既存のEtherpad-liteが動いているので、新たなehterpad-liteのインスタンスは19001で動かします。ルールを挿入する位置(下記の例では8)、環境に合わせて変わります。

```cl
$ sudo iptables -I Firewall 8 -p tcp --dport 19001 -m state --state NEW -j ACCEPT
```

iptablesを保存します。

```cl
$ sudo su -
# cd /etc/sysconfig
# iptables-save > iptables
# service iptables restart
# exit
```

## MySQLのコンテナを起動する
ホストでは既に3306で古いMySQLが動いているので、ホストの13306をコンテナの3306に割り当てます。

```cl
$ sudo docker pull mysql:5.7
$ sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=rt_password -d -p 13306:3306 mysql:5.7
```

## データベースを作成する
ホストからコンテナのMySQLに接続してデータベースを作成します。

```cl
$ mysql -u root -p -h 127.0.0.1 -P 13306
mysql> create database `etherpad-lite`;
mysql> grant all privileges on `etherpad-lite`.* to 'etherpad'@'%' identified by 'ep_password';
mysql> exit
```

## Etherpad-lite用のコンテナを起動する
イメージは下記の通り取得済みです。

```cl
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              6                   3bbbf0aca359        3 months ago        190.6 MB
```

ホスト側のログのディレクトリ(下記の例では`/var/log/etherpad-lite`)は、無ければ先に作ります。そして、コンテナを起動します。

```cl
$ sudo docker run -i -t --name="etherpad-lite" --net="host" -v /var/log/etherpad-lite:/log centos:6 /bin/bash
```

## インストールする
コンテナの中にいる状態で作業します。
node.js

```cl
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install nodejs npm --enablerepo=epel
```

abiword

```cl
# rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm
# yum install abiword --enablerepo=nux-dextop
```

TIPS: この辺で疲れてくるので、いったん`ctrl-A D`で`screen`をデタッチして休憩します。再開は`screen -r`(sshが切れてアタッチされたままの場合は場合は`screen -dr <PID>`)です。

git

```cl
# yum install git
```

etherpad-lite

```cl
# git clone git://github.com/ether/etherpad-lite.git
```

## 設定ファイルの編集
引き続きコンテナの中で設定ファイルを編集します。

```cl
# cd etherpad-lite
# cp settings.json.template settings.json
# vi settings.json
```

ポート番号の変更、DBの変更、abiwordのpathの登録、管理者パスワードの設定、ログの設定などを行います。編集したところだけ抜粋すると下記の通りです。

```cl
  //IP and port which etherpad should bind at
  "ip": "0.0.0.0",
  "port" : 19001,

  /* "dbType" : "dirty",
  //the database specific settings
  "dbSettings" : {
                   "filename" : "var/dirty.db"
                 },
  */

  // MySQL Configuration
   "dbType" : "mysql",
   "dbSettings" : {
                    "user"    : "etherpad",
                    "host"    : "127.0.0.1",
                    "port"    : "13306",
                    "password": "ep_password",
                    "database": "etherpad-lite"
                  },


  "abiword" : "/usr/bin/abiword",
  
  "users": {
    "admin": {
      "password": "changeme1",
      "is_admin": true
    }
  },

  "logconfig" :
    { "appenders": [
      { "type": "file",
        "filename": "/log/etherpad-lite.log",
        "maxLogSize": "10240",
        "backups": 3
      }
      ]
    }


```

Etherpad-liteの依存関係の解決を行います。

```cl
# ./bin/installDeps.sh
```

いろいろメッセージが出ますが、気にせず次に進みます。
Etherpad-liteを起動します。

```cl
# ./bin/run.sh --root
```

下記のURLを開いて動作確認します(もちろんホスト名は環境に合わせて変わります)。
http://your.etherpad-lite.host:19001/

正常に動くことを確認できたら、コンテナからいったん抜けます。

```cl
# exit
```

## イメージを作成して再起動
上で作業したコンテナを確認します。

```cl
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS                     NAMES
39239a97120c        centos:6            "/bin/bash"            59 minutes ago      Exited (0) 2 minutes ago                             etherpad-lite
4be8ad0ec49a        mysql:5.7           "/entrypoint.sh mysq   About an hour ago   Up About an hour           0.0.0.0:13306->3306/tcp   mysql
```

コンテナからイメージを作ります。時間がかかります。

```cl
$ sudo docker commit 39239a97120c etherpad-lite:centos6
fea7c19bb5c61576476dd7e36bca1a1b51a1b9bf4cf4a6a928b1f4ce937f7ffd
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
etherpad-lite       centos6             fea7c19bb5c6        4 minutes ago       773.3 MB
mysql               5.7                 596847483ae2        2 days ago          360.2 MB
centos              6                   3bbbf0aca359        3 months ago        190.6 MB
```

元のコンテナは削除し、先ほど作ったイメージからあらたなコンテナを起動します。今度はコンテナはデタッチ状態で起動し、dockerからEtherpad-liteを起動します。

```cl
$ sudo docker rm 39239a97120c
39239a97120c
$ sudo docker run -d --name="etherpad-lite" --net="host" -v /var/log/etherpad-lite:/log etherpad-lite:centos6 /etherpad-lite/bin/run.sh --root
```

下記のURLを開いて再度動作確認します。ログも出ているか見ておきましょう。
http://your.etherpad-lite.host:19001/
正常に動いていれば完了です。