T-CREATOR

Docker Compose使い方:複数コンテナをまとめて管理するやり方を紹介

Docker Compose使い方:複数コンテナをまとめて管理するやり方を紹介

Docker Composeは、複数のコンテナをまとめて管理できる非常に強力なツールです。
これにより、開発・本番環境を問わず、システム全体を効率的に構築・運用できます。

今回は、Docker Composeの基本的な使い方複数コンテナの連携を、初心者の方にもわかりやすくご紹介いたします。

公式ドキュメントもあわせてご参照ください:Docker公式Composeドキュメント

Docker Composeとは何か

Docker Composeは、複数のコンテナをまとめて定義し、操作できるツールです。

単体のコンテナ起動とは異なり、データベースやアプリケーションサーバーなど、関連するサービスをまとめて一括管理できることが最大の魅力です。

項目内容
使用ファイルdocker-compose.yml
主なコマンドdocker-compose up, docker-compose down
メリット複数コンテナの一括起動、設定管理、ネットワーク自動構築

インストール方法

Docker Desktopをインストールしている場合、Composeも一緒にインストールされています。
個別にインストールしたい場合は、以下を参考にしてください。

公式インストールガイド:Compose installation guide

基本的な構成ファイル:docker-compose.yml

Composeを使うには、まず docker-compose.yml ファイルを作成する必要があります。
このファイルには、起動したいサービスごとの設定を記述します。

以下に最もシンプルな例を示します。

yamlversion: "3.9"  # Composeファイルのバージョン指定
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

この例では、Nginxの最新イメージを使って、ポート8080でアクセスできるWebサーバーを起動しています。

Composeの基本コマンド

Docker Composeでは、以下のコマンドが基本になります。

コマンド内容
docker-compose upコンテナを起動(ビルドも自動で実施)
docker-compose downコンテナを停止して破棄
docker-compose ps実行中のサービス一覧を表示
docker-compose logsサービスのログを確認
docker-compose buildイメージをビルド

実際にコマンドを打つ例を見てみましょう。

bash# サービスを起動(バックグラウンドで実行)
docker-compose up -d

# コンテナを停止してネットワークなども破棄
docker-compose down

# 起動中サービスを一覧表示
docker-compose ps

複数サービスを定義する方法

実際のアプリケーションでは、Webサーバーとデータベースを同時に起動したいケースが多いです。

例えば、Nginx + MySQL の場合、次のように記述できます。

yamlversion: "3.9"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

この設定では、webサービスがdbサービスに依存して起動順が制御されます。

depends_onの詳細は公式リファレンスをご覧ください:depends_on - Compose file reference

ネットワーク設定を理解する

Docker Composeでは、デフォルトで専用のネットワークが作成されます。

そのため、異なるサービス間でホスト名(サービス名)を使って通信できます。

例えば、上記の例ではwebからdbというホスト名でMySQLにアクセス可能です。

さらに、カスタムネットワークを明示的に定義することも可能です。

yamlversion: "3.9"
services:
  web:
    image: nginx
    networks:
      - mynetwork
  db:
    image: mysql
    networks:
      - mynetwork

networks:
  mynetwork:
    driver: bridge

これにより、複数プロジェクト間でネットワークを分離管理できるようになります。

ボリューム設定を理解する

データをコンテナ削除後も保持したい場合は、ボリューム設定を活用します。

yamlversion: "3.9"
services:
  db:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

これで、データベースデータがホスト側に保存され、コンテナを消してもデータが消えません。

ボリュームの詳細はこちらをご参照ください:Docker volumes公式ドキュメント

環境変数を使った設定

Composeファイルでは、環境変数(.envファイル を使って設定値を管理できます。

例えば以下のように .env ファイルを用意します。

iniMYSQL_ROOT_PASSWORD=mysecretpassword

そしてComposeファイル内では次のように参照できます。

yamlversion: "3.9"
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

これにより、設定値をファイル分離して管理できるので、セキュリティやメンテナンス性が向上します。

開発・本番環境を切り替える方法

通常、開発環境と本番環境では使用する設定が異なります。
Docker Composeでは、複数のComposeファイルを組み合わせて管理できます。

例えば次のようなファイル構成にすることが一般的です。

plaintextdocker-compose.yml          # 共通設定
docker-compose.override.yml # 開発用設定
docker-compose.prod.yml     # 本番用設定

開発用のdocker-compose.override.ymlは、docker-compose upコマンド実行時に自動で読み込まれる仕様です。

一方、本番用設定を使う場合は、明示的にファイルを指定して起動します。

bashdocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

ファイルを複数指定すると、後に指定したファイルが優先されます。
つまり、共通設定に対して本番用の上書きを行う流れになります。

参考リンク:複数Composeファイルの活用方法

サービスを柔軟に制御するprofiles機能

Compose v3.9以降では、profilesという機能も追加されています。

これは、起動するサービスをプロファイル単位で制御できる機能です。

たとえば、開発時だけ使うモックサーバーなどをプロファイルに分けられます。

yamlversion: "3.9"
services:
  web:
    image: nginx
  mock-server:
    image: my-mock-server
    profiles:
      - dev

起動時に以下のように指定できます。

bashdocker-compose --profile dev up

これにより、本番環境には不要なサービスを簡単に除外できるようになります。

公式ドキュメントもぜひご参照ください:profiles機能について

コンテナの正常性をチェックするhealthcheck

運用面で非常に重要なのが、コンテナのヘルスチェック機能です。

サービスが正しく動いているかをチェックし、異常時にはリトライ処理などに活かせます。

設定例は以下の通りです。

yamlversion: "3.9"
services:
  db:
    image: mysql:5.7
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 5

この設定では、30秒ごとにMySQLへの接続確認を行い、5回失敗したら異常と判定します。

コンテナのヘルスチェック詳細:Docker Healthcheckガイド

サービス間で環境変数を共有する方法

複数コンテナ間で共通設定を持たせたい場合は、環境変数を共有できます。

env_fileを使う方法が簡単です。

yamlversion: "3.9"
services:
  web:
    image: nginx
    env_file:
      - ./common.env
  api:
    image: node
    env_file:
      - ./common.env

この例では、common.envファイルの内容が、両方のサービスに適用されます。

サービス間で設定を統一できるため、環境構築ミスを防ぎやすくなります

ビルド用DockerfileをComposeから直接指定する

アプリケーションを独自ビルドしたい場合、Composeから直接Dockerfileを指定することも可能です。

yamlversion: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"

この設定では、プロジェクトルートにあるDockerfile.devを使ってイメージをビルドし、その上でコンテナを起動します。

contextとdockerfileの使い方:Compose buildオプション

実際の運用パターン例

ここでは、開発・本番両方で運用する具体例をご紹介します。

1. 開発環境

bashdocker-compose up -d
  • overrideファイルでボリュームマウント
  • ホットリロード対応(Node.jsなど)

2. 本番環境

bashdocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
  • 本番ビルドイメージ使用
  • ボリュームマウント無し
  • キャッシュ戦略最適化

よくあるトラブルと対策

Docker Composeを使っていると、いくつか典型的なトラブルに遭遇することもあります。

問題原因解決策
コンテナが起動しないdepends_onだけではサービスの起動完了は保証しないhealthcheckを設定してリトライ設計にする
ネットワークで通信できないサービス名を間違えているservices間ではサービス名がホスト名となる
環境変数が反映されない.envファイルの位置・記述ミスファイルの位置とフォーマットを再確認

まとめ

Docker Composeは、複数のコンテナをまとめて定義・操作できるツールであり、開発・運用において非常に大きな効果を発揮いたします。

この記事では、基本的な使い方から、応用的な活用方法まで幅広くご紹介してまいりました。

ポイントを振り返ってみましょう。

カテゴリ内容
基本操作docker-compose.ymlで複数サービスを管理、updownで起動停止
ネットワーク・ボリューム管理自動生成されるネットワーク、データ永続化のためのボリューム活用
環境変数管理.envファイルやenv_fileで設定値の外部化
複数環境対応開発用・本番用のComposeファイルを切り替えて管理
profiles機能必要なサービスだけを選択的に起動できる柔軟性
healthcheck機能コンテナの正常性をチェックし、堅牢な運用を実現
カスタムビルド独自Dockerfileによるイメージ作成とCompose連携
トラブル対策通信不良や環境設定ミスへの基本的な対応法

Composeの導入により、一貫性のある環境構築運用効率の劇的な向上が期待できます。

また、開発だけでなく、本番環境でも活用できる点は大きな強みであり、特にチーム開発・CI/CDパイプラインと相性が良い点も魅力です。


これからDocker Composeを使い始める方は、まず小さなプロジェクトで練習し、次第にサービス数を増やしていくと、自然と使いこなせるようになります。

さらに詳しい情報は、以下の公式リンクも活用しながら、ぜひ実際に手を動かして学んでみてください。

Docker Composeを味方につければ、開発も運用も、もっと自由に、もっと強くなります。

皆様のDockerライフが素晴らしいものになることを心より願っております!

記事Article

もっと見る