Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

何これ?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away