Docker Compose
Docker Compose
概要(サマリー)
Docker Compose(ドッカーコンポーズ)は、複数の Docker コンテナ(仮想的なアプリケーション実行環境)をまとめて定義し、1つのコマンドで一括して起動・停止・管理するためのツールである。
たとえば、「Webサーバー」と「データベース」といった、連携して動く複数のシステムを、複雑な設定なしで同時に立ち上げることができる。
詳細解説
Docker Composeとは何か
Docker Composeは、あらかじめ docker-compose.yml という設定ファイルに、どのようなコンテナを起動するか、コンテナ同士をどう接続するかといった「設計図」を記述しておくためのツールである。
Docker単体(docker run コマンド)でもコンテナを動かすことは可能だが、サービスが大きくなり「Webアプリサーバー」「データベースサーバー」「キャッシュサーバー」など複数のコンテナが必要になると、手動で1つずつコマンドを叩いて繋げるのは非常に手間がかかる。Docker Composeを使うことで、これらの構成を1つのファイルでスマートに一元管理できるようになる。
なぜDocker Composeが必要なのか
Docker単体で複数のコンテナを動かそうとすると、以下のような問題が発生する。
- コンテナごとに長い起動コマンドを何度も入力しなければならない
- コンテナを起動する「順番」を人間が意識して制御する必要がある
- コンテナ同士が通信できるようにするためのネットワーク設定(IPアドレスやリンク)が複雑になる
Docker Composeを使うと、ネットワークの設定や基本的な起動順序を設定ファイルで管理できるため、誰のパソコンでも「コマンド1つ」で同じようなマルチコンテナ環境を再現しやすくなる。特にローカル環境で、Webアプリとデータベースをまとめて立ち上げたいときに便利である。
docker-compose.ymlの基本構成
Docker Composeでは、YAML(ヤムル)形式のファイルに構成を記述する。以下は、PHP(Webサーバー)とMySQL(データベース)を連携して起動するための最小限の docker-compose.yml の例である。
docker-compose.ymlの記述例
services:
# Webサーバーのコンテナ定義
web:
image: php:8.2-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
# データベースサーバーのコンテナ定義
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret_password
MYSQL_DATABASE: my_app_db
services: 起動したいコンテナのリストを定義する。ここではwebとdbという2つのコンテナを作っている。ports: パソコン側(ホスト)のポートとコンテナ側のポートを繋ぐ(マッピング)。この例では、ブラウザでhttp://localhost:8080にアクセスすると、コンテナの80番ポート(Webサーバー)に繋がる。volumes: パソコン上のフォルダ(./src)とコンテナ内のフォルダを同期させ、コードの書き換えが即座に反映されるようにする。depends_on: 起動の依存関係を示す。ここでは、webより先にdb(データベース)を起動するように指定している。ただし、短い書き方のdepends_onは「データベースが接続を受け付ける準備完了」まで常に待つものではない。必要に応じてhealthcheckなども組み合わせて確認する。
Docker Composeの基本コマンド
Docker Composeの操作は、docker-compose.yml が置いてあるディレクトリで、ターミナルから以下のコマンドを実行する。
Docker Composeの操作コマンド
# すべてのコンテナを一括で起動(バックグラウンド実行)
docker compose up -d
# コンテナの動作状態を確認
docker compose ps
# 動いているコンテナのログをリアルタイム表示
docker compose logs -f
# コンテナを一括停止し、削除する
docker compose down
コンテナを起動する際は docker compose up を使い、終わったら docker compose down で綺麗に片付けることができる。
AIコーディングとの関係
AIコーディングにおいて、Docker Composeの設定ファイルの作成はAIが非常に得意とする分野である。
AIに指示を出す際は、自分が作りたい環境の構成要素を具体的に伝えると良い。
- 「Next.jsのフロントエンドと、PostgreSQLのデータベースを連携してローカルで動かすための
docker-compose.ymlを書いてください」 - 「WordPressとMySQLの環境をDocker Composeで構築するためのファイル構成と、起動コマンドを教えてください」
AIは環境変数(.env)とDocker Composeの連携も含めて、設定ファイルのたたき台を作る助けになる。ただし、ポート番号、データの永続化、パスワードの扱い、公式イメージごとの必須設定はプロジェクトによって変わるため、生成結果をそのまま使わず、公式ドキュメントや実際の起動ログで確認することが大切である。
よくある勘違い
Docker ComposeはDockerと全く別のツール?
Docker ComposeはDockerの機能を拡張・補助するためのツールであり、完全に独立した別物ではない。Docker Composeを動かすには、パソコンに「Docker Desktop」などのDocker本体がインストールされている必要がある。
Docker Composeは本番環境では使えない?
本番環境でも使われることはあるが、本番環境のインフラが大規模(複数のサーバーをまたぐなど)になると、Docker Composeではなく「Kubernetes(クバネティス)」や各種クラウドのコンテナ管理サービス(ECSなど)が使われることが一般的である。Docker Composeは主に「ローカル開発環境の構築」で最大の威力を発揮する。
depends_onを書けばデータベースの準備完了まで待ってくれる?
短い書き方の depends_on だけでは、依存先のコンテナを先に起動することはできても、データベースが接続を受け付けられる状態になったことまで保証するとは限らない。アプリ側がすぐに接続して失敗する場合は、healthcheck、リトライ処理、起動待ちの設定などを組み合わせて考える必要がある。
docker-composeコマンドとdocker composeコマンドは同じ?
現在は docker compose のように、Docker CLIのサブコマンドとして使う書き方が主流である。古い記事や環境では docker-compose というハイフン付きコマンドが出てくることもあるが、初心者はまず公式ドキュメントに合わせて docker compose を覚えるとよい。
まとめ
- Docker Composeは、複数のコンテナの構成を1つのファイルで定義・一括管理するツールである
docker-compose.ymlというYAMLファイルに設計図を記述するdocker compose upのコマンド1つで、同じネットワーク連携環境を再現しやすくなるdepends_onは起動順序の指定に役立つが、準備完了の確認には追加設定が必要な場合がある- AIに構成を伝えると設定ファイルのたたき台を作れるが、公式ドキュメントと起動ログで確認することが大切である
情報ソース
- Docker Docs: Docker Compose overview (英語)
- Docker Docs: Define services in Docker Compose
- Docker Docs: Control startup and shutdown order in Compose
- Dockerドキュメント日本語化プロジェクト: Docker Compose 概要
より詳しくAIに聞いてみよう
- Docker ComposeでWebサーバーとデータベースを起動した際、Webサーバーからデータベースに接続するためのホスト名はどう指定すればよいですか?
- Docker Composeで起動したデータベースのデータを、コンテナを削除(down)しても消えないように保持(永続化)する方法を教えてください。
docker compose up実行時に「Port already allocated(ポートが既に使用されています)」とエラーが出た場合の解決方法を教えてください。- AIを使って、既存のRailsアプリとMySQLをDocker Compose化するための
docker-compose.ymlの書き方を提案してください。 docker-compose.yml内のパスワードなどの機密情報を、環境変数(.envファイル)を使って安全に管理する方法を教えてください。