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

  • 221
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

何これ?

皆さん、おはこんばんちは。

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

ということで、やろうやろうと思っていたであろうElixir/Phoenix、そろそろ始めまちゃいましょう。
elixir-logo.png

phoenixframework-logo.png

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

息を吸うようにDockerで入門しちゃいましょう

楽です。そして、速い。
四の五の言わずにまずはdocker run。

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

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

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

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

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

phoenix-home.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"]

せっかくなんでベンチもとってみようず

この本読んで書いてあっただけなんですが、wrkでベンチでも取ってみましょう。

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

とりま、15スレで1分。
手元の10万後半MBPだとこんなん出ました。

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

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 した後色々ソースを弄ってはコンパイル、弄ってはコンパイルとかがわりと速習な気がしたり、しなかったり。

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

次回予告

入門した後必要なのは、そうdeployと、CIですね?(多分

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

この前投げた拙プルリクも無事マージされたようなので、
今なら最新のphoenixをcloneしてくれば、mix releaseでビルドできるはずですb

CIは、せっかくDockerで入門したのだから(?)、drone.ioでやってみようかなとぼんやり思ってます。

終わりに

Elixir、Phoenix熱いですね。

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

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

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

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

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

追記

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

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

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に載ってる同様のベンチが秒3700くらいなんで、まあこんなもんでしょう。流石にVM上で動かすとこの数字は無理ゲーです。

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

追記 その2

去年作ったRailsのDockerfileがこいつのせいで動かなくなってたのを直したついでに、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を設定

以下、ベンチ結果。

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倍のスループットが出てるのが分かりますね。なかなかやってくれますb