フリーキーズ | 独学プログラミング

Docker Compose入門 – 複数コンテナを簡単管理!初心者でもわかる使い方ガイド

リンドくん

リンドくん

たなべ先生、Dockerは少しずつ使えるようになってきたんですけど、複数のコンテナを同時に動かすのが大変で...

たなべ

たなべ

その悩みはよくわかるよ!
例えば、Webアプリとデータベースを別々のコンテナで起動して、ネットワークを設定して...って考えるだけで大変だよね。

そんなときにDocker Composeが超便利なんだ。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

複数コンテナの管理、こんなに簡単でいいの?

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が必要なのか

実際のプロジェクトでは、複数のコンテナを連携させる必要があります。
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.4

Docker 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=myapp

ports(ポートマッピング)

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 web

webサービスだけを起動します。

すべてのサービスを停止

docker compose down

すべてのコンテナを停止し、削除します。ネットワークも削除されます。

docker compose down -v

ボリュームも含めてすべて削除します。

サービスの一時停止と再開

docker compose stop

コンテナを停止しますが、削除はしません。

docker compose start

停止していたコンテナを再開します。

ログとステータスの確認

ログの確認

docker compose logs

すべてのサービスのログを表示します。

docker compose logs -f web

webサービスのログをリアルタイムで表示します(-f は follow)。

サービスの状態確認

docker compose ps

起動中のサービスの状態を一覧表示します。

その他の便利なコマンド

コンテナ内でコマンドを実行

docker compose exec web bash

webサービスのコンテナ内でbashシェルを起動します。

設定ファイルの検証

docker compose config

docker-compose.ymlファイルの構文が正しいかチェックします。

イメージの再ビルド

docker compose build

Dockerfileからイメージを再ビルドします。

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を活用してみてください。

この記事をシェア

関連するコンテンツ