Docker Composeとは?

Docker Composeは、マルチコンテナアプリケーションを定義し実行するためのツールです。単一の docker-compose.yml ファイルで、Webサーバー、データベース、キャッシュなどのサービスと、それらの接続・通信方法を含むアプリケーションスタック全体を定義します。docker-compose up コマンド一つですべてが起動します。

Docker Composeはローカル開発環境、CI/CDパイプライン、さらには小規模な本番デプロイメントに最適です。すべての開発者が同じ環境設定を使用することを保証し、「自分のマシンでは動く」問題を解消します。

一般的なDocker Composeスタック

  • Node.js + PostgreSQL + Redis: リレーショナルストレージとキャッシングを備えた典型的なREST APIバックエンド
  • Python + MySQL: DjangoまたはFlask Webアプリケーションによく使用
  • Nginx + Node.js: Node.jsアプリケーションの前にNginxをリバースプロキシとして配置
  • フルスタック:Nginx + Node.js + PostgreSQL + Redis: リバースプロキシ、API、データベース、キャッシュを備えた本番環境に近いセットアップ

Docker Composeのボリュームとネットワークのヒント

  • コンテナの再起動間でデータを保持するために、データベースデータには常に名前付きボリュームを使用する
  • サービス間通信にはカスタムブリッジネットワークを使用 — サービスはサービス名で互いに到達可能
  • 機密情報(パスワード、APIキー)にはcomposeファイルにハードコーディングせず、.env ファイルを使用
  • 本番サービスには障害時の自動再起動のために restart: unless-stopped を設定
  • データベースの準備完了まで依存サービスを遅延させるには healthcheck を使用

Docker Composeに関するよくある質問

docker compose upとdocker compose startの違いは何ですか?

docker compose up はコンテナをゼロから作成して起動し、必要に応じてイメージをプルまたはビルドします。docker compose start は以前作成されて停止されたコンテナのみを再起動します — 新しいコンテナは作成できません。バックグラウンドモードで起動するには docker compose up -d を使用します。Dockerfileが変更された場合にイメージの再ビルドを強制するには --build を追加します。

Docker Composeでサービス同士はどのように通信しますか?

同じDocker Composeネットワーク上のサービスは、サービス名をホスト名として使用して互いに到達できます。データベースサービスの名前が db の場合、アプリケーションは localhost:5432 の代わりに db:5432 に接続します。Docker Composeは同じcomposeファイルで定義されたすべてのサービスに対して、デフォルトのブリッジネットワークを自動的に作成します。より詳細な制御のためにカスタム名前付きネットワークを作成することもできます。

コンテナの再起動間でデータベースデータを保持するにはどうすればいいですか?

composeファイルで名前付きボリュームを使用します。ボリュームがない場合、コンテナ内のすべてのデータはコンテナが停止すると失われます。サービスの下にボリュームを定義します:volumes: - postgres_data:/var/lib/postgresql/data、次にトップレベルで宣言します:volumes: postgres_data:。名前付きボリュームはDockerによって管理され、docker compose down でも保持されます — docker compose down -v のみがボリュームを削除します。

Docker Composeのrestart: unless-stoppedとはどういう意味ですか?

restart: unless-stopped は、コンテナがクラッシュした場合やDockerデーモンが再起動した場合(サーバーのリブート後など)にDockerが自動的にコンテナを再起動しますが、docker compose stop で明示的に停止したコンテナは再起動しないことを意味します。これは本番サービスに推奨される設定です。その他のオプション:no(再起動しない)、always(明示的な停止後も常に再起動)、on-failure(非ゼロの終了コード時のみ再起動)。

関連開発者ツール