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

コンテナ起動コマンドの挙動の違い

 docker-composeコマンドでは、「up」以外にもコンテナを起動させるサブコマンドとして「create」や「run」、「start」が用意されている。createサブコマンドではコンテナの作成のみを行い、実行は行わない点が異なる。

 また、runサブコマンドは環境変数や公開ポート、コンテナ内で実行するコマンドを詳細に指定できる点が異なる。作成されるコンテナ名がデフォルトでは「<プロジェクト名>_<サービス名>_run_<インスタンス番号>」になるのも相違点だ。

 startサブコマンドは停止状態にある既存のコンテナを実行させるもので、createサブコマンドで作成したコンテナや、stopサブコマンドで停止させたコンテナを実行させる際に利用できる。

ボリュームやネットワークの設定

 Docker Composerではコンテナだけでなく、ボリュームやネットワークの設定を設定ファイルに記述して自動作成させることも可能だ。この場合、設定ファイルの「volumes:」や「networks:」以下にそれぞれの情報を記述する。

 たとえばボリュームについては、以下のように定義できる。

volumes:
  <ボリューム名1>:
    driver: <ドライバ名>
    driver_opts:
      <オプション1>: <値>
      <オプション2>: <値>
      
      
  <ボリューム名2>:
    driver: <ドライバ名>
    driver_opts:
      <オプション1>: <値>
      <オプション2>: <値>
      
      

 また、ネットワークについては、以下のように定義できる。

networks:
  <ネットワーク名1>:
    driver: <ドライバ名>
    driver_opts:
      <オプション1>: <値>
      <オプション2>: <値>
      
      
  <ネットワーク名2>:
    driver: <ドライバ名>
    driver_opts:
      <オプション1>: <値>
      <オプション2>: <値>
      
      

 ボリュームやネットワークについては、それぞれDockerのボリューム/ネットワーク機能と同様に設定が行える。Dockerのボリューム機能については「Dockerのボリュームプラグインとストレージドライバ(Dockerの最新機能を使ってみよう:第2回)」記事で、ネットワーク機能については「Dockerのマルチホストネットワークで複数ホスト間を繋ぐ仮想ネットワークを作る(Dockerの最新機能を使ってみよう:第1回)」記事で説明しているので、詳しくはそちらを参照して欲しい。

ビルド用の設定の記述

 Docker Composeでは、コンテナイメージのビルドを行うための設定も記述できる。この設定は、「build:」以下に記述する。ただし、Docker Composeはあくまで「docker build」コマンドのラッパー的に動作するだけで、別途ビルド設定ファイル(Dockerfile)等が必要となる。

 たとえば、compose.ymlファイルと同じディレクトリ内にあるbuildディレクトリ内にDockerfileやそのほかビルドに必要なファイルが格納されている場合、以下のようになる。

build:
  context: ./build  ←ビルドに必要なファイルが格納されているディレクトリ
  dockerfile: Dockerfile  ←使用するDockerfile
  args:  ←ビルド時に指定するオプションパラメータ
    <パラメータ1>: <値>
    <パラメータ2>: <値>
    
    

設定ファイルを分離する

 docker-composeのデフォルトの動作では、カレントディレクトリのdocker-compose.ymlファイルに加えて、「docker-compose.override.yml」というファイルも設定ファイルとして認識して読み込もうとする。この際の挙動としては、まずdocker-compose.ymlファイルを読み込み、続いてdocker-compose.override.ymlファイルの内容をそれに追加/上書きする、という流れになる。また、docker-composeコマンドの「-f <設定ファイル>」オプションを複数使用することでも複数の設定ファイルを指定することが可能だ。こちらの場合、後から指定したファイルの内容が先に読み込まれていた設定ファイルの内容に追加/上書きされる形になる。

 これを利用することで、1つのファイルには共通して利用する設定を記述し、環境毎に異なる設定については2つめのファイルに記述する、といったような、複数のファイルに設定内容を分割して記述することが可能となる。

将来的にはDockerのクラスタ機能との連動も可能に

 現時点では、Docker Composeでは単一のホスト、もしくはDocker Swarmを利用して構築されたDockerクラスタでの利用しかサポートされていない。その代わりにDocker 1.12以降で実装された「Stacks」という機能を利用して、Docker Composeの設定ファイルをベースにSwarm Modeを使ったクラスタ上でコンテナを実行できるようになっている。

 Stacks機能は、簡単に説明するとdocker-composeコマンドの「bundle」サブコマンドを実行することで、Stacksで使用される「distributed application bundle」と呼ばれる設定ファイルを作成でき、これをdockerコマンドの「deploy」サブコマンドの引数として与えて読み込ませることで、複数のコンテナをDockerクラスタ上にデプロイできる、というものになっている。近年Dockerは「オーケストレーション」と呼ばれる、クラスタの構築やコンテナのデプロイなどに注力しているが、複数コンテナの自動デプロイについてはDocker本体には取り込まれていなかった。しかし、DockerのStacks機能でついにそれが実現することになる。

 Docker Composeは複数のコンテナを立ち上げる場合だけでなく、多数のオプションをコンテナに指定するようなケースでも便利だ。DockerのStacks機能の予習の意味も含めて、一度試してみてはいかがだろうか。