【Dockerの最新機能を使ってみよう】複数のDockerコンテナを自動で立ち上げる構成管理ツール「Docker Compose」



 複数のコンテナを組み合わせた構成でサービスを運用している場合、コンテナに対し特定のパラメータを指定したり、特定の順序での起動が必要となるケースがある。こういった作業を自動化するツールが「Docker Compose」だ。今回はこのDocker Composerの使い方を紹介する。

Dockerコンテナの管理を支援する純正ツール「Docker Compose」

 Docker ComposeはDockerが開発するコマンドラインツールで、あらかじめ用意しておいた設定ファイルに従ってコンテナを起動するツールだ。設定ファイルには複数のコンテナに関する記述が可能で、コンテナの起動オプションやコンテナに与える環境変数など、さまざまな設定も同時に記述できる。

 また、コンテナ同士の依存関係を設定することも可能で、これによって関連するコンテナを複数まとめて起動することも可能だ(図1)。

図1 Docker Composeによるサービスの立ち上げ
図1 Docker Composeによるサービスの立ち上げ

 この場合、設定された依存関係に応じて適切な順番でコンテナが起動されるようになっており、コマンド1つで簡単に必要なサービスを開始できるようになっている。逆にコンテナを停止させる際も、自動的に適切な順番でコンテナを停止させるようになっている。

 また、以前紹介したDocker Swarmとの統合機能も提供されており、コンテナを複数実行させる(スケールさせる)操作も可能だ。コンテナの実行だけでなくビルド操作もサポートされている。

Docker Composeの利用ケース

 Docker Composeを活用できるケースとしては、まずソフトウェアの開発/テスト環境が挙げられる。昨今ではデータベースやキャッシュ、フロントエンドといった役割毎に複数のサーバーを用意し、それらを組み合わせてサービスを構築する例が多い。こういった場合、開発/テスト環境でもそれらをすべて用意する必要がある。それらをコンテナの形で用意しておき、それらを起動するためのオプション設定などをDocker Composeの設定ファイルに記述しておけば、コマンドを1つ実行するだけでテスト環境を立ち上げられるようになる。

 また、Docker 1.13以降では「docker stack」という機能が導入された。これを利用することで、Docker Compose向けに定義したコンテナの設定等をそのまま利用してDockerクラスタ内でコンテナを稼動させられるようになる。これにより、Docker Composeを使って作ったテスト環境を、容易に実運用環境に移行させることができる。

Docker Composeのインストールと使い方

 それでは、Docker Composeの使い方について紹介していこう。Docker Composeは現在WindowsおよびLinux、Mac OS X向けのバイナリファイルが提供されており、GitHubのdocker/composeプロジェクトのリリースページから入手が可能だ。

 なお、WindowsおよびMac OS X向けのDockerパッケージである「Docker for Windows」や「Docker for Mac」にはDocker Composeが含まれているので、こちらを使ってDockerをインストールした場合は別途Docker Composeをインストールする必要はない。ただし、バージョンが古い可能性はあるので、以下の例のように「docker-compose」コマンドを「-v」オプション付きで実行してバージョンを確認しておこう。

$ docker-compose -v
docker-compose version 1.8.0, build f3628c7

 Docker ComposeはDockerやほかのDocker関連ツールと同様にGo言語で実装されており、バイナリファイル1つで動作する。GitHubで公開されているバイナリファイルは圧縮されていないので、これをダウンロード後適当な名前にリネームし、/usr/local/binなどのパスが通ったディレクトリにコピーすれば利用が可能になる。

Docker Composeのサブコマンド

 「docker-compose」コマンドでは、表1のサブコマンドが用意されている。このうち「build」や「create」、「exec」、「kill」など、dockerコマンドのサブコマンドと同じ名称のものは基本的に同様の処理を行うものと考えて良い。ただし、docker-composeではあらかじめ設定ファイルに記述しておいたコンテナのみを対象とする点が異なる。また、「down」や「up」、「scale」、「bundle」といったdocker-compose特有のコマンドもある。こちらについては後述する。

表1 docker-composeのサブコマンド
コマンド名説明
build設定ファイルに従ってコンテナのビルドを実行する
bundleクラスタ環境でコンテナを起動するためのbundleファイルを作成する
config設定ファイルの内容を表示する
create設定ファイルに従ってコンテナを作成する
down作成したコンテナを停止し、コンテナおよび関連リリースを削除する
eventsコンテナから受信したイベントを表示する
exec実行中のコンテナ内でコマンドを実行する
helpヘルプを表示する
killコンテナにシグナルを送信して停止させる
logsコンテナが出力するログを表示する
pauseコンテナを一時停止させる
port公開ポートに関する情報を表示する
ps管理しているコンテナの一覧を表示する
pull管理しているコンテナをPullする
push作成したコンテナイメージをPushする
restart管理しているコンテナを再起動する
rm管理しているコンテナを削除する
run設定ファイルに記述されたコンテナを起動する
scaleコンテナのインスタンス数を変更する
start設定ファイルに従ってコンテナを起動する
stop設定ファイルに従ってコンテナを停止される
top稼動中のプロセス情報を表示する
unpause停止させたコンテナを再開させる
up設定ファイルに従ってコンテナを作成し実行させる
versiondocker-composeのバージョンを表示する

Docker Composeの設定ファイルとプロジェクト、サービス

 Docker Composerでは、YAMLもしくはJSON形式で起動するコンテナなどの設定をファイルに記述する。デフォルトではカレントディレクトリ内の「docker-compose.yml」ファイルが設定ファイルとして使われるが、「-f <ファイル名>」オプションでそれ以外のファイルを設定ファイルとして使用することも可能だ。

 なお、Docker Composeでは「サービス」と「プロジェクト」という単位でコンテナを管理する。コンテナとサービスは単に名前を言い換えただけで、基本的には同じものと考えて良い。また、「プロジェクト」は関連するコンテナをまとめて管理するための仕組みだ。Docker Composeの設定ファイルには複数のコンテナに関する設定が記述可能で、通常は同一の設定ファイルに記述されているコンテナは同じプロジェクトに属することになる。

 デフォルトではプロジェクト名はdocker-composeコマンド実行時のカレントディレクトリが使用される。また、起動されるコンテナには次のような命名規則に従った名前が付けられて管理される。

<プロジェクト名>_<サービス名>_<インスタンス番号>

 たとえば「test01」というディレクトリ内でdocker-composeコマンドを実行して「foobar」というサービスのコンテナを作成した場合、作成されたコンテナには「test01_foobar_1」という名前が付けられる。

 なお、プロジェクト名は「-p <プロジェクト名>」オプションで明示的に指定することも可能だ。