ブログ

はじめに
こんにちは、技術グループの 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
オプションで指定していた各コンテナの名前は、各設定項目のルートの要素(mtdata
、mtdb
、mtweb
)として設定することが可能です。このコンテナ名はコンテナ間のリンク機能を使用するときにも用います。なお、コンテナ設定の記述順にも意味があり、他のコンテナから参照されるコンテナについては先に起動しておく必要があるため、記述順も先に記述しておく必要があります。
ここまで準備ができたら以下のコマンドを実行して下さい。
$ fig build
すると、fig.yml
に記述された設定内容をもとに、必要な Docker イメージのビルドを行います。今回の設定では、./recipes/httpd-mt
以下の Dockerfile を元に mtweb
用のイメージをビルドし、mtdata
、mtdb
については、既存のイメージをそのまま使用します。前回の「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
を他の制作メンバーと共有することで環境の共有も可能となりますので、複数人での作業や案件の引き継ぎの際にも役立てられるのではないかと思います。
ご興味ある方は、ぜひお試し下さい。
目次
- デザイナー、コーダーのための Docker 入門(1)導入
- デザイナー、コーダーのための Docker 入門(2)イメージの作成
- デザイナー、コーダーのための Docker 入門(3)Figでコンテナを管理する