第6章: docker-compose の活用例 (Perl Web)

前回に引き続き docker-compose の活用事例を紹介します。

今回の事例は web アプリ開発の場合の事例です。昨今のweb アアプリはフレームワークを活用することがおおく、フレームワークは app サーバーを立ち上げた状態で利用することが多いので一工夫必要になります。

6.1 作成する docker 環境について

今回注目してほしいのは docker-compose.yml に command: の部分を別ファイルの読み込みにして、そのファイルの中に docker-compose up をする時に毎回実行させているところです。毎回実行させることで、アプリケーションサーバーの立ち上げや追加モジュールのインストール作業も行ってくれるので大変便利です。

今回の web アプリフレームワークは Mojolicious を選択しています。

6.2 準備する各ファイルの説明

必要なファイルを用意
(任意のディレクリを作成 今回は ~/tmp/docker_sample/perl_web)
% mkdir -p ~/tmp/docker_sample/perl_web && cd ~/tmp/docker_sample/perl_web
(ファイルの中身は下記の記事参考)
% touch Dockerfile docker-compose.yml compose_cmd.bash && \
chmod +x compose_cmd.bash && \
echo "requires 'Mojolicious', '== 8.70';" >> cpanfile

各ファイルの中身については任意のテキストエディタで作成ください。

Dockerfile (イメージを作成するためのファイル)

FROM perl:5.32.0
RUN cpanm Carton && mkdir -p /usr/src/app
WORKDIR /usr/src/app

docker-compose.yml (compose コマンドで実行するファイル)

version: '3.8'
services:
web:
  container_name: ctr_web_perl5_32_0
  build:
    context: .
  image: perl5_32_0:carton
  volumes:
    - .:/usr/src/app
  ports:
    - '3000:3000'
  command: './compose_cmd.bash'

compose_cmd.bash ( compose.yml の中で実行するコマンド)

#!/usr/bin/env bash
carton install && \
carton exec -- morbo script/perl_web

6.3 docker-compse の実行例

(イメージ作成からコンテナ、バックグラウンド起動まで)
% docker-compose up --build -d
(作ったコンテナで作業 mojo で作業用フレームワーク作成、アプリ名が PerlWeb の場合)
% docker-compose exec web carton exec -- mojo generate app PerlWeb
(ディレクトリ構成をととのえる)
% mv perl_web/* . && rmdir perl_web

(web ブラウザで localhost:3000 で確認)

(コンテナの外からモジュールを追加したいとき Teng の場合)
% echo "requires 'Teng', '0.32';" >> cpanfile
% docker-compose exec web carton install
(コンテナの中に入って作業したいとき)
% docker-compose exec web /bin/bash
(コンテナのバックグラウンド終了)
% docker-compose stop
(次回からの実行、ログをみたいとき)
% docker-compose up
(次回からの実行、バックグラウンド)
% docker-compose start

6.4 まとめ

  • compose.yml の port: のところで web app が使う port と docker と両方を設定
  • compose.yml の command: のところでは別ファイルで作成したものを読み込む (なぜそうするのかは調べてみてください)

6.5 次回

今回は web アプリ開発の場合での Perl 実行環境をつくってみました、Perl 以外でも基本的な構築方法は同じですので、他言語の場合も参考になるかと思います。

次回は Node.js の事例を紹介します。