はじめに

こんにちは、技術グループの marunaga です。前回の記事では Dockerfile を使ったオリジナルのコンテナの作成から、複数の Docker コンテナを連携させてウェブサービスを動かすところまでの流れをご紹介しました。

実際に手を動かして操作していただくと、何度も同じコマンドを打ち込んでコンテナを立ち上げたり、削除したりしなければならず、かなり面倒に感じられたのではないかと思います。

そこで今回は、複数のコンテナの連携の管理を簡単に行える Fig というツールについてご紹介したいと思います。Fig を使うことで、複数コンテナの起動・連携を fig.ymlに記述して一括管理することができるようになります。前回同様 Boot2Docker を事前に起動しておいて下さい。

Fig のインストール

公式サイトの手順(Installing Fig)に従い、以下のコマンドでインストールしてください。

$ curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig

または homebrew からインストールすることも可能です。

$ brew install fig

インストールが完了したら、以下のコマンドでバージョンを確認できます。

$ fig --version

fig 1.0.1

前回のコンテナの連携を Fig で一元管理する

さて、準備ができたところで早速使い方のご紹介です。 手始めに、前回ご紹介しました「MySQL コンテナ と MovableType 用の Apache のコンテナの連携」の例を Fig を使った方法で管理してみましょう。まずは、前回の用意したディレクトリのルートに fig.yml というファイルを作成します。

.
├── fig.yml … Fig で使用する設定ファイル
├── www/
│   └── htdocs/ … Apache のドキュメントルート
└── recipes/
    └── httpd-mt/ … MT 用 Apache サーバ作成用のファイル
        ├── Dockerfile
        ├── localhost.conf
        └── localhost-ssl.conf

ファイルを作成したら、その内容を以下のように編集して下さい。

# データコンテナ
mtdata:

  # 使用するイメージの指定
  image: busybox:latest

  # ボリュームのマウントの設定(`-v` オプション)
  volumes:
    - /var/lib/mysql

# DB コンテナ
mtdb:

  # 使用するイメージの指定
  image: mysql

  # ポートの指定(`-p` オプション)
  ports:
    - 3306:3306

  # データコンテナの指定(`--volumes-from` オプション)
  volumes_from:
    - mtdata

  # 環境変数の指定(`-e` オプション)
  environment:
    - MYSQL_ROOT_PASSWORD=mt
    - MYSQL_USER=mt
    - MYSQL_PASSWORD=mt
    - MYSQL_DATABASE=mt

# Web コンテナ
mtweb:

  # ビルドする Dockerfile のあるディレクトリを指定
  build: ./recipes/httpd-mt

  # ポートの指定(`-p` オプション)
  ports:
    - 8080:80
    - 4443:443

  # ボリュームのマウントの設定(`-v` オプション)
  volumes:
    - ./www:/var/www

  # コンテナのリンク設定(`--link` オプション)
  links:
    - mtdb

各項目にはコメントで説明を記述しているので、なんとなくお分かりいただけるのではと思いますが、それぞれの値が docker run コマンドのオプションに対応しています。

また docker run の --name オプションで指定していた各コンテナの名前は、各設定項目のルートの要素(mtdatamtdbmtweb)として設定することが可能です。このコンテナ名はコンテナ間のリンク機能を使用するときにも用います。なお、コンテナ設定の記述順にも意味があり、他のコンテナから参照されるコンテナについては先に起動しておく必要があるため、記述順も先に記述しておく必要があります。

ここまで準備ができたら以下のコマンドを実行して下さい。

$ fig build

すると、fig.yml に記述された設定内容をもとに、必要な Docker イメージのビルドを行います。今回の設定では、./recipes/httpd-mt 以下の Dockerfile を元に mtweb 用のイメージをビルドし、mtdatamtdb については、既存のイメージをそのまま使用します。前回の「MovableType 用の Apache のコンテナ」のビルドキャッシュが残っていれば、ものの数秒でビルドが完了するのではと思います。

ビルドが完了したら、次は以下のコマンドを実行して下さい。

$ fig up -d

実行後、

Creating dockertest_mtdata_1...
Creating dockertest_mtdb_1...
Creating dockertest_mtweb_1...

上記の様なメッセージが表示され、コマンドがエラーなく終了すれば起動完了です。
前回同様、http://192.168.xx.xx:8080/mt/ にアクセスして、データベースの設定が進められれば成功です。

Fig の動作について

いかがでしょうか。前回までのコンテナの操作が一気に簡単になることを体感いただけたのではないかと思います。ここで、少し Fig の動作についてご説明しておきましょう。

まず、先ほどのコマンドの -d オプションについてですが、こちらは Docker の run コマンドのオプションと同様に「デタッチモード」での起動のためのオプションとなります。このオプションを付けておくことにより、コンテナの起動を完了したあとはバックグラウンドで Docker コンテナが動作し続けます(このオプションを外すと Fig で管理されている各コンテナの起動ログを確認することもできます)。

その他のコマンドについては Fig の CLI reference でも確認することができますが、以下に少しご紹介しておきます。よく使う設定としては、

  • コンテナの一括停止
    $ fig stop
  • 停止したコンテナの一括再起動(一旦停止した後に使う)
    $ fig start
  • コンテナの一括削除
    $ fig rm
  • コンテナのプロセスを確認
    $ fig ps

のようなコマンドが用意されていて、docker コマンドと同様な方法でコンテナを操作する事ができます。

また、docker run --link でコンテナ同士を連携させた際と同様に、link を設定したコンテナ上の hosts ファイルには、fig.yml で設定されたコンテナ名と IP アドレスの組み合わせが以下のように追記されており、コンテナの連携を実現しています。

$ fig run mtweb cat /etc/hosts

172.17.0.17 7f18c7a3a72a
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.15 dockertest_mtdb_1
172.17.0.16 dockertest_mtweb_1
172.17.0.15 mtdb
172.17.0.15 mtdb_1
172.17.0.16 mtweb
172.17.0.16 mtweb_1

なお、上記の hosts ファイルにも記載されていますが、Fig によって起動されたコンテナの名前(docker run 時の --name で指定する値)には、「プロジェクト名」が個別に設定されており、 デフォルトではカレントディレクトリの名前が使用されています。

$ pwd

/path/to/docker-test

$ fig ps

Name                      Command               State            Ports
--------------------------------------------------------------------------------------
dockertest_mtdata_1   /bin/bash                        Exit 0
dockertest_mtdb_1     /entrypoint.sh mysqld --da ...   Up       0.0.0.0:3306->3306/tcp
dockertest_mtweb_1    /usr/sbin/httpd -D FOREGROUND    Up       0.0.0.0:8080->80/tcp

この値は、コマンド実行時の -p(または --project-name)オプションで変更することができます。 ただし、プロジェクト名を変更した場合は、他のすべてのコマンド実行時にも常にプロジェクト名を指定する必要がありますので、少し不便です(以下の様な具合です)。

$ fig -p testproject up -d

Creating testproject_mtdata_1...
Creating testproject_mtdb_1...
Creating testproject_mtweb_1...

$ fig -p testproject ps

Name                      Command               State            Ports
---------------------------------------------------------------------------------------
testproject_mtdata_1   /bin/bash                        Exit 0
testproject_mtdb_1     /entrypoint.sh mysqld --da ...   Up       0.0.0.0:3306->3306/tcp
testproject_mtweb_1    /usr/sbin/httpd -D FOREGROUND    Up       0.0.0.0:8080->80/tcp

とくに必要がない限りはプロジェクト名はデフォルトのままにしておくほうがお手軽そうです。

まとめ

3 回に分けてご紹介してきました「デザイナー、コーダーのための Docker 入門」いかがでしたでしょうか。

今回ご紹介しました、Boot2Docker & Fig がインストールされてさえいれば、ディレクトリ単位で Docker のコンテナ連携を管理し、他の案件には一切影響のない環境を構築することが可能です。

また、Git などのバージョン管理ツールで fig.yml や Dockerfile を他の制作メンバーと共有することで環境の共有も可能となりますので、複数人での作業や案件の引き継ぎの際にも役立てられるのではないかと思います。

ご興味ある方は、ぜひお試し下さい。

目次