Compose を始めましょう¶
このページでは、簡単な Python ウェブ・アプリケーションを Docker Compose で実行しましょう。アプリケーションは Flask フレームワークを使い、Redis の値を増やします。サンプルでは Python を使いますが、ここでの動作概念は Python に親しくなくても理解可能です。
事前準備¶
既に Docker Engine と Docker Compose がインストール済み なのを確認します。Python をインストールする必要はなく、Docker イメージのものを使います。
ステップ1:セットアップ¶
- プロジェクト用のディレクトリを作成します。
$ mkdir composetest
$ cd composetest
- プロジェクト用のディレクトリに移動し、好みのエディタで
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)
- プロジェクト用のディレクトリで別の
requirements.txt
という名称のファイルを作成し、次の内容にします。
flask
redis
これらはアプリケーションの依存関係を定義します。
ステップ2:Docker イメージの作成¶
このステップでは、新しい Docker イメージを構築します。イメージには Python アプリケーションが必要とする全ての依存関係と Python 自身を含みます。
- プロジェクト用のディレクトリの内で、
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 リファレンス をご覧ください。
- イメージを構築します。
$ docker build -t web .
このコマンドは、現在のディレクトリの内容を元にして、 web
という名前のイメージを構築(ビルド)します。コマンドは自動的に Dockerfile
、 app.py
、 requirements.txt
を特定します。
ステップ3:サービスの定義¶
docker-compose.yml
を使い、サービスの集まりを定義します。
- プロジェクト用のディレクトリに移動し、
docker-compose.yml
という名前のファイルを作成し、次のように追加します。
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis
この Compose 用ファイルは web
と redis
という2つのサービスを定義します。web
サービスは次のように設定されます。
- 現在のディレクトリにある
Dockerfile
から構築する。 - コンテナ内の公開用(exposed)ポート 5000 を、ホストマシン上のポート 5000 に転送する。
- ホスト上のプロジェクト用のディレクトリを、コンテナ内の
/code
にマウントし、イメージを再構築しなくてもコードの変更が行えるようにする。 - web サービスを redis サービスにリンクします。
redis
サービスには、Docker Hub レジストリから取得した最新の公開(パブリック) Redis イメージを使用します。
ステップ4:Compose でアプリケーションを構築・実行¶
- プロジェクト用のディレクトリで、アプリケーションを起動します。
$ 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 イメージを取得し、コードが動作するイメージを構築し、定義したサービスを開始します。
- ブラウザで
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.
- このページを再読み込みします。
番号が増えているでしょう。
ステップ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 の基本動作を見てきました。
次はどこへ¶
- 次は、Django 、 Rails 、 WordPress 向けのクイックスタートガイドを試しましょう。
- Compose CLI リファレンス
- Compose ファイル・リファレンス
参考
- Getting Started
- https://docs.docker.com/compose/gettingstarted/