Perl Hackers Hub

第34回DockerによるPerlのWebアプリケーション開発(3)

(1)こちら⁠2)こちらから。

ミドルウェアをDocker化する方法

ここまで、WebアプリケーションサーバのDocker化に焦点を当ててDocker化のノウハウを説明しました。続いて、Webアプリケーションで使用するミドルウェアをDocker化し、Webアプリケーションコンテナと組み合わせる方法を紹介します。

ミドルウェアをDocker化するメリット

ローカル環境で複数プロジェクトの開発を行っていると、プロジェクトごとに依存するミドルウェアのバージョンが異なることがあります。MySQLの場合はmysql-buildnginxの場合はnginx-buildなど、複数のバージョンをインストールするツールがあり、これらのツールをそのまま使ってもよいのですが、ミドルウェアによっては適当なツールがないかもしれません。

そこで、プロジェクトごとにDockerイメージを用意することにより、複数のバージョンのミドルウェア環境を簡単に構築できます。複数プロジェクト間で同じミドルウェアを共有するときと比べて、余計な副作用の心配もしなくて済みます。

ミドルウェアをDocker化するために必要なこと

Webアプリケーション開発の文脈でミドルウェアをDocker化するためには、次の3つを行う必要があります。

  • ① 1つのミドルウェアを1つのコンテナとして起動する
  • ② Webアプリケーションのコンテナと各ミドルウェアのコンテナをリンク機能で接続する
  • ③ 接続された複数のコンテナの起動・停止を、1つのまとまりとして管理する

①については前述しましたので、以降で②③について見ていきます。

コンテナの接続

あるコンテナから別のコンテナ、たとえばWebアプリケーションコンテナとMySQLコンテナを接続するために、Dockerコンテナのリンク機能を使います。リンク機能は、環境変数を用いてほかのコンテナのIPアドレスやポート番号を取得するための機能です。

ここでは例として、WebアプリケーションコンテナとMySQLコンテナを接続します。次のコマンドで、まずMySQLコンテナをdbという名前で起動しておき、--linkオプションでWebアプリケーションコンテナとリンクさせます[3]⁠。

各コンテナの起動
$ docker run -d --name db mysql:5.6
$ docker run -p 5000:5000 -v ./:/code -v ./local:/cpan --link db:db docker-sample-runtime carton exec plackup -a script/local-server

リンクの結果、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と同じディレクトリにあるものとします。

リスト5 docker-compose.yml
web:
  build: ./
  ports:
    - "5000:5000"
  volumes:
    - ./:/code
    - ./local:/cpan
  links:
    - db
  command: script/local-server
db:
  environment:
    - MYSQL_USER=myuser
    - MYSQL_PASSWORD=mypass
    - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    - MYSQL_DATABASE=docker-sample
  privileged: true

docker-compose.ymlと同じディレクトリでdockercompose upコマンドを実行すると、リスト5に定義したコンテナが同時に起動します。

各コンテナの起動
$ docker-compose up

この状態で[Ctrl][C]を押下すると、起動した各コンテナをまとめて停止できます。

まとめ

今回はPerlのWebアプリケーションをDocker化する方法について紹介しました。

Dockerは今ホットな領域ということもあり、界隈のツールは非常に進化が速く、ハマることも多いです。Perlの場合は同じLLLightweight Language軽量言語)であるRubyやPythonのDocker化ノウハウをある程度流用できますので、ハマったときは参考にしてみてください。また、ツールの使い方の細かいところでハマって強引な方法で解決しても、次のバージョンでは修正されていることもよくあります。

さて、次回の執筆者は鍛治匠一さんで、テーマは「Perlによる言語内DSLの作り方」です。お楽しみに。

おすすめ記事

記事・ニュース一覧