DockerオーケストレーションツールFigを試す

DockerのオーケストレーションツールであるFigを試してみます。

Fig開発開発元であるOrchard社は2名のみからなる企業で、Docker社による買収が発表されています。

ちなみにFigはイチジクという意味を持った英単語だそうな。確かにFigサイトにはイチジクの画像が載っています。
(何故にイチジク?)


今回はFigサイトに掲載されているQuick startの手順に沿って、Figを体験してみます。

環境

Figを試すにあたって今回使用した環境は次のとおりです。

Dockerインストール

まず、Figに先立ってDockerをインストールします。
DockerサイトのUbuntu向けインストール方法 Ubuntu - Docker Documentation を参考に実施します。
なお、最新版のDockerをインストールします。

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker

バージョン確認

$ sudo docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070

Figインストール

次に、Figをインストールします。
Figサイトのインストール方法 Installing Fig "On 64-bit Linux"を参考に実施します。

$ wget -O fig https://github.com/docker/fig/releases/download/0.5.2/linux
$ sudo mv fig /usr/bin/
$ sudo chmod +x /usr/bin/fig

バージョン確認

$ fig --version
fig 0.5.2

試す

ではQuick startを実践してゆきます。

プロジェクトフォルダ作成

Figプロジェクトのフォルダを作成します。

$ mkdir figtest
$ cd figtest
Webアプリの作成

PythonによるWebアプリを作成します。フレームワークFlaskおよびRedisを用いるようです。

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 seen %s times.' % redis.get('hits')

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
依存性定義ファイルの作成

Pythonの依存性定義ファイルrequirements.txtを作成します。

flask
redis
Dockerfileの作成

Webアプリの動作コンテナとするイメージ作成用にDockerfileを作成します。

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
fig.ymlの作成

Figの肝であるサービス定義fig.ymlを作成します。
このファイルにおいて、各Dockerコンテナのオーケストレーションを定義するわけですね。

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


以上でファイルの作成は完了です。
ファイル構成は次のようになります。

figtest
 ├ Dockerfile
 ├ app.py
 ├ fig.yml
 └ requirements.txt
サービスの起動

コマンド fig up を実行します。
これによってDockerイメージのpullやイメージのビルド、各コンテナの起動が行われます。

$ sudo fig up
Creating figtest_redis_1...
Pulling image redis:latest...
5cd5c0d9ebfc: Pulling dependent layers
(中略)
Creating figtest_web_1...
Building web...
1c8df2f0c10b: Pulling dependent layers
(中略)
Attaching to figtest_redis_1, figtest_web_1
web_1   |  * Running on http://0.0.0.0:5000/
web_1   |  * Restarting with reloader

どうやら起動した模様。

確認

まずコンテナを一覧表示するコマンドfig psで様子を見てみます。

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

起動および動作してますね。

Webブラウザーから見てみます。
初回
f:id:sun-rise:20140812220613p:plain
2回目以降
f:id:sun-rise:20140812220640p:plain
お、動いてる。

動作確認が終わったのでコンテナを停止します。fig stopコマンドを実行します。

$ sudo fig stop
Stopping figtest_web_1...
Stopping figtest_redis_1...

$ sudo fig ps
     Name            Command      State    Ports 
------------------------------------------------
figtest_redis_1   redis-server    Exit 0         
figtest_web_1     python app.py   Exit 0         

止まりました。

以上、Fig体験記でした。