docker-compose とは? インストールと基本設定

DevOps

はじめに

コンテナ技術が注目を集めていますが、そのなかでdocker-composeは複数のコンテナを一括管理するために役立つツールとして知られています。
しかし、初心者の方にとっては「そもそもdocker-composeって何なのだろう?」という疑問が大きいかもしれません。
また、インストール方法や基本的な設定手順がよくわからずに困っている方も多いのではないでしょうか。

そこで本記事では、docker-composeの基本概念やインストール手順、さらにすぐに使える設定方法などをわかりやすくまとめます。
複数のコンテナを同時に起動・停止する場面が多い現代の開発環境では、docker-composeを覚えておくと格段に作業がラクになるはずです。

この記事を読むとわかること

  • docker-composeの基本概念
  • インストール手順と設定方法
  • dockerコマンドとの違いと活用メリット
  • docker-compose.ymlファイルの書き方と運用ポイント
  • 実務で役立つ具体的な活用シーン

以下の内容をじっくり読んでいただくことで、docker-composeを使った開発環境の整備や基本的な運用のイメージが掴めるようになるでしょう。

docker-composeとは?

docker-composeの概要

docker-composeは、複数のDockerコンテナをまとめて定義し、一括で管理・起動・停止できるようにするためのツールです。
通常、Dockerコンテナは個別にdocker runコマンドなどで起動しますが、大規模なアプリケーションでは、Webサーバ・データベース・キャッシュ・メッセージキューなど複数のサービスが必要になるケースがよくあります。
そこでdocker-composeを使うことで、コンテナ群を「どのイメージを使うか」「どんなネットワーク設定にするか」「どのポートを公開するか」といった情報を1つのYAMLファイルにまとめ、あとは単一のコマンド操作で作業を完結できます。

dockerコマンドとの違い

Docker単体でもイメージのビルドやコンテナ起動は可能ですが、複数のコンテナを起動する際はコマンドを何度も打ち直す必要があります。
一方、docker-composeでは**「設定ファイル化」**によってサービス定義をまとめるため、一度書いた設定に基づいて一括操作が可能です。
頻繁にコンテナを立ち上げ直したり、作業環境を丸ごと再現したりするとき、docker-composeによって効率化を実感する場面が多いでしょう。

複数コンテナ管理のメリット

docker-composeを利用すると、以下のようなメリットが得られます。

  • 複数コンテナをまとめて起動・停止できる
  • 設定ファイルを共有すればチームメンバーが同じ環境を簡単に再現できる
  • コマンドを1回実行するだけなのでタイポや設定漏れのリスクを減らせる

大規模な開発になるほど、サーバやデータベース、外部サービスなど複数の要素を扱うケースが増えます。
docker-composeを使えば、環境構築やメンテナンスがシンプルになることが期待できるはずです。

docker-composeのインストール手順

インストールに必要な準備

docker-composeを導入するには、まずDocker本体が正常に動作している必要があります。
WindowsやmacOSの場合は、Docker Desktopをインストールするのが一般的です。
Linuxの場合は、パッケージマネージャを使ってDockerを導入したうえで、docker-composeを別途インストールします。

Docker自体のインストールが済んでいない方は、公式ドキュメントなどを参考にしてDockerをセットアップしてください。
Dockerが正常に動くことが確認できたら、次にdocker-composeを利用可能にします。

インストール方法(Windows/Mac/Linux)

WindowsやmacOSの場合、Docker Desktopにdocker-composeが同梱されている場合があります。
そのため、特別な設定をしなくてもdocker-composeコマンドがすぐ使えるケースが多いです。
もし使えない場合は、Docker Composeプラグインをインストールし、パスが通っているか確認します。

Linuxの場合は、ディストリビューションによって少し手順が異なります。
UbuntuなどDebian系であれば、sudo apt-get install docker-compose-pluginのような形で導入できます。
インストール後、docker compose versionのようにしてバージョン情報を確認してください。
これでdocker-composeの環境が整ったら、次のステップとして設定ファイルの書き方を学びましょう。

docker-composeの基本設定

docker-compose.ymlの基本構成

docker-composeでは、docker-compose.ymlというファイルに設定を記述します。
このファイル内には、起動したいサービス(コンテナ)の名前と、使うDockerイメージ、ポート設定などを定義します。
基本的なテンプレートとしては以下のようになります。

version: "3"
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=pass123

servicesの下にwebdbといったサービス名を列挙し、それぞれに必要な設定をYAML形式で書き込んでいきます。
versionでdocker-composeファイルのフォーマットバージョンを指定し、ファイル全体をきちんと解釈してもらうために利用するイメージです。

サービス・ネットワーク・ボリューム

docker-compose.ymlでは、サービス定義以外にもネットワークボリュームを記述できます。
たとえば、サービス同士を同じネットワーク内で通信させたい場合は、以下のように明示的に書く場合があります。

networks:
  my-network:
    driver: bridge

さらにデータの永続化を行う際は、ボリュームの設定が重要です。
データベース用のデータをコンテナ削除時に消さないようにするために、ボリュームを定義してコンテナにマウントします。

volumes:
  db-data:

これをサービス定義の中で指定することで、コンテナ停止後も重要なデータが失われないようにできます。

実務での使用例

実務では、Webサーバ、DB、キャッシュサーバ、APIサーバなど、複数のコンテナが連携することが多いです。
docker-compose.ymlを用意しておけば、環境構築のたびにコンテナ起動コマンドを打ち直すことなく、一度にサービスを立ち上げられます。
開発チームでは、この設定ファイルをGitなどのリポジトリに含めて共有することで、メンバー全員が同じ環境を短時間で再現できるようになり、作業効率やトラブルシューティングのスピードが大きく向上するでしょう。

docker-composeを使ったアプリ起動

docker-compose upコマンドの使い方

docker-composeの使い方はシンプルです。
まず、作成したdocker-compose.ymlと同じディレクトリに移動します。
次に、以下のコマンドでコンテナ群を一括起動します。

docker compose up -d

-dオプションをつけると、コンテナがバックグラウンドで起動するため、ターミナルを占有されずに操作ができます。
起動後はdocker compose psコマンドで、現在どのコンテナが動いているかを確認可能です。

実務でのメリット

複数コンテナを同時に動かす状況は、Webアプリ開発において日常茶飯事です。
WebサーバとDB、認証サービス、ログ収集サービスなど、関連するサービスが多くなると、手動で1つ1つ起動するのは手間がかかります。
docker-composeなら、設定ファイルをベースにまとめて操作できるため、人的ミスの削減設定の再利用を同時に実現できます。

さらに環境によって異なるポート番号やリソース制限を設定するときも、docker-compose.ymlを切り替えたり、複数用意したりするだけで簡単に切り替えが可能です。
プロジェクトが大きくなるにつれて、こういった一括管理の重要性はどんどん増していきます。

docker-composeにおけるコンテナ連携

WebサーバとDB連携の例

Webアプリケーションを動かすうえで、Webサーバとデータベースの連携は基本的な構成です。
docker-composeでは、以下のようにサービス定義内でホスト名を指定し、名前解決によってコンテナ同士が通信できます。

services:
  web:
    build: ./web
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=pass123

depends_onは起動順を制御する機能で、ここではwebdbに依存しているため、dbコンテナの起動を待ってからwebコンテナが起動されます。
Webアプリ側の接続先ホスト名としてdbを指定するだけで、同一ネットワーク内にあるMySQLにアクセスできます。

他のサービスとの連携ポイント

RedisやElasticsearch、RabbitMQなどを組み合わせると、さらに複雑なマイクロサービス構成を構築できます。
このとき、ネットワーク設定をしっかり管理し、サービス名で名前解決できるようにするとコンテナ間通信がスムーズです。
また、ログ収集用のコンテナを追加する場合も、docker-compose.ymlにサービスを追加すればまとめて管理できるようになります。

コンテナ間連携を多用すると設定ファイルは長くなりがちですが、YAMLのコメントや適切な命名を心がけることで可読性を確保することが重要です。

環境変数の扱い方

dotenvファイルを利用する

docker-composeでは、環境変数を扱うことで柔軟に設定を切り替えることができます。
環境変数を定義した.envファイルを用意しておき、docker-compose.ymlから呼び出す方法が一般的です。

DB_ROOT_PASSWORD=pass123
APP_PORT=3000
version: "3"
services:
  app:
    image: myapp
    environment:
      - DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
    ports:
      - "${APP_PORT}:3000"

このように書くと、.envに定義された値が自動的に使われます。
ローカル開発環境と本番環境で値を変えたい場合に、この方法を使って設定の切り替えが行えます。

セキュリティ面での注意

アプリケーションによっては、データベースのパスワードやAPIキーなど、機密情報を環境変数で管理することもあるでしょう。
その際は、.envファイルをバージョン管理リポジトリに含めないようにするなど、セキュリティ対策が欠かせません。
どこかに誤って公開してしまうと情報漏えいにつながる恐れがあるため、チーム内でも環境変数の扱いルールを明確に決めておく必要があります。

docker-composeでよく使うオプション

build, scale, logs, downなど

docker compose up以外にも、docker-composeにはさまざまなコマンド・オプションがあります。
代表的なものとして以下が挙げられます。

  • docker compose build: イメージのビルドを実行
  • docker compose scale: 指定したサービスのコンテナ数を増減
  • docker compose logs: コンテナのログをまとめて確認
  • docker compose down: コンテナやネットワーク、ボリュームを停止・削除

scaleコマンドを使うと、Webサーバなどを複数インスタンス立ち上げることができ、負荷試験や高トラフィックを想定した動作確認に便利です。

トラブルシューティングのヒント

docker-composeを使っていると、コンテナが起動しない、ネットワーク接続ができないなどのトラブルに遭遇することがあります。
その際は、まずdocker compose logsコマンドで各コンテナのログを確認し、エラーメッセージを手がかりに原因を調査するのが良いでしょう。
また、docker compose psでコンテナの状態をチェックし、ステータスがUpでなければ設定ファイルの記述漏れやネットワーク設定ミスがないか確認します。

コンテナ間通信がうまくいかない場合は、ネットワーク名やサービス名、エクスポートしているポート番号をもう一度見直してみましょう。

具体的な活用シーン

ローカル開発環境の構築

ローカル環境で複数のサービスを扱うとき、ホストマシンに直接インストールすると競合や依存関係の問題が発生しがちです。
docker-composeを使えば、各サービスをコンテナ化して独立した状態で動かせるので、開発環境を壊すリスクを抑えられます。
たとえばNode.jsとMySQLを同時に利用する場合でも、docker-compose.ymlに両者を記述しておけばワンコマンドで起動できるでしょう。

テスト環境での使い方

機能テストや統合テストなどの自動化を行う際にも、docker-composeが役立ちます。
テスト前にdocker compose up -dで必要なコンテナを立ち上げ、テスト完了後にdocker compose downでクリーンな状態に戻すというサイクルをスクリプト化できます。
これにより、テストコードが動くたびに毎回同じ環境が用意されるため、環境差によるテスト結果のブレを減らすことができるでしょう。

チーム開発時の利点

複数人で開発を進める場合、各メンバーのローカル環境を合わせる作業に時間を取られがちです。
docker-compose.ymlをプロジェクトに含めてしまえば、誰でも同じDockerイメージ・設定ファイルを使ってコンテナを起動できるので、環境構築に要する手間が大幅に軽減されます。
「自分の環境ではうまく動くのに他のメンバーでは動かない」という不一致も減らすことが期待できます。

実務でのdocker-compose運用のポイント

障害対応やデバッグのコツ

docker-compose運用時には、予期せぬエラーや障害が起きることがあります。
そのような場合は、ログの確認コンテナのステータスを細かくチェックして、問題のコンテナやネットワークを特定します。
特定できたら、該当コンテナを個別に再起動してみたり、設定ファイルの修正を加えて再度docker compose up -dを実行して改善を試みます。
本番運用では、サーバリソースの監視やログの集約などと組み合わせ、早期にトラブルを検知して解決できるように準備しておくことが大切です。

YAMLファイルの管理戦略

docker-compose.ymlをカスタマイズしていくと、設定が肥大化するケースがあります。
サービスが10個、20個と増えるとファイルが見にくくなり、間違いも起こりやすくなります。
そこで実務では、複数のdocker-composeファイルを用途別に分割する、あるいはdocker compose -fオプションで特定のファイルを読み込むなどの管理方法がよく使われます。

また、本番用・ステージング用・ローカル用などでファイルを分けておくと、環境ごとの違いを誤ってコミットしてしまうリスクが減ります。
ファイルの分割と合わせて、コメントを活用しながら可読性を確保することが成功のポイントと言えるでしょう。

docker-composeと他のツールとの比較

Kubernetesとの違い

コンテナオーケストレーションを考えるとき、しばしばKubernetesが比較対象として挙げられます。
Kubernetesは大規模なコンテナ運用を効率化するプラットフォームで、複数のノードにまたがる自動スケーリングや高度なヘルスチェック機能などが特徴です。
一方、docker-composeは単一のサーバや開発環境で手軽に使うことを想定しており、学習コストが低い点が大きな利点です。

Kubernetesが向いているのは、本番で多数のコンテナ群を分散管理するような大規模システムです。
対してdocker-composeは、少人数の開発チームや個人プロジェクト、ローカルテスト環境などに向いています。
プロジェクトの規模や運用体制によって使い分けるのが現実的でしょう。

他のオーケストレーションツールとの比較

docker-composeのほかにも、Docker SwarmやNomadといったコンテナオーケストレーションツールがあります。
しかしながら、docker-composeは構成ファイルが分かりやすい点や導入の手軽さから、開発環境での使用に特化した人気ツールとなっています。

大規模運用ではKubernetes、シンプルに複数コンテナを管理したいならdocker-composeという住み分けが多い印象です。
ツール選定ではコストや運用体制を含め、プロジェクトの性質を踏まえて判断する必要があります。

docker-composeを使う上での注意点

過度に複雑な構成は避ける

どんなに便利なツールでも、構成が複雑になりすぎると管理が難しくなります。
docker-composeであまりに多くのサービスを一度に起動すると、ひとつのエラーが全体のトラブルに直結するリスクも高まるでしょう。
そのため、用途に合わせてファイルを分割したり、必要最小限のサービスだけを管理したりする方が運用上の混乱を抑えられます。

セキュリティやリソース管理の配慮

docker-composeはあくまで複数コンテナを一括で扱うツールであり、セキュリティ管理そのものを自動でやってくれるわけではありません。
たとえば外部からアクセスが必要ないコンテナにはポートを公開しないようにする、機密情報を環境変数に含めないよう注意するなど、通常のDocker運用と同じセキュリティ対策が必要です。

また、マシンのリソースが限られている環境で一度に多数のコンテナを起動すると、メモリ不足やCPU負荷が高くなる場合があります。
コンテナの数が増えたときには、割り当てリソースの最適化やホストマシンのスペック拡張なども検討する必要があるでしょう。

必要に応じてdocker-compose.ymlを複数用意し、小さな単位に分割して管理することが大切です。

まとめ

docker-composeは、複数のDockerコンテナを効率よく扱うための実用的なツールです。
初めはdocker-compose.ymlファイルの書き方やネットワーク設定に戸惑うかもしれませんが、慣れてくると「必要なサービスの構成を1つのファイルで定義し、一瞬で環境を再現できる」という利便性を大いに実感できるでしょう。

特に、開発やテストで複数のコンテナを立ち上げる必要がある場合、docker-composeを導入すれば作業効率が大幅に向上することが期待できます。
単なるコンテナの起動・停止だけでなく、YAMLファイルの管理方法やセキュリティ面の考慮、環境変数の扱い方など、押さえておくべきポイントは多岐にわたります。

本記事で解説したインストール手順や基本設定をベースに、ぜひdocker-composeを活用した開発を始めてみてください。
少しずつ慣れていけば、複数サービスを簡単に起動し、トラブルシューティングも素早く行えるようになるはずです。
これを機に、コンテナを使った開発効率化にぜひ挑戦してみてはいかがでしょうか。

Dockerをマスターしよう

この記事で学んだDockerの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。