Docker Compose とは?

説明

ここまでのガイドを読み進めながら、コンテナー一つからなるアプリケーションの作業を行ってきました。 実際にはもっと複雑なものが必要になるはずです。 それはデータベース、メッセージキュー、キャッシュといった多くのサービスです。 そのすべてを一つのコンテナーに押し込んでインストールしますか? 複数のコンテナーを起動させますか? 複数のコンテナーとするなら、それらを接続するのはどうやって行いますか?

コンテナーに関してのベストプラクティスは、1 つのコンテナーでは 1 つのことだけを行わせること。 これがうまくいくコツです。 このルールには例外がいくつかありますが、1 つのコンテナーにたくさんの仕事をさせることだけは避けるようにしてください。

複数のコンテナーを起動させるというので docker run コマンドを複数分だけ実行するという方法もあります。 ただしすぐに気づくことになるでしょうが、そこではネットワークの管理が必要となり、さらにはそのネットワークにコンテナーを接続させるためのフラグ類をすべて管理していくなど、さまざまなことをしなければなりません。 それを実現したとしても、今度はそれをきれいに戻すにはさらに複雑な作業となっていきます。

Docker Compose を使うとコンテナーやその設定は、たった一つの YAML ファイル内において定義することができます。 コードリポジトリにこのファイルを置いてさえいれば、そのリポジトリをクローンするユーザーは単純なコマンド一つで実行できるものとなります。

Compose を理解する上で重要なことは、これが宣言タイプのツールであるという点です。 みなさんは単に定義をするだけです。 始めるたびに一から作り出す必要はありません。 修正を行ったなら docker compose up を再度実行するだけで、変更されたファイルの調整を賢く行ってくれます。

Dockerfile 対 Compose ファイル

Dockerfile というものは 1 つのコンテナーイメージをビルドする手順を提供します。 一方 Compose ファイルは実行するコンテナーを定義します。 Compose ファイルはたいていは Dockerfile を参照して、イメージをビルドし所定のサービスを実現するために利用します。

ためしてみよう

このチュートリアルでは、Docker Compose を使って複数コンテナーによるアプリケーションの実行方法について学びます。

ここでは、Node.js を使った簡単な ToDo リストアプリを用いていくことにします。 データベースサーバーには MySQL を使います。

アプリケーションの起動

以下の手順に従って ToDo リストアプリを実行します。

  1. Docker Desktop を ダウンロードおよびインストール します。

  2. 端末画面を開いて サンプルアプリケーションのクローン を取得します。

    git clone https://github.com/dockersamples/todo-list-app
    
  3. todo-list-app ディレクトリに移動します。

    cd todo-list-app
    

    このディレクトリ内には compose.yaml というファイルがあります。 これは YAML ファイルであり、あらゆるものを実現する玉手箱です。 アプリケーションを構成するサービスすべてについて、その定義と設定を行います。 各サービスにおいては、そのイメージ、ポート、ボリューム、ネットワークといった、機能実現に必要となる設定が行われます。 YAML ファイルをしっかりと確認して、この記述形式を覚えてください。

  4. docker compose up コマンドを使ってアプリケーションを実行します。

    docker compose up -d --build
    

    コマンドを実行すると以下のような出力が得られます。

    [+] Running 5/5
    ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled          7.1s
      ✔ e6f4e57cc59e Download complete                          0.9s
      ✔ df998480d81d Download complete                          1.0s
      ✔ 31e174fedd23 Download complete                          2.5s
      ✔ 43c47a581c29 Download complete                          2.0s
    [+] Running 4/4
      ⠸ Network todo-list-app_default           Created         0.3s
      ⠸ Volume "todo-list-app_todo-mysql-data"  Created         0.3s
      ✔ Container todo-list-app-app-1           Started         0.3s
      ✔ Container todo-list-app-mysql-1         Started         0.3s
    

    いろいろな出力が行われます。 ここでは以下のような処理が示されています。

    • 2 つのコンテナーイメージ、つまり node と MySQL が Docker Hub からダウンロードされました。
    • アプリケーション向けに 1 つのネットワークが生成されました。
    • ボリュームが 1 つ生成されました。 これによりコンテナーが再起動されても、データベースファイルが保持されることになります。
    • 必要となる設定に基づいて 2 つのコンテナーが起動します。

    情報が多すぎると思っても心配無用です。 これからマスターしていきましょう。

  5. すべてが出そろい起動が行われたら、ブラウザーから http://localhost:3000 にアクセスしてサイトを確認します。 アイテムの追加、確認、削除をさまざまに行ってみてください。

    ポート 3000 で動作する ToDo リストアプリケーションウェブページのスクリーンショット
  6. Docker Desktop GUI 画面を確認してみると、コンテナーが一覧に表示されていて、その設定も細かく確認することができます。

    A screenshot of Docker Desktop dashboard showing the list of containers running todo-list app

アプリケーションの停止

アプリケーションを Docker Compose を使って起動したので、作業を終えたらアプリケーション停止も簡単に行うことができます。

  1. CLI の中から docker compose down コマンドを使います。 これを使ってすべてを削除します。

    docker compose down
    

    以下のようなメッセージが出力されるはずです。

    [+] Running 3/3
    ✔ Container todo-list-app-mysql-1  Removed        2.9s
    ✔ Container todo-list-app-app-1    Removed        0.1s
    ✔ Network todo-list-app_default    Removed        0.1s
    

    ボリュームの永続性

    Compose 関連コンテナー類をダウンさせたとしても、ボリュームはデフォルトでは自動的に削除_されません_。 再度 Compose コンテナー類を再度立ち上げた際には、データを再利用したいと思うはずだからです。 ボリュームも同時に削除したいのであれば、docker compose down コマンドを実行する際に --volumes フラグをつけてください。

    docker compose down --volumes
    [+] Running 1/0
    ✔ Volume todo-list-app_todo-mysql-data  Removed
    
  2. 別の方法として Docker Desktop GUI を使うなら、画面上のアプリケーションを選択した上で Delete (削除) ボタンを押せば、コンテナー類を削除することができます。

    Docker Desktop GUI におけるコンテナー一覧と "Delete" ボタンにマウスカーソルが当たったスクリーンショット

    GUI で操作する Compose コンテナー類

    GUI を使って Compose アプリのコンテナーを削除する場合、削除されるのはコンテナーのみとなります。 それ以外のネットワークやボリュームは、必要なら手動で削除しなければなりません。

このウォークスルーを通じて Docker Compose を使った、マルチコンテナーアプリケーションの起動と停止の仕方を学びました。

さらなる情報

このページでは Compose について簡単に説明しました。 以下の項目を見れば、Compose への理解をさらに深めることができ、Compose ファイルの書き方を学ぶことができます。