Compose を始めましょう

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

事前準備

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

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

  1. プロジェクト用のディレクトリを作成します。
$ mkdir composetest
$ cd composetest
  1. プロジェクト用のディレクトリに移動し、好みのエディタで app.py という名称のファイルを作成します。
from flask import Flask
from redis import Redis


app = Flask(__name__)
redis = Redis(host='redis', port=6379)


@app.route('/')
def hello():
    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.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py

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

  • Python 2.7 イメージを使って、イメージ構築を始める
  • 現在のディレクトリ . を、イメージ内のパス /code に加える
  • 作業用ディレクトリを /code に指定する
  • Python の依存関係(のあるパッケージを)インストールする
  • コンテナが実行するデフォルトのコマンドを python app.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:
     - .:/code
    depends_on:
     - redis
  redis:
    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.3
web_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-machine ip 仮想マシン名 を実行し、Docker ホスト上の IP アドレスを取得します。それからブラウザで http://仮想マシンのIP:5000 を開きます。

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

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

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

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

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

$ 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-compose run コマンドを使うと、サービスに対して一度だけコマンドを実行します。例えば、web サービス上でどのような環境変数があるのかを知るには、次のようにします。

$ docker-compose run web env

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

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

$ docker-compose stop

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

次はどこへ