株式会社エスロジカル
株式会社エスロジカル
SSL証明書(DV、OV、EV)、セキュリティ、Web開発、Linux開発、Go言語

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 入門 を参照してください。


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 に同梱

myapp/
├── compose.yaml
├── .env
├── nginx/
│   └── default.conf
└── php/
    └── Dockerfile

パスワードなどの秘密情報は .env ファイルに分離し、.gitignore に追加します。

# .env
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=myapp_db
MYSQL_USER=myapp_user
MYSQL_PASSWORD=myapp_pass

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:

# php/Dockerfile
FROM php:8.3-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql

# 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;
    }
}

Nginx と PHP を frontend ネットワーク、PHP と MySQL を backend ネットワークに配置します。 MySQL は frontend ネットワークに属さないため、Nginx から直接 MySQL には到達できません。

コンテナ frontend backend
nginx
php
mysql

MySQL は起動してもすぐに接続を受け付けられるわけではありません。 healthcheck で MySQL の準備完了を確認し、depends_on: condition: service_healthy で PHP が MySQL の準備完了後に起動するよう制御します。


コマンド 説明
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 Compose で Nginx をリバースプロキシにする構成では、Nginx コンテナに SSL証明書を設定することで HTTPS 化できます。 証明書ファイルをホスト側に配置し、volumes でコンテナにマウントする方法が一般的です。
エスロジカルではデジサート・サイバートラストの正規取扱代理店として、 2009年から16年以上、RapidSSL 3,960円/1年(税込)〜でSSL証明書を販売しています。審査サポート・インストール代行も対応しています。

SSL証明書の購入はこちら / SSL証明書とは? / インストール代行サービス


← 技術ドキュメント一覧へ戻る