CentOS + Erlang + Elixir + PhoenixのDockerイメージで今日から始めるElixir on Phoenix入門

## 何これ？
皆さん、おはこんばんちは。

４月になりましたね。
新しく何かを始めるには良い季節です。

ということで、やろうやろうと思っていたであろう[Elixir](http://elixir-lang.org/)/[Phoenix](phoenixframework.org)、そろそろ始めまちゃいましょう。
![elixir-logo.png](https://qiita-image-store.s3.amazonaws.com/0/20725/c2635f1c-aae2-252d-6644-faa55a744253.png)


![phoenixframework-logo.png](https://qiita-image-store.s3.amazonaws.com/0/20725/06ed9435-5dfe-6bc6-4dc3-af0ea182a323.png)

という記事になります、ご確認下さい。

## 息を吸うようにDockerで入門しちゃいましょう
楽です。そして、速い。
四の五の言わずにまずはdocker run。

やり方はDockerのイメージプロジェクト作ったんで、そのreadme見てください。

https://github.com/xtity/docker-centos7-elixir-phoenix

先程DockerHubにも登録したので、上記のRequirementにあるboot2dockerが起動している人は下記を実行するとPhoenixまで立ち上がります（まだインストールしてない人は、Requirementの通りにインストールしましょう）

``` bash
docker run -d -p 80:4000 --name phoenix -t xtity/docker-centos7-elixir-phoenix
```

で、``` boot2docker ip ``` を叩いて出たIPにアクセスすると下記の画面が出るはずです。

![phoenix-home.png](https://qiita-image-store.s3.amazonaws.com/0/20725/49cdaa88-b66a-a5ce-3d03-03df8342ff7c.png)

ね、簡単でしょ。

## 内容物（Dockerfile）
* CentOS 7系
    * en_US.UTF-8
        * 日本語も指定可
            * コメントアウト
                * ``` ENV LANG en_US.UTF-8 ```
                * ``` ENV LANGUAGE en_US:en ```
                * ``` ENV LC_ALL en_US.UTF-8 ```
            * アンコメント
                * ``` #ENV LANG ja_JP.UTF-8 ```
                * ``` #ENV LANGUAGE ja_JP:ja ```
                * ``` #ENV LC_ALL ja_JP.UTF-8 ```
* Erlang/OTP 17系
* elixir 1.0.3
    * 下記の値で変更可
        * ``` ENV ELIXIR_VERSION 1.0.3 ```
* Phoenix 最新
    * プロジェクト名：sample
        * 下記の値で変更可
            * ``` ENV PHOENIX_APP_NAME sample ```
    * ポート：4000
        * 下記の値で変更可
            * ``` ENV PHOENIX_APP_PORT 4000 ```
            * ``` docker run -p ``` のポートも忘れずに変更
    * MIX_ENV：prod
        * devも指定可
            * コメントアウト
                * ``` RUN yes | mix local.hex && yes | mix local.rebar && mix do deps.get && MIX_ENV=prod mix compile.protocols ``` 
                * ``` CMD ["/bin/bash", "-c", "MIX_ENV=prod PORT=${PHOENIX_APP_PORT} elixir -pa _build/prod/consolidated -S mix phoenix.server"] ```
            * アンコメント
                * #RUN yes | mix local.hex && yes | mix local.rebar && mix do deps.get, compile
                * #CMD ["/bin/bash", "-c", "mix phoenix.server"]

## せっかくなんでベンチもとってみようず
[この本](http://www.amazon.com/Elixir-Cookbook-Paulo-A-Pereira/dp/1784397512)読んで書いてあっただけなんですが、[wrk](https://github.com/wg/wrk)でベンチでも取ってみましょう。

``` bash
wrk -c15 -t15 -d60s http://(boot2docker ipで出たIP)/
```

とりま、１５スレで１分。
手元の１０万後半MBPだとこんなん出ました。

ちな、Elixir Cookbookそこそこオススメです。Mac版Kindleで検索して使ったりすると捗ります。

``` bash
Running 1m test @ http://192.168.59.103/
  15 threads and 15 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    13.08ms   10.04ms  96.39ms   77.90%
    Req/Sec    87.84     32.20   333.00     69.75%
  78536 requests in 1.00m, 158.41MB read
Requests/sec:   1308.79
Transfer/sec:      2.64MB
```

手元のコンテナに立ってるヤツなのに、秒間1300以上捌けてますね。
Elixir/Phoenix、恐ろしい子...

因みに一杯ログ出ちゃいますが、``` docker logs phoenix ``` すると楽しいです。
数百μsで返ってきてたりするのが見れたりします。

**ようこそ、マイクロ秒の世界へ**


## その後の入門
上記の公式を見ろ、以上！だと流石にマッチョ過ぎるので、下記のような日本語のドキュメントも見ながら、``` docker exec -it phoenix bash ``` した後色々ソースを弄ってはコンパイル、弄ってはコンパイルとかがわりと速習な気がしたり、しなかったり。

* Elixir
    * https://github.com/niku/elixir-lang.github.com/tree/translate-into-japanese/getting_started
* Phoenix
    * http://qiita.com/niku/items/b54fdc9ca3c027f95fc7

勿論Dockerでiexもインスコ済みなので、コンテナの中で大抵の事は出来るでしょう。


## 次回予告
入門した後必要なのは、そう``` deploy ```と、``` CI ```ですね？（多分

deploy方法は、``` mix release ```を使います。

この前投げた[拙プルリク](https://github.com/phoenixframework/phoenix/pull/730)も無事マージされたようなので、
今なら最新のphoenixをcloneしてくれば、``` mix release ```でビルドできるはずですb

CIは、せっかくDockerで入門したのだから（？）、[drone.io](https://drone.io/)でやってみようかなとぼんやり思ってます。

## 終わりに
Elixir、Phoenix熱いですね。

こんなつぶやきもあるくらいです。

<blockquote class="twitter-tweet" lang="ja"><p>読んだ。何故Ruby on Rails, Scala on Playから離れるのか。それは時間という価値あるもののためだし、コミュニティの毎日のハードワークの有無のためだと。Web開発における次の１０年のパラダイムか。熱いわ QT <a href="https://t.co/4KHEa0j951">https://t.co/4KHEa0j951</a></p>&mdash; kousuke_sima (@kousuke_sima) <a href="https://twitter.com/kousuke_sima/status/572048276096077824">2015, 3月 1</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

誰なんでしょうか、熱いですね。

Elixirは最近v1.0.3が出て、Phoenixもv0.10.0が出ました。
Elixirの中の人もPhoenixに並々ならぬ情熱を抱いているみたいです。
プルリク出したら速攻返事きますよ、わりと（体験談）。

なんで、今は結構丁度いい入門時期かなと思ったりします。

それでは皆さん、是非是非良いElixir/Phoenixライフをノシ


## 追記
結構反響が大きかったようで、速攻レスがあったような気配をキャッチしました。
なによりです。

以下にコンテナ上のPhoenixではなく、MBP上で直に動かしたPhoenixのベンチも参考としてのせておきますノシ

``` bash
Running 1m test @ http://localhost:4000
  15 threads and 15 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     5.88ms    3.56ms  32.26ms   63.70%
    Req/Sec   210.03     90.81   578.00     61.01%
  184000 requests in 1.00m, 371.12MB read
Requests/sec:   3066.63
Transfer/sec:      6.19MB
```

上記のCookbookに載ってる同様のベンチが秒３７００くらいなんで、まあこんなもんでしょう。流石にVM上で動かすとこの数字は無理ゲーです。

参考にして下さいませー。


## 追記 その２
去年作ったRailsのDockerfileが[こいつ](http://t.co/ZywPwO05LP)のせいで動かなくなってたのを直したついでに、Ruby on RailsをDocker上で走らせた時のベンチも取りました。

せっかくなんでその結果も載せておきます。

因みに、そのRailsの環境は下記のDockerfileで構築したものです。

https://github.com/xtity/hello-docker-rails

環境変数等の設定は下記の通りです。

* ``` net.core.somaxconn```：1024
* ``` RAILS_ENV```：production
* Topのアクセスで、``` rails generate controller welcome index ```で追加したページを返すように``` routes.rb ```を設定

以下、ベンチ結果。

``` bash
Running 1m test @ http://192.168.59.103/
  15 threads and 15 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    86.21ms   16.54ms 285.79ms   79.97%
    Req/Sec    11.40      2.56    18.00     73.61%
  10644 requests in 1.00m, 13.37MB read
Requests/sec:    177.34
Transfer/sec:    228.08KB
```

同じDocker上でElixir on Phoenixが秒1308.79だったので、Ruby on Railsと比べて、__約7.4倍__のスループットが出てるのが分かりますね。なかなかやってくれますｂ