Permalink
Fetching contributors…
Cannot retrieve contributors at this time
298 lines (185 sloc) 12.4 KB

Compose を始めましょう

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

事前準備

既に :doc:`Docker Engine と Docker Compose がインストール済み </compose/install>` なのを確認します。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 の書き方や詳細な情報については、 :ref:`Docker ユーザ・ガイド <building-an-image-from-a-dockerfile>`:doc:`Dockerfile リファレンス </engine/reference/builder>` をご覧ください。

  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 シェル向けの :doc:`コマンド補完 </compose/completion>` もインストールできます。

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

$ docker-compose stop

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

次はどこへ

.. seealso::

   Getting Started
      https://docs.docker.com/compose/gettingstarted/