Docker Composeの完全ガイド:設定ファイルの書き方とコツ
前回ご紹介したDockerの基本を理解したら、実際のアプリケーション開発では、Webサーバー、データベース、キャッシュサーバーなど、複数のコンテナを連携させて運用するケースがほとんどです。
このような状況で真価を発揮するのが、Docker Composeです。Docker Composeは、複数のコンテナを一つのプロジェクトとして一元管理するためのツールです。

なぜDocker Composeが必要なのか?
具体例で考えてみましょう。例えば、Webアプリケーションを構築する場合、通常は以下のように複数のコンテナが必要になります:
- Nginx(Webサーバー)
- MySQL(データベース)
- Redis(キャッシュサーバー)
- アプリケーション本体
これらを個別に起動・管理するのは手間がかかる上、起動順序やネットワーク接続の調整も複雑です。Docker Composeは、まさにこの問題を解決するために生まれたツールなのです。
Docker Compose(プロジェクト)とは?
Docker Composeは、複数のコンテナを簡単に管理できるツールです。YAML ファイル(通常は docker-compose.ymlと名付けられます)を使ってアプリケーションのサービスを構成し、その後、1つのコマンドで全てのサービスを起動し、管理できます。開発や運用環境で効率的にコンテナを動かすには、信頼性の高いストレージ環境が欠かせません。安定した運用基盤を整えたい方は、NASストレージを参考に、Docker運用に最適なストレージ構成を検討してみてください。

Docker Compose の利点
- 集中管理:1つの設定ファイルで複数のコンテナやサービスを管理できます。
- 自動デプロイ:1つのコマンドで全てのコンテナを起動、停止、再起動できます。
- 移植性:docker-compose.yaml ファイルを使用することで、異なる環境で同じ設定を簡単に再現できます。
Docker Compose の設定ファイルの書き方
以下に、シンプルな docker-compose.yml の例を示し、具体的な設定方法を解説します。
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
environment:
- NGINX_PORT=80
networks:
- bridge
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: testdb
MYSQL_USER: testuser
MYSQL_PASSWORD: testpass
volumes:
- db_data:/var/lib/mysql
networks:
- host
主要パラメータの説明
services:
この部分は設定ファイルの中心であり、複数のサービスを指定します。各サービスはコンテナを表します。
- web と db はサービス名で、必要に応じて変更可能です。
- web と db などのコンテナ名は、services と進行的な関係を持つ必要があります。
- 通常、2文字程度で問題ありません。
- また、コンテナとそのコンテナに対応する environment などのパラメータ名も2文字のインデントをつける必要があります。
- environmentパラメータとその下位のポートマッピング(例: NGINX_PORT=80)にも2文字のインデントが必要です。
- インデントは2文字以上でも構いませんが、同じレベルのパラメータのインデントは統一する必要があります。
image:
- image は、サービスが使用する Docker イメージを指定します。
- イメージはローカルまたは Docker Hub から取得可能で、通常、イメージ名の後にバージョン番号が付けられます(例: nginx:latest)。
ports:
- ポートのマッピングを指定します。
- 形式は「NASのポート」:「コンテナ内のポート」です。
- Nginxはコンテナ内でデフォルトで80番ポートを使用していますが、その80番ポートをNASの8080番ポートにマッピングしました。
- これにより、NASの8080番ポートを通じてコンテナ内の80番ポートにアクセスできます。
volumes:
- ストレージスペースのマウントを指定します。
- NAS上のディレクトリをコンテナ内にマウントすることができます。
- また、名前付きのデータボリュームを使用することもできます。
Nginxサービスの場合:
- NASの ./html ディレクトリをコンテナ内の /usr/share/nginx/html ディレクトリにマウントしました。
- これにより、コンテナ内のデータマッピングがコンテナプロジェクトのルートディレクトリに集約されます。
- UGOS Proでは、通常「./」は現在の Docker Compose ファイルが存在するディレクトリを示します。

MySQL サービスについて:
- データを永続化するために命名されたデータボリュームdb_dataを使用しています。
- Docker では、命名されたデータボリューム(named volumes)は、Docker によって管理される特別な種類のボリュームで、データを永続化するために使用されます。
- 前述のパスマウントと異なり、命名されたデータボリュームは Docker によって管理され、コンテナとは独立して存在できます。
- データボリュームを使用しているすべてのコンテナを削除しても、データボリューム自体は残ります。
- クリーンアップの便宜を図るため、通常はデータボリューム機能を使用しません。
depends_on:
- サービス間の依存関係を指定します。
- この例では、web サービスは db サービスが起動した後に起動します。
environment:
- 環境変数を設定します。
- MySQLサービスにおいて、データベースに関連する環境変数(パスワード、データベース名など)を設定しています。
MySQL環境変数の説明:
- MYSQL_ROOT_PASSWORD: example:MySQLデータベースのrootユーザーのパスワードをexampleに設定します。
- MYSQL_DATABASE: testdb:testdbという名前の初期データベースを作成します。
- MYSQL_USER: testuser:testuserという名前のMySQLユーザーを作成します。
- MYSQL_PASSWORD: testpass:testuser ユーザーのパスワードをtestpassに設定します。
- これらの環境変数は、コンテナが起動する際にMySQLインスタンスを自動的に設定するのに役立ちます。
