Compose を始めましょう

このページでは、簡単な Python ウェブ・アプリケーションを Docker Compose で実行しましょう。アプリケーションは Flask フレームワークを使い、Redis の値を増やします。サンプルでは Python を使いますが、ここでの動作概念は Python に親しくなくても理解可能です。

事前準備

既に Docker Engine と Docker Compose がインストール済み なのを確認します。Python をインストールする必要はなく、Docker イメージのものを使います。

ステップ1:セットアップ

  1. プロジェクト用のディレクトリを作成します。
$ mkdir composetest
$ cd composetest
  1. プロジェクト用のディレクトリに移動し、好みのエディタで app.py という名称のファイルを作成します。
fromflaskimportFlaskfromredisimportRedisapp=Flask(__name__)redis=Redis(host='redis',port=6379)@app.route('/')defhello():redis.incr('hits')return'Hello World! I have been seen %s times.'%redis.get('hits')if__name__=="__main__":app.run(host="0.0.0.0",debug=True)
  1. プロジェクト用のディレクトリで別の requirements.txt という名称のファイルを作成し、次の内容にします。
flask
redis

これらはアプリケーションの依存関係を定義します。

ステップ2:Docker イメージの作成

このステップでは、新しい Docker イメージを構築します。イメージには Python アプリケーションが必要とする全ての依存関係と Python 自身を含みます。

  1. プロジェクト用のディレクトリの内で、Dockerfile という名称のファイルを作成し、次の内容にします。
FROM python:2.7ADD . /codeWORKDIR /codeRUN pip install -r requirements.txtCMD python app.py

これは Docker に対して次の情報を伝えます。

  • Python 2.7 イメージを使って、イメージ構築を始める
  • 現在のディレクトリ . を、イメージ内のパス /code に加える
  • 作業用ディレクトリを /code に指定する
  • Python の依存関係(のあるパッケージを)インストールする
  • コンテナが実行するデフォルトのコマンドを pythonapp.py にする

Dockerfile の書き方や詳細な情報については、 Docker ユーザ・ガイドDockerfile リファレンス をご覧ください。

  1. イメージを構築します。
$ docker build -t web .

このコマンドは、現在のディレクトリの内容を元にして、 web という名前のイメージを構築(ビルド)します。コマンドは自動的に Dockerfileapp.pyrequirements.txt を特定します。

ステップ3:サービスの定義

docker-compose.yml を使い、サービスの集まりを定義します。

  1. プロジェクト用のディレクトリに移動し、docker-compose.yml という名前のファイルを作成し、次のように追加します。
version:'2'services:web:build:.ports:-"5000:5000"volumes:-.:/codedepends_on:-redisredis:image:redis

この Compose 用ファイルは webredis という2つのサービスを定義します。web サービスは次のように設定されます。

  • 現在のディレクトリにある Dockerfile から構築する。
  • コンテナ内の公開用(exposed)ポート 5000 を、ホストマシン上のポート 5000 に転送する。
  • ホスト上のプロジェクト用のディレクトリを、コンテナ内の /code にマウントし、イメージを再構築しなくてもコードの変更が行えるようにする。
  • web サービスを redis サービスにリンクします。

redis サービスには、Docker Hub レジストリから取得した最新の公開(パブリック) Redis イメージを使用します。

ステップ4:Compose でアプリケーションを構築・実行

  1. プロジェクト用のディレクトリで、アプリケーションを起動します。
$ docker-compose up
Pulling image redis...
Building web...
Starting composetest_redis_1...
Starting composetest_web_1...
redis_1 |[8]02 Jan 18:43:35.576 # Server started, Redis version 2.8.3web_1 | * Running on http://0.0.0.0:5000/
web_1 | * Restarting with stat

Compose は Redis イメージを取得し、コードが動作するイメージを構築し、定義したサービスを開始します。

  1. ブラウザで http://0.0.0.0:5000/ を開き、アプリケーションの動作を確認します。

Docker を Linux で直接使っている場合は、ウェブアプリは Docker デーモンのホスト上でポート 5000 をリッスンして(開いて)います。もし http://0.0.0.0:5000/ で接続できなければ、http://localhost:5000 を試してください。

Mac や Windows 上で Docker Machine を使っている場合は、 docker-machineip仮想マシン名 を実行し、Docker ホスト上の IP アドレスを取得します。それからブラウザで http://仮想マシンのIP:5000 を開きます。

そうすると、次のメッセージが表示されるでしょう。

Hello World! I have been seen 1 times.
  1. このページを再読み込みします。

番号が増えているでしょう。

ステップ5:他のコマンドを試す

サービスをバックグラウンドで実行したい場合は、docker-composeup-d フラグ(」デタッチド」モード用のフラグ)を付けます。どのように動作しているか見るには、docker-composeps を使います。

$ docker-compose up -d
Starting composetest_redis_1...
Starting composetest_web_1...
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
composetest_redis_1 /usr/local/bin/run Up
composetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp

docker-composerun コマンドを使えば、サービスに対して一度だけコマンドを実行します。たとえば、web サービス上でどのような環境変数があるのかを知るには、次のようにします。

$ docker-compose run web env

docker-compose--help で利用可能な他のコマンドを確認できます。また、必要があれば bash と zsh シェル向けの コマンド補完 もインストールできます。

Compose を docker-composeup-d で起動した場合は、次のようにサービスを停止して、終わらせます。

$ docker-compose stop

以上、Compose の基本動作を見てきました。

次はどこへ