(1)はこちら、(2)はこちらから。
ミドルウェアをDocker化する方法
ここまで、WebアプリケーションサーバのDocker化に焦点を当ててDocker化のノウハウを説明しました。続いて、Webアプリケーションで使用するミドルウェアをDocker化し、Webアプリケーションコンテナと組み合わせる方法を紹介します。
ミドルウェアをDocker化するメリット
ローカル環境で複数プロジェクトの開発を行っていると、プロジェクトごとに依存するミドルウェアのバージョンが異なることがあります。MySQLの場合はmysql-build、nginxの場合はnginx-buildなど、複数のバージョンをインストールするツールがあり、これらのツールをそのまま使ってもよいのですが、ミドルウェアによっては適当なツールがないかもしれません。
そこで、プロジェクトごとにDockerイメージを用意することにより、複数のバージョンのミドルウェア環境を簡単に構築できます。複数プロジェクト間で同じミドルウェアを共有するときと比べて、余計な副作用の心配もしなくて済みます。
ミドルウェアをDocker化するために必要なこと
Webアプリケーション開発の文脈でミドルウェアをDocker化するためには、次の3つを行う必要があります。
- ① 1つのミドルウェアを1つのコンテナとして起動する
- ② Webアプリケーションのコンテナと各ミドルウェアのコンテナをリンク機能で接続する
- ③ 接続された複数のコンテナの起動・停止を、1つのまとまりとして管理する
①については前述しましたので、以降で②③について見ていきます。
コンテナの接続
あるコンテナから別のコンテナ、たとえばWebアプリケーションコンテナとMySQLコンテナを接続するために、Dockerコンテナのリンク機能を使います。リンク機能は、環境変数を用いてほかのコンテナのIPアドレスやポート番号を取得するための機能です。
ここでは例として、WebアプリケーションコンテナとMySQLコンテナを接続します。次のコマンドで、まずMySQLコンテナをdb
という名前で起動しておき、--link
オプションでWebアプリケーションコンテナとリンクさせます[3]。
リンクの結果、Webアプリケーションコンテナ上の環境変数DB_PORT_3306_TCP_ADDR
にMySQLコンテナのIPアドレス、DB_PORT_3306_TCP_PORT
にMySQLコンテナのポートが設定されます。Webアプリケーションコード内でデータベースのIPアドレスやポート番号を指定する個所があるはずなので、その部分をこれらの環境変数に書き換えます。
詳しくは、Dockerの公式ドキュメントである「Linking containers together」を参照してください。
Docker Composeによるコンテナの管理
MySQLなどミドルウェアとの連携を考えると、複数のコンテナを起動し、管理することになります。複数のコンテナを管理するには、Docker Composeが便利です。
Docker Composeは、複数のDockerコンテナを管理しやすくするためのDocekr公式のツールです。各コンテナの起動オプションやコンテナどうしのリンクなどを宣言的に記述したファイルさえ用意すれば、コマンド一つですべてのコンテナを同時に起動したり、停止したりできます。
使い方は簡単です。まずdocker-compose.yml
という名前でリスト5のようなファイルを用意します。リスト5にはWebアプリケーションコンテナ(web)とMySQLコンテナ(db)が定義されています。Webアプリケーションコンテナ用のDockerfileはdocker-compose.yml
と同じディレクトリにあるものとします。
docker-compose.yml
と同じディレクトリでdockercompose up
コマンドを実行すると、リスト5に定義したコンテナが同時に起動します。
この状態で[Ctrl]+[C]を押下すると、起動した各コンテナをまとめて停止できます。
まとめ
今回はPerlのWebアプリケーションをDocker化する方法について紹介しました。
Dockerは今ホットな領域ということもあり、界隈のツールは非常に進化が速く、ハマることも多いです。Perlの場合は同じLL(Lightweight Language、軽量言語)であるRubyやPythonのDocker化ノウハウをある程度流用できますので、ハマったときは参考にしてみてください。また、ツールの使い方の細かいところでハマって強引な方法で解決しても、次のバージョンでは修正されていることもよくあります。
さて、次回の執筆者は鍛治匠一さんで、テーマは「Perlによる言語内DSLの作り方」です。お楽しみに。