最終更新
リンドくん
たなべ先生、Dockerは少しずつ使えるようになってきたんですけど、複数のコンテナを同時に動かすのが大変で...
たなべ
その悩みはよくわかるよ!
例えば、Webアプリとデータベースを別々のコンテナで起動して、ネットワークを設定して...って考えるだけで大変だよね。
そんなときにDocker Composeが超便利なんだ。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
Dockerを使い始めると、すぐに気づくことがあります。
それは、実際のアプリケーションは複数のコンテナで構成されることがほとんどだということです。
例えば、一般的なWebアプリケーションを動かそうとすると、以下のようなコンテナが必要になります。
これらを一つ一つdocker run
コマンドで起動し、ネットワークを設定し、環境変数を指定し...なんてやっていたら、コマンドが長くなりすぎて管理しきれなくなってしまいます。
そこで登場するのがDocker Composeです。
Docker Composeを使えば、複数のコンテナをまとめて定義し、たった一つのコマンドで起動・停止・管理ができるようになります。
この記事では、Docker Composeの基本的な概念から、実際の使い方、そして実用的なサンプルまでを、初心者の方でも理解できるように詳しく解説していきます。
リンドくん
Docker Composeって、具体的には何ができるんですか?
たなべ
簡単に言うと、複数のDockerコンテナをまとめて管理するためのツールなんだ。
設定ファイル一つで、必要なコンテナをすべて起動できるようになるよ。
Docker Composeは、複数のコンテナで構成されるアプリケーションを定義・実行するためのツールです。その特徴は以下の通りです。
docker-compose.yml
というファイルに、必要なコンテナの設定をすべて書きますdocker compose up
だけで、すべてのコンテナが起動します実際のプロジェクトでは、複数のコンテナを連携させる必要があります。
Docker Composeがない場合とある場合を比較してみましょう。
Docker Composeなしの場合
このように、コマンドが長く複雑になってしまいます。さらに、これを毎回手動で実行するのは大変です。
Docker Composeありの場合
起動は以下のコマンド一つで完了します。
この違いは一目瞭然ですよね。Docker Composeを使えば、設定を一元管理でき、起動も停止も簡単になるのです。
リンドくん
docker-compose.ymlファイルって、どう書けばいいんですか?
たなべ
YAMLという形式で書くんだけど、基本的な構造さえ覚えれば意外と簡単だよ。一つずつ見ていこうか。
docker-compose.yml
ファイルは、主に以下のセクションで構成されます。
まずは、最もシンプルなdocker-compose.ymlファイルから見ていきましょう。
このファイルは以下のことを定義しています。
このファイルがあれば、以下のコマンドだけでNginxが起動します。
docker-compose.ymlでよく使う設定項目を紹介します。
Docker Hubなどからイメージを取得する場合に使います。
独自のDockerfileからイメージをビルドする場合に使います。
または、リスト形式でも書けます。
ホスト側のポートとコンテナ側のポートを対応づけます。
サービスの起動順序を制御します。この例では、dbサービスが起動してからwebサービスが起動します。
リンドくん
docker-compose.ymlファイルを作ったあとは、どんなコマンドを使えばいいんですか?
たなべ
基本的なコマンドは数個だけ覚えれば大丈夫だよ。よく使うコマンドを紹介するね。
フォアグラウンドで起動します。ログがターミナルに表示されます。
バックグラウンドで起動します(-dはdetachedモード)。
webサービスだけを起動します。
すべてのコンテナを停止し、削除します。ネットワークも削除されます。
ボリュームも含めてすべて削除します。
コンテナを停止しますが、削除はしません。
停止していたコンテナを再開します。
すべてのサービスのログを表示します。
webサービスのログをリアルタイムで表示します(-f は follow)。
起動中のサービスの状態を一覧表示します。
webサービスのコンテナ内でbashシェルを起動します。
docker-compose.ymlファイルの構文が正しいかチェックします。
Dockerfileからイメージを再ビルドします。
再ビルドしてから起動します。
リンドくん
Docker Composeを使っていると、たまにエラーが出るんですけど...
たなべ
初心者がよくつまずくポイントがいくつかあるんだ。代表的な問題と解決法を紹介するね。
症状: Bind for 0.0.0.0:8080 failed: port is already allocated
原因: 指定したポートがすでに使用されています。
解決法
症状: アプリケーションからデータベースに接続できない
原因: データベースの起動完了前にアプリケーションが接続しようとしています。
解決法
depends_on
は起動順序を制御しますが、サービスの準備完了を待ちません。ヘルスチェックを追加しましょう。
または、アプリケーション側でリトライ処理を実装します。
症状: Permission denied
エラーが発生
解決法
Dockerfileでユーザーを適切に設定するか、ボリュームの権限を調整します。
症状: docker-compose up -d
後、すぐにコンテナが停止する
原因: コンテナ内でフォアグラウンドプロセスが実行されていません。
解決法
Dockerfileまたはdocker-compose.ymlで適切なコマンドを指定します。
リンドくん
Docker Composeを使えば、複数のコンテナ管理が本当に楽になりますね!
たなべ
そうなんだ!
一度docker-compose.ymlファイルを作ってしまえば、チームメンバー全員が同じ環境を簡単に構築できるのが最大のメリットだね。ぜひ実際のプロジェクトで使ってみてほしいな。
この記事では、Docker Composeの基本から実践的な使い方まで解説してきました。重要なポイントをおさらいしましょう。
Docker Composeの主なメリットは以下です。
Docker Composeをマスターすれば、開発環境の構築や管理が劇的に楽になります。
特に、複数人でのチーム開発では、環境の統一という点で非常に大きな価値を発揮します。
最初は設定ファイルの書き方に戸惑うかもしれませんが、基本的な構造を理解すれば、あとは必要に応じてオプションを追加していくだけです。
ぜひ、今回紹介したサンプルを参考に、自分のプロジェクトでDocker Composeを活用してみてください。