HOME > 技術ドキュメント > Docker Compose 実践(Nginx + PHP-FPM + MySQL 構成)
Docker Compose 実践(Nginx + PHP-FPM + MySQL 構成)
Docker Compose を使うと、複数のコンテナを1つの設定ファイルで定義・起動できます。
本記事では Nginx(Web サーバー)+ PHP-FPM(PHP 処理)+ MySQL(データベース)という
典型的な LAMP スタック相当の構成を compose.yaml で組み立てる方法を解説します。
Docker Engine のインストールは Docker 入門 を参照してください。
1. Docker Compose v2 について
Docker Compose v2 では docker-compose(ハイフン)コマンドではなく、
docker compose(スペース)が標準コマンドになりました。
設定ファイルも docker-compose.yml から compose.yaml が推奨名称です。
| 項目 | v1(旧) | v2(現在) |
|---|---|---|
| コマンド | docker-compose up | docker compose up |
| 設定ファイル名 | docker-compose.yml | compose.yaml(推奨) |
| インストール | 別途インストール必要 | Docker Engine に同梱 |
2. ディレクトリ構成
myapp/
├── compose.yaml
├── .env
├── nginx/
│ └── default.conf
└── php/
└── Dockerfile
3. .env ファイル(環境変数)
パスワードなどの秘密情報は .env ファイルに分離し、.gitignore に追加します。
# .env MYSQL_ROOT_PASSWORD=rootpassword MYSQL_DATABASE=myapp_db MYSQL_USER=myapp_user MYSQL_PASSWORD=myapp_pass
4. compose.yaml の全体構成
services:
nginx:
image: nginx:1.26-alpine
ports:
- "80:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./src:/var/www/html:ro
networks:
- frontend
depends_on:
php:
condition: service_started
php:
build: ./php
volumes:
- ./src:/var/www/html
networks:
- frontend
- backend
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
frontend:
backend:
volumes:
mysql_data:
5. PHP-FPM の Dockerfile
# php/Dockerfile FROM php:8.3-fpm-alpine RUN docker-php-ext-install pdo pdo_mysql
6. Nginx 設定ファイル
# nginx/default.conf
server {
listen 80;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
7. ネットワーク分離の考え方
Nginx と PHP を frontend ネットワーク、PHP と MySQL を backend ネットワークに配置します。
MySQL は frontend ネットワークに属さないため、Nginx から直接 MySQL には到達できません。
| コンテナ | frontend | backend |
|---|---|---|
| nginx | ○ | ✕ |
| php | ○ | ○ |
| mysql | ✕ | ○ |
8. healthcheck と depends_on
MySQL は起動してもすぐに接続を受け付けられるわけではありません。
healthcheck で MySQL の準備完了を確認し、depends_on: condition: service_healthy
で PHP が MySQL の準備完了後に起動するよう制御します。
9. 主要コマンド一覧
| コマンド | 説明 |
|---|---|
| docker compose up -d | バックグラウンドで起動 |
| docker compose down | コンテナ・ネットワークを停止・削除 |
| docker compose down -v | ボリュームも含めて削除 |
| docker compose ps | コンテナの状態確認 |
| docker compose logs -f php | php コンテナのログをリアルタイム表示 |
| docker compose exec php sh | php コンテナでシェルを開く |
| docker compose build | イメージをビルド |
| docker compose pull | イメージを最新版に更新 |
# 起動 cd myapp docker compose up -d # コンテナの状態確認 docker compose ps # MySQL に接続して確認 docker compose exec mysql mysql -u myapp_user -p myapp_db
関連ドキュメント
Docker 入門(Ubuntu 24.04 LTS) — Docker Engine インストール、Dockerfile 基礎
Nginx SSL/TLS 設定(Ubuntu 24.04 LTS) — HTTPS 設定、TLS 1.2/1.3
PHP + Apache 設定(Ubuntu 24.04) — PHP インストール、php.ini 設定
Docker + Nginx 構成を HTTPS 化するには
Docker Compose で Nginx をリバースプロキシにする構成では、Nginx コンテナに SSL証明書を設定することで HTTPS 化できます。
証明書ファイルをホスト側に配置し、volumes でコンテナにマウントする方法が一般的です。
エスロジカルではデジサート・サイバートラストの正規取扱代理店として、
2009年から16年以上、RapidSSL 3,960円/1年(税込)〜でSSL証明書を販売しています。審査サポート・インストール代行も対応しています。
SSL証明書の購入はこちら / SSL証明書とは? / インストール代行サービス
