share facebook facebook2 twitter menu hatena pocket slack

2014.08.13 WED

Touch the fig(1)

川原 洋平

WRITTEN BY川原 洋平

どうも、ふぃぐ原洋平ことかっぱ@inokara)です。


はじめに

fig って何?

最近 Docker に買収された Orchard の fig というツールを触ってみました。

fig とはマルチコンテナオーケストレーションツールで複数の Docker コンテナを組み合わてアプリケーションを構成する際に関連する依存関係を YAML 形式の設定ファイルで記述しておくことで Docker によるアプリケーション環境構築をお手軽にするツール(という印象)です。

Dockerfile と何がちゃうの?

Dockerfile と似たような印象ですが、Dockerfile はコンテナ構築、fig はコンテナで構成されるアプリケーションの構築に…という使い分けでしょうか…


準備

環境

  • Amazon Linux(Amazon Linux AMI release 2014.03)
  • Docker 1.1.2

fig のインストール

sudo pip install -U fig

ちなみに pip がインストールされていない場合には…

sudo yum install python-pip

fig の確認

fig

以下のように出力されました。

Punctual, lightweight development environments using Docker.

Usage:
  fig [options] [COMMAND] [ARGS...]
  fig -h|--help

Options:
  --verbose                 Show more output
  --version                 Print version and exit
  -f, --file FILE           Specify an alternate fig file (default: fig.yml)
  -p, --project-name NAME   Specify an alternate project name (default: directory name)

Commands:
  build     Build or rebuild services
  help      Get help on a command
  kill      Kill containers
  logs      View output from containers
  ps        List containers
  rm        Remove stopped containers
  run       Run a one-off command
  scale     Set number of containers for a service
  start     Start services
  stop      Stop services
  up        Create and start containers

Quick Start を真似る

こちら を写経してみます。

作業用のディレクトリ作成

mkdir ~/figtest
cd ~/figtest

flask アプリケーションを作成

flask って Python の Sinatra みたいなもの(だと思う)…

from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host="redis_1", 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)

上記のように flask 用のアプリケーションを作成します。

(追記)
よく見たら上記のスクリプトほんの数行ですがアクセスカウントを Redis に放り込んで表示しているようです。こんな数行で…恐ろしい(個人的に)

関連パッケージインストール用テキストファイルの作成

pip では -r オプションの引数に下記のようなテキストファイルを渡すと書かれたパッケージをインストールしてくれます。

requirements.txt
flask
redis

Dockerfile の作成

ようやく Dockerfile です。

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt

とってもシンプルですね。

fig.yaml の作成

そして fig の設定。fig.yaml を書きます。

fig.yaml
web:
  build: .
  command: python app.py
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis

以下、簡単に説明。詳細はこちらを御覧ください…

パラメータ 意味
web 任意のアプリケーション名を指定
build Dockerfile のパスを指定(多分)
command コンテナで実行されるコマンドを指定
ports バインドするポートを指定
volumes ホストのディレクトリをコンテナのマウントする為の指定
links 連携するアプリケーションを指定(今回は redis アプリケーションコンテナを指定)
redis 任意のアプリケーション名を指定
image 連携するコンテナイメージを指定

fig up

準備が整ったら fig up してコンテナをビルドします。

fig up

最初は多少時間がかかるのでのんびり待ちます。

fig up -d でデタッチ

fig up -d

上記のように -d オプションを付けることでデタッチモードで稼働します。

fig ps で起動しているコンテナを確認

fig ps

上記を実行すると起動中のコンテナとアプリケーションの状態を確認出来ます。

     Name            Command      State       Ports
--------------------------------------------------------
figtest_redis_1   redis-server    Up      6379/tcp
figtest_web_1     python app.py   Up      5000->5000/tcp

fig stop

稼働中のアプリケーションを停止したい場合に以下のように実行します。

fig stop

以下のように表示されます。

Stopping figtest_web_1...
Stopping figtest_redis_1...

この状態で fig ps を実行すると以下のように表示されました。

     Name            Command      State    Ports
------------------------------------------------
figtest_redis_1   redis-server    Exit 0
figtest_web_1     python app.py   Exit 0

最後に

簡単な YAML ファイルでコンテナアプリケーション環境を構築出来るのはいいですね。fig のサイトにも以下のような Rails や WordPress 環境を動かす例が掲載されています。

今回はホントに触ってみただけなので、次回はオリジナル(と言うほどではありませんが)のアプリケーションを動かしてみたいと思います。

元記事は、こちら