Figを使って複数のDockerコンテナをコマンド一発で立ち上げる

土日を使ってDocker入門を読みながらDockerを触ってみました。

とりあえずRails/MySQL/Elasticsearchで構成されたWebサービスの開発環境を作ることを想定して、ひと通り手でコマンドを打ちながらMySQLとElasticsearchのコンテナを作ってRailsから接続させることはできました。

$ docker run -d -p 9200:9200 -p 9300:9300 dockerfile/elasticsearch
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql

これはこれで良いのですが毎回イメージごとに引数を思い出すのはだるいのでシェルスクリプトでも書こうかなと思ったら、ちょうどFigという複数のコンテナを一元管理する仕組みを提供してくれるツールを見つけたので使ってみました。

前提

fig.yml

docker runで起動するときのオプションをfig.ymlに書きます。 リファレンスはここにありますがdocker runのオプションをそのまま書くだけなので簡単です。

elasitcsearch:
  image: dockerfile/elasticsearch
  ports:
    - '9200:9200'
mysql:
  image: mysql
  ports:
    - '3306:3306'
  environment:
    MYSQL_ROOT_PASSWORD: password

実行

あとはfig upするだけです。

実行するとMySQLとElasticsearchの起動ログがずらずらと流れて起動完了します。 これで最新のMySQLとElasticsearchをホストOSの環境を汚すことなくインストールして使うことができます。

fig scale

さらにfig scaleというコマンドを使うと簡単にサービスを複数立ち上げることもできます。 以下はMySQLのコンテナを3つに増やした場合ですが、fig scale mysql=3とするだけです。 (ただし、ポートフォワードしてると衝突してしまうため3306:3306としていたものを3306に変更しました)

% fig scale mysql=3
Starting figtest_mysql_2...
Starting figtest_mysql_3...
% fig ps
        Name                       Command               State            Ports
-----------------------------------------------------------------------------------------
figtest_elasitcsearch_1   /elasticsearch/bin/elastic ...   Up      9300/tcp, 9200->9200/tcp
figtest_mysql_3           mysqld --datadir=/var/lib/ ...   Up      49155->3306/tcp
figtest_mysql_2           mysqld --datadir=/var/lib/ ...   Up      49154->3306/tcp
figtest_mysql_1           mysqld --datadir=/var/lib/ ...   Up      49153->3306/tcp

この環境でMySQLだけ増やしても意味無いですが、ResqueなどのWorkerを複数立ち上げたりロードバランサのコンテナを追加したりすると開発環境でも本番環境に近い構成が簡単に作れるようになるかもしれませんね。

まとめ

Figを使うと

  • プロジェクトが依存するミドルウェアをコマンド1つで立ち上げられる
  • 1つのマシンに複数バージョンのミドルウェア共存させられる
  • チーム開発時にDockerのことを知らないメンバーでも簡単に同じ環境を作れる

といったことが簡単に実現させられるようになります。

しかもFigの開発元は最近Docker社に買収されFigはDockerの公式ツールになるようなので今後もっと便利になっていきそうです。

http://www.publickey1.jp/blog/14/dockerfig2orchard.html