リンドくんたなべ先生、Dockerは少しずつ使えるようになってきたんですけど、複数のコンテナを同時に動かすのが大変で...
たなべその悩みはよくわかるよ!
例えば、Webアプリとデータベースを別々のコンテナで起動して、ネットワークを設定して...って考えるだけで大変だよね。
そんなときにDocker Composeが超便利なんだ。
複数コンテナの管理、こんなに簡単でいいの?
Dockerを使い始めると、すぐに気づくことがあります。
それは、実際のアプリケーションは複数のコンテナで構成されることがほとんどだということです。
例えば、一般的なWebアプリケーションを動かそうとすると、以下のようなコンテナが必要になります。
- Webサーバ(NginxやApacheなど)
- アプリケーションサーバ(Node.js、Python、PHPなど)
- データベース(MySQL、PostgreSQLなど)
- キャッシュサーバ(Redisなど)
これらを一つ一つdocker runコマンドで起動し、ネットワークを設定し、環境変数を指定し...なんてやっていたら、コマンドが長くなりすぎて管理しきれなくなってしまいます。
そこで登場するのがDocker Composeです。
Docker Composeを使えば、複数のコンテナをまとめて定義し、たった一つのコマンドで起動・停止・管理ができるようになります。
この記事では、Docker Composeの基本的な概念から、実際の使い方、そして実用的なサンプルまでを、初心者の方でも理解できるように詳しく解説していきます。
Docker Composeとは何か?
リンドくんDocker Composeって、具体的には何ができるんですか?
たなべ簡単に言うと、複数のDockerコンテナをまとめて管理するためのツールなんだ。
設定ファイル一つで、必要なコンテナをすべて起動できるようになるよ。
Docker Composeの基本概念
Docker Composeは、複数のコンテナで構成されるアプリケーションを定義・実行するためのツールです。その特徴は以下の通りです。
- YAMLファイルで設定を記述 →
docker-compose.ymlというファイルに、必要なコンテナの設定をすべて書きます - 一つのコマンドで一括管理 →
docker compose upだけで、すべてのコンテナが起動します - サービス単位での管理 → 各コンテナを「サービス」として定義し、依存関係も明確にできます
- 開発環境の再現性が高い → チームメンバー全員が同じ環境を簡単に構築できます
以前からあるdocker-compose upのようなdocker-composeコマンドは非推奨となり、現在はdocker composeの形でコマンドを実行することに注意してください。
なぜDocker Composeが必要なのか
実際のプロジェクトでは、複数のコンテナを連携させる必要があります。
Docker Composeがない場合とある場合を比較してみましょう。
Docker Composeなしの場合
# ネットワークを作成
docker network create myapp-network
# データベースを起動
docker run -d --name mydb \
--network myapp-network \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
-v mydb-data:/var/lib/mysql \
mysql:8.0
# Webアプリケーションを起動
docker run -d --name webapp \
--network myapp-network \
-p 8080:80 \
-e DB_HOST=mydb \
-e DB_PASSWORD=secret \
-v $(pwd)/app:/var/www/html \
php:8.2-apacheこのように、コマンドが長く複雑になってしまいます。さらに、これを毎回手動で実行するのは大変です。
Docker Composeありの場合
version: '3.8'
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
volumes:
- mydb-data:/var/lib/mysql
webapp:
image: php:8.2-apache
ports:
- "8080:80"
environment:
DB_HOST: db
DB_PASSWORD: secret
volumes:
- ./app:/var/www/html
depends_on:
- db
volumes:
mydb-data:起動は以下のコマンド一つで完了します。
docker compose up -dこの違いは一目瞭然ですよね。Docker Composeを使えば、設定を一元管理でき、起動も停止も簡単になるのです。
docker-compose.ymlの基本的な書き方
リンドくんdocker-compose.ymlファイルって、どう書けばいいんですか?
たなべYAMLという形式で書くんだけど、基本的な構造さえ覚えれば意外と簡単だよ。一つずつ見ていこうか。
docker-compose.ymlの基本構造
docker-compose.ymlファイルは、主に以下のセクションで構成されます。
version: '3.8' # Docker Composeのバージョン指定
services: # コンテナの定義
サービス名1:
# コンテナの設定
サービス名2:
# コンテナの設定
volumes: # データを永続化するボリュームの定義(オプション)
ボリューム名1:
ボリューム名2:
networks: # ネットワークの定義(オプション)
ネットワーク名1:最もシンプルな例
まずは、最もシンプルなdocker-compose.ymlファイルから見ていきましょう。
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"このファイルは以下のことを定義しています。
- version: Docker Composeのファイル形式のバージョンを指定(3.8は現在広く使われているバージョン)
- services: 起動するコンテナの定義
- web: サービス名(任意の名前を付けられます)
- image: 使用するDockerイメージ
- ports: ポートマッピング(ホスト:コンテナ)
このファイルがあれば、以下のコマンドだけでNginxが起動します。
docker compose up -dよく使う設定項目
docker-compose.ymlでよく使う設定項目を紹介します。
image(イメージの指定)
services:
db:
image: mysql:8.4Docker Hubなどからイメージを取得する場合に使います。
build(Dockerfileからビルド)
services:
app:
build:
context: ./app
dockerfile: Dockerfile独自のDockerfileからイメージをビルドする場合に使います。
environment(環境変数の設定)
services:
db:
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myappまたは、リスト形式でも書けます。
services:
db:
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=myappports(ポートマッピング)
services:
web:
ports:
- "8080:80"
- "8443:443"ホスト側のポートとコンテナ側のポートを対応づけます。
volumes(ボリュームマウント)
services:
web:
volumes:
- ./src:/var/www/html # ホストのディレクトリをマウント
- web-data:/var/log # 名前付きボリュームをマウント
volumes:
web-data:depends_on(依存関係の定義)
services:
web:
depends_on:
- db
db:
image: mysql:8.0サービスの起動順序を制御します。この例では、dbサービスが起動してからwebサービスが起動します。
Docker Composeの基本コマンド
リンドくんdocker-compose.ymlファイルを作ったあとは、どんなコマンドを使えばいいんですか?
たなべ基本的なコマンドは数個だけ覚えれば大丈夫だよ。よく使うコマンドを紹介するね。
起動と停止の基本
すべてのサービスを起動
docker compose upフォアグラウンドで起動します。ログがターミナルに表示されます。
docker compose up -dバックグラウンドで起動します(-dはdetachedモード)。
特定のサービスだけを起動
docker compose up -d webwebサービスだけを起動します。
すべてのサービスを停止
docker compose downすべてのコンテナを停止し、削除します。ネットワークも削除されます。
docker compose down -vボリュームも含めてすべて削除します。
サービスの一時停止と再開
docker compose stopコンテナを停止しますが、削除はしません。
docker compose start停止していたコンテナを再開します。
ログとステータスの確認
ログの確認
docker compose logsすべてのサービスのログを表示します。
docker compose logs -f webwebサービスのログをリアルタイムで表示します(-f は follow)。
サービスの状態確認
docker compose ps起動中のサービスの状態を一覧表示します。
その他の便利なコマンド
コンテナ内でコマンドを実行
docker compose exec web bashwebサービスのコンテナ内でbashシェルを起動します。
設定ファイルの検証
docker compose configdocker-compose.ymlファイルの構文が正しいかチェックします。
イメージの再ビルド
docker compose buildDockerfileからイメージを再ビルドします。
docker compose up -d --build再ビルドしてから起動します。
よくあるトラブルと解決方法
リンドくんDocker Composeを使っていると、たまにエラーが出るんですけど...
たなべ初心者がよくつまずくポイントがいくつかあるんだ。代表的な問題と解決法を紹介するね。
ポートの競合エラー
症状: Bind for 0.0.0.0:8080 failed: port is already allocated
原因: 指定したポートがすでに使用されています。
解決法
# 使用中のポートを確認
lsof -i :8080 # macOS/Linux
netstat -ano | findstr :8080 # Windows
# 別のポートを使用するか、docker-compose.ymlを編集
ports:
- "8081:80" # ホスト側のポートを変更データベース接続エラー
症状: アプリケーションからデータベースに接続できない
原因: データベースの起動完了前にアプリケーションが接続しようとしています。
解決法
depends_onは起動順序を制御しますが、サービスの準備完了を待ちません。ヘルスチェックを追加しましょう。
services:
db:
image: mysql:8.4
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 5
web:
depends_on:
db:
condition: service_healthyまたは、アプリケーション側でリトライ処理を実装します。
ボリュームの権限エラー
症状: Permission deniedエラーが発生
解決法
Dockerfileでユーザーを適切に設定するか、ボリュームの権限を調整します。
services:
web:
user: "1000:1000" # ホストのユーザーIDに合わせる
volumes:
- ./src:/var/www/htmlコンテナが勝手に停止する
症状: docker-compose up -d後、すぐにコンテナが停止する
原因: コンテナ内でフォアグラウンドプロセスが実行されていません。
解決法
Dockerfileまたはdocker-compose.ymlで適切なコマンドを指定します。
services:
app:
command: ["npm", "start"]
# または
# command: tail -f /dev/null # デバッグ用に起動させ続けるまとめ
リンドくんDocker Composeを使えば、複数のコンテナ管理が本当に楽になりますね!
たなべそうなんだ!
一度docker-compose.ymlファイルを作ってしまえば、チームメンバー全員が同じ環境を簡単に構築できるのが最大のメリットだね。ぜひ実際のプロジェクトで使ってみてほしいな。
この記事では、Docker Composeの基本から実践的な使い方まで解説してきました。重要なポイントをおさらいしましょう。
Docker Composeの主なメリットは以下です。
- 複数コンテナを一つのファイルで管理できる
- コマンド一つで環境構築が完了する
- チーム全体で環境を統一できる
- 開発環境の再現性が高い
Docker Composeをマスターすれば、開発環境の構築や管理が劇的に楽になります。
特に、複数人でのチーム開発では、環境の統一という点で非常に大きな価値を発揮します。
最初は設定ファイルの書き方に戸惑うかもしれませんが、基本的な構造を理解すれば、あとは必要に応じてオプションを追加していくだけです。
ぜひ、今回紹介したサンプルを参考に、自分のプロジェクトでDocker Composeを活用してみてください。





