Docker Composeとは?複数コンテナを簡単に管理できるツール
「Dockerは聞いたことがあるけど設定が複雑そう…」「開発環境の構築に時間がかかって本来の業務に集中できない」そんな悩みを抱えていませんか?
Docker Composeは、複数のDockerコンテナを一つの設定ファイルで管理できるツールです。従来は一つひとつのコンテナを個別に起動・設定する必要がありましたが、Docker Composeを使えば、たった一つのコマンドで複数のコンテナを同時に起動・停止できます。
中小企業のIT担当者にとって、Docker Composeは「属人化を防ぎ、誰でも同じ開発環境を再現できる」という大きなメリットがあります。設定ファイルを共有するだけで、新しいメンバーも即座に同じ環境で作業を始められるため、引き継ぎや新人教育の負担を大幅に軽減できます。
通常のDockerとの違い
通常のDockerでは、コンテナを一つずつ起動する必要があります。例えば、WebアプリケーションとデータベースとRedisを使う場合、3つのコンテナをそれぞれ個別に起動し、ネットワーク設定も手動で行わなければなりません。
# 通常のDockerでの起動例
docker network create myapp-network
docker run -d --name db --network myapp-network mysql:8.0
docker run -d --name redis --network myapp-network redis:alpine
docker run -d --name web --network myapp-network -p 80:80 myapp:latest
一方、Docker Composeの場合は、一つの設定ファイルにすべての情報を記載し、一つのコマンドで起動できます。
# Docker Composeでの起動
docker-compose up -d
設定はdocker-compose.ymlファイルに記述されているため、コマンドを覚える必要がなく、設定の変更も簡単です。また、依存関係の管理も自動化されます。「データベースが起動してからWebアプリを起動する」といった順序制御も、設定ファイルで指定できます。
Docker Composeが解決する課題
Docker Composeは、中小企業が抱える以下のような課題を解決します。
環境構築の属人化問題を解消できます。設定ファイル(docker-compose.yml)に環境の情報がすべて記載されているため、「あの人しか環境を作れない」という状況を防げます。
複雑なコマンド入力の手間を削減できます。通常のDockerでは、コンテナごとに長いコマンドを入力する必要がありますが、Docker Composeなら「docker-compose up」という一つのコマンドで環境全体を起動できます。
開発環境と本番環境の差異を最小化できます。チーム全員が同じ設定ファイルを使うことで、「自分のパソコンでは動くのに、他の人の環境では動かない」という問題を防げます。
新人教育や引き継ぎの負担を軽減できます。環境構築の手順書を何ページも作る必要はありません。docker-compose.ymlファイルと簡単な説明があれば、新しいメンバーもすぐに開発を始められます。
インストールと環境確認
Docker Composeを使い始めるには、まず適切にインストールする必要があります。
Dockerのインストール確認
Docker ComposeはDockerの拡張機能であり、Docker本体がなければ動作しません。まずターミナル(WindowsではコマンドプロンプトまたはPowerShell)を開いて、以下のコマンドを実行してください。
docker --version
バージョン情報が表示されれば、Dockerは正しくインストールされています。コマンドが見つからないというエラーが出た場合は、公式サイト(https://www.docker.com/)からDocker Desktopをダウンロードしてインストールしてください。
Docker Composeのインストール
最近のDocker Desktop(Windows/Mac)を使用している場合は、Docker Composeが最初から含まれているため、別途インストールする必要はありません。
Linuxの場合は、以下のコマンドでインストールできます。
# 最新版のDocker Composeをダウンロード
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose
インストール確認
Docker Composeが正しくインストールされているか、以下のコマンドで確認します。
docker-compose --version
正しくインストールされていれば、バージョン情報が表示されます。
注意点: Docker Composeには、古い形式(docker-compose)と新しい形式(docker compose)があります。最新のDocker Desktopでは両方使えますが、本記事では互換性を考慮してdocker-compose形式で説明します。
よくあるエラーと対処法
「docker-composeコマンドが見つかりません」
- Docker Desktopが正しくインストールされているか確認
- Docker Desktopが起動しているか確認(Windows/Macの場合)
「permission denied」(権限エラー)
Linuxで発生しやすいエラーです。以下のコマンドで現在のユーザーをdockerグループに追加します。
sudo usermod -aG docker $USER
# ログアウトして再ログインが必要
「Cannot connect to the Docker daemon」
Dockerデーモンが起動していない場合に発生します。
- Windows/Mac:Docker Desktopを起動
- Linux:
sudo systemctl start dockerでDockerサービスを起動
docker-compose.ymlファイルの書き方
Docker Composeの核となるのがdocker-compose.ymlファイルです。このファイルに環境の設定をすべて記述することで、複雑なコマンドを覚えることなく、簡単に環境を管理できます。
YAMLファイルの基本ルール
docker-compose.ymlは、YAML形式で記述します。以下のルールを守る必要があります。
インデント(字下げ)が非常に重要です。YAMLでは、インデントで階層構造を表現します。スペース2個または4個で統一し、タブ文字は使用できません。
# 正しい例(スペース2個)
services:
web:
image: nginx
ports:
- "80:80"
コロン(:)の後には必ずスペースが必要です。リスト項目はハイフン(-)で始めます。コメントはシャープ(#)で記述できます。
基本構造と主要項目
docker-compose.ymlファイルの基本構造を理解しましょう。
version: '3.8' # Docker Composeのバージョン
services: # 起動するコンテナの定義
web: # サービス名(任意の名前)
image: nginx:latest # 使用するDockerイメージ
ports: # ポートマッピング
- "80:80"
db: # 2つ目のサービス
image: mysql:8.0
environment: # 環境変数
MYSQL_ROOT_PASSWORD: password
volumes: # データ保存領域(オプション)
db-data:
networks: # ネットワーク設定(オプション)
default:
driver: bridge
version: Docker Composeのファイル形式のバージョンを指定します。現在は'3.8'を指定するのが一般的です。
services: 最も重要なセクションです。ここに起動したいコンテナの情報を記述します。
volumes: データを永続化するための設定です。コンテナを削除してもデータを保持したい場合に使用します。
networks: コンテナ間の通信設定を定義します。省略した場合は、デフォルトのネットワークが自動的に作成されます。
サービス定義の主要項目
image: 使用するDockerイメージを指定します。
image: nginx:latest # Docker Hubからnginxの最新版を取得
ports: ホスト側のポートとコンテナ側のポートを紐付けます。
ports:
- "8080:80" # ホストの8080番ポートをコンテナの80番に転送
environment: コンテナ内で使用する環境変数を設定します。
environment:
MYSQL_ROOT_PASSWORD: mypassword
MYSQL_DATABASE: myapp
volumes: ホストのディレクトリやボリュームをコンテナ内にマウントします。
volumes:
- ./data:/var/lib/mysql # ホストの./dataをコンテナにマウント
- db-data:/var/lib/mysql # 名前付きボリュームを使用
depends_on: サービスの起動順序を制御します。
depends_on:
- db # dbサービスが起動してからwebを起動
restart: コンテナが停止した際の再起動動作を指定します。
restart: always # 常に再起動
restart: unless-stopped # 手動停止以外は再起動
実用的な設定例
Webアプリケーション(Nginx)とデータベース(MySQL)を組み合わせた実用的な例です。
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
restart: unless-stopped
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass123
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass123
volumes:
- db-data:/var/lib/mysql
restart: unless-stopped
volumes:
db-data:
このファイルをdocker-compose.ymlという名前で保存し、同じディレクトリでdocker-compose upを実行すれば、Webサーバーとデータベースが同時に起動します。
基本コマンドの使い方
docker-compose.ymlファイルが準備できたら、実際にコンテナを操作してみましょう。いくつかの基本コマンドを覚えるだけで、ほとんどの操作ができます。
docker-compose up:コンテナを起動
docker-compose upは、最も頻繁に使うコマンドです。docker-compose.ymlに定義されたすべてのサービスを起動します。
docker-compose up
このコマンドを実行すると、以下の処理が自動的に行われます。
- 必要なDockerイメージがなければダウンロード
- ネットワークの作成
- ボリュームの作成
- すべてのコンテナの起動
よく使うオプション:
# バックグラウンドで起動
docker-compose up -d
# イメージを再ビルドして起動
docker-compose up --build
# 特定のサービスだけ起動
docker-compose up web
# 強制的に再作成
docker-compose up --force-recreate
-dオプション(detachedモード)を付けると、コンテナがバックグラウンドで起動し、ターミナルが占有されません。実務ではこちらを使うことが多いです。
docker-compose down:停止・削除
docker-compose downは、起動中のコンテナを停止し、関連するネットワークも削除します。
docker-compose down
stopとdownの違い
- docker-compose stop:コンテナを停止するだけ(削除はしない)
- docker-compose down:コンテナを停止して削除する
# ボリュームも削除する場合(データが消えるので注意)
docker-compose down -v
# イメージも削除する場合
docker-compose down --rmi all
docker-compose ps:状態を確認
docker-compose psは、現在のコンテナの状態を確認するコマンドです。
docker-compose ps
実行すると、コンテナ名、実行中のコマンド、状態(Up=起動中、Exit=停止中)、ポートマッピングなどの情報が表示されます。
その他の便利なコマンド
ログを確認
# すべてのサービスのログを表示
docker-compose logs
# 特定のサービスのログのみ表示
docker-compose logs web
# リアルタイムでログを表示
docker-compose logs -f
# 最新100行のみ表示
docker-compose logs --tail=100
エラーが発生したときは、まずこのコマンドでログを確認しましょう。
コンテナ内でコマンドを実行
# データベースに接続
docker-compose exec db mysql -u root -p
# Webサーバーのシェルに入る
docker-compose exec web sh
execコマンドは、起動中のコンテナ内で任意のコマンドを実行できます。デバッグや設定確認に便利です。
再起動
# すべてのサービスを再起動
docker-compose restart
# 特定のサービスのみ再起動
docker-compose restart web
注意点: docker-compose.ymlがあるディレクトリで実行する必要があります。別のディレクトリから実行する場合は-fオプションでファイルを指定します。
docker-compose -f /path/to/docker-compose.yml up
実践例:WordPress環境を構築してみよう
実際にDocker Composeを使ってWordPress環境を構築してみましょう。WordPress + MySQLという実用的な構成を通じて、Docker Composeの使い方を体験できます。
構築する環境の全体像
今回構築するのは、以下の2つのコンテナで構成されるWordPress環境です。
- WordPressコンテナ:WebサーバーとしてApacheを含むWordPress
- MySQLコンテナ:データベースサーバー
この2つのコンテナは同じネットワーク内で通信し、WordPressがMySQLにデータを保存します。データは永続化されるため、コンテナを停止・削除してもデータは失われません。
docker-compose.ymlの作成
まず、作業用のディレクトリを作成します。
mkdir wordpress-docker
cd wordpress-docker
次に、docker-compose.ymlファイルを作成します。
version: '3.8'
services:
db:
image: mysql:8.0
container_name: wordpress-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword123
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword123
volumes:
- db-data:/var/lib/mysql
wordpress:
image: wordpress:latest
container_name: wordpress-app
restart: always
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword123
volumes:
- wp-data:/var/www/html
volumes:
db-data:
wp-data:
コンテナの起動と動作確認
docker-compose.ymlを保存したら、以下のコマンドで起動します。
docker-compose up -d
初回起動時は、必要なイメージのダウンロードに数分かかります。起動が完了したら、ブラウザでhttp://localhost:8080にアクセスしてください。WordPressの初期設定画面が表示されれば成功です。
状態を確認するには:
docker-compose ps
ログを確認するには:
docker-compose logs -f
データの永続化とバックアップ
この設定では、db-dataとwp-dataという名前付きボリュームを使用しています。これにより、コンテナを削除してもデータは保持されます。
バックアップの取り方:
# データベースのバックアップ
docker-compose exec db mysqldump -u wpuser -p wordpress > backup.sql
# WordPressファイルのバックアップ
docker-compose exec wordpress tar czf /tmp/wp-backup.tar.gz /var/www/html
docker cp wordpress-app:/tmp/wp-backup.tar.gz ./
環境を削除する場合:
# コンテナとネットワークを削除(データは保持)
docker-compose down
# データも含めてすべて削除
docker-compose down -v
よくあるトラブルと解決方法
Docker Composeを使っていると、いくつかの典型的なエラーに遭遇することがあります。ここでは、よくあるトラブルと解決方法を紹介します。
コンテナが起動しない場合
ログを確認する
まずはログを確認しましょう。エラーの原因はほとんどの場合、ログに記録されています。
docker-compose logs
よくある原因:
- 環境変数の設定ミス
- イメージのダウンロード失敗
- 依存関係の問題
ポート番号の競合エラー
「port is already allocated」というエラーが出る場合、指定したポートが既に使用されています。
解決方法:
# docker-compose.ymlのポート番号を変更
ports:
- "8080:80" # 80番が使われている場合は8080など別のポートに変更
または、既に使用しているサービスを停止します。
ボリュームやネットワークの問題
ボリュームやネットワークが残っていて問題が発生する場合があります。
解決方法:
# 未使用のボリュームを削除
docker volume prune
# 未使用のネットワークを削除
docker network prune
# すべてのリソースをクリーンアップ
docker system prune -a
設定変更が反映されない
docker-compose.ymlを変更したのに反映されない場合は、コンテナを再作成する必要があります。
# コンテナを強制的に再作成
docker-compose up --force-recreate
業務で活かすDocker Compose活用のヒント
Docker Composeの基本的な使い方を理解したら、次は業務での活用を考えましょう。中小企業でDocker Composeを効果的に活用するためのヒントを紹介します。
開発環境の標準化で属人化を防ぐ
Docker Composeを使えば、チーム全員が同じ開発環境を使えます。docker-compose.ymlファイルをGitなどのバージョン管理システムで共有することで、誰でも同じ環境を再現できます。
実践のポイント:
- docker-compose.ymlをプロジェクトのルートディレクトリに配置
- READMEに簡単な起動手順を記載
- 環境変数は.envファイルで管理(パスワードなど)
# .envファイルの利用例
environment:
MYSQL_PASSWORD: ${DB_PASSWORD}
新人教育や引き継ぎをスムーズにする
新しいメンバーが参加した際、環境構築に何時間もかかっていた作業が、Docker Composeなら数分で完了します。
引き継ぎドキュメントの例:
# 開発環境の構築手順
1. リポジトリをクローン
2. `docker-compose up -d`を実行
3. `http://localhost:8080`にアクセス
以上で開発環境が起動します。
チーム内での共有とベストプラクティス
環境ごとに設定ファイルを分ける
開発環境と本番環境で設定を分けたい場合は、複数のファイルを用意します。
# 開発環境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# 本番環境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
機密情報の管理
パスワードなどの機密情報は、.envファイルに記載し、.gitignoreに追加してバージョン管理から除外します。
# .gitignore
.env
次のステップ:さらに学ぶべきこと
Docker Composeの基本を理解したら、以下のトピックに進むことをお勧めします。
- Dockerfileの作成:独自のイメージを作成する
- マルチステージビルド:本番用の軽量なイメージを作成
- Docker Swarm / Kubernetes:本番環境でのコンテナオーケストレーション
- CI/CDパイプライン:自動テスト・デプロイの実現
Docker Composeは、複雑な環境構築を簡単にする強力なツールです。この記事で学んだ内容を実際の業務で活用し、開発効率の向上と属人化の解消を実現してください。