Software Design 2月号のDocker特集に記事を寄稿しました

あけましておめでとうございます! @acidlemon です。

2017年1月18日発売のSoftware Design 2017年2月号の第一特集「いまはじめるDocker」に記事を寄稿しました。第5章の「導入事例で見えてくるDockerの使いどころ」をと同僚の矢吹 (@Konboi)で書きました。

ソフトウェアデザイン 2017年 02 月号 [雑誌]

ソフトウェアデザイン 2017年 02 月号 [雑誌]

執筆の話をいただいたきっかけは過去に書いたDockerで開発環境を上げ下げするmirageの記事でした。今回の特集はプログラマー向けのDocker入門ということで、プログラマー向けであれば本番環境のデプロイの話よりもまず自分の開発環境からDockerを使い始めて便利さを感じていく内容がよいであろう、ということで開発現場で実際にDockerを使っている様子の記事となっております。

カヤックでは開発環境などにDockerを使い始めてもう3年近く経っていて、いろいろ知見がたまってきているのでそれをアウトプットできるちょうどよい機会でした。自分の開発マシン上でDockerを導入するはじめの一歩から始まり、コンテナの構成方法の考え方やDockerfileのサンプルのほか、最終的にはmirageを使って開発サーバ上にDockerで動的に仮想ホストを増やしたり減らしたりするというところまで紹介しています。

mirageの部分はちょっと書ききれないTipsなどもありましたので、このブログ記事でちょっとフォローアップしようと思います。


mirageのTips

mirageは自分がとりあえず必要な機能をドコドコ入れていったという感じなので、いくつか便利な機能があります。

ポートを分けて複数のアプリを同時に起動する

PerlでProcletを使って開発しているので、WebApp本体は5000番ポート、管理画面は5001番ポートといった感じで一つのPerlスクリプトから複数ポートでそれぞれPlackアプリを待ち受けることがあります。mirageはこのユースケースに対応できるように、複数のポートのListenに対応しています。こんな感じで設定ファイルのYAMLにListenするポートとDockerに転送するポートへのマッピングを書きます。

listen:
  foreign_address: 127.0.0.1
  http:
    - listen: 5100
      target: 5000
    - listen: 5101
      target: 5001

この例では mirageが 5100番ポートで受けたリクエストをコンテナ内の5000番ポートへ、5101番ポートで受けたリクエストを5001番ポートへ転送しています。

この機能を利用してメインのアプリケーションと管理画面のアプリケーションを同時に動かしています。

サブドメインごとに外部ストレージのデータベース設定を分ける

mirageで起動するコンテナの外にデータベースを置く場合、サブドメインごとにデータを分けたいというニーズがあります。mirageはコンテナ起動時に環境変数SUBDOMAINにサブドメインを設定して、コンテナの中から何というサブドメイン用に起動されているかわかるようにしています。コンテナ内でアプリケーションを起動するときにこの環境変数を使用して接続先をコントロールすることができます。

たとえば、MySQLサーバーのホスト名は固定とし、接続するデータベース名を “myapp_$ENV{SUBDOMAIN}” のようにサブドメインを埋め込んだものとすることで、サブドメインごとに接続するデータベースを分けることができます。

この仕組みを利用すると、コンテナを破棄してもデータベースさえ消さなければ、サブドメインごとに永続的にデータを保持することが可能となります。コンテナを何度も起動しなおしても継続してデータを利用できるため、スマートフォンにセッションや認証の情報を保存するようなアプリのデバッグで役立ちます。

定期的なコンテナの再ビルド

開発環境コンテナをホイホイ起動/終了するのを楽にやるために、コンテナイメージの中にgit cloneしたリポジトリをそのまま投げ込んで、コンテナ起動時のCMDで呼び出すシェルスクリプトに git checkout とか git pull を入れています。当然ながら、コンテナ内のリポジトリの状態はイメージを生成するときにクローンした状態のままになっています。そのため時間が経てば経つほど、コンテナ起動の差分アップデートに時間がかかるようになります。

これを回避するため、週末にバッチ実行でイメージを一から作り直しています。イメージをフルビルドするため、docker build のオプションに –no-cache をつけてキャッシュを破棄してビルドしています。


mirageのgithub自体はあんまり更新がないので開発が停滞してるっぽく見えますが、すでに社内でだいぶ枯れた感じになっていてとても安定しています。今はストレージに当時ちょっといい感じだったLevelDBを使っているのですが、これをDockerのタグ機能を使うようにすればmirage自体をコンテナに投げ込んでステートレスに運用できるな〜みたいなネタはあるので今年もちょいちょい手が入ると思いますが、極力互換性は壊さずやっていくつもりですのでどうぞご利用ください。

カヤックでは、新卒 or 中途 を問わず年中採用をやっていますので、Dockerでドッカーンとコンテナを打ち上げたい人の応募をお待ちしております!