2026年7月23日

2026年7月23日

WordPressのDocker環境を構築する方法|Docker Composeで作るローカル開発環境

Dockerを使うと、パソコンにPHPやMySQLを直接入れなくても、WordPressの開発・検証用の環境をコマンド1つで起動・破棄できます。この記事では、Docker Hubの公式wordpressイメージとmysqlイメージを、Docker Composeでまとめて動かす手順を解説します。ここで作るのはローカルの開発環境で、本番公開用の構成ではありません(2026年10月時点の内容で、手元で動作を確認しています)。

準備: DockerとCompose

次のどちらかを用意します。

  • Windows・Mac: Docker Desktopを入れます。Composeも同梱されています。
  • Linux: Docker公式ドキュメント(docs.docker.com)の手順で、Docker EngineとComposeプラグイン(docker-compose-plugin)を入れます。

入ったかどうかは、次のコマンドで確認します。

docker version
docker compose version

コマンドはdocker compose(間にスペース)です。古い記事にあるdocker-compose(ハイフン付き、バージョン1.x)は更新が終わった旧版なので、GitHubから個別にダウンロードして入れる必要はありません。

手順1: 作業用フォルダーとファイルを用意する

次の構成でファイルを作ります。

wordpress-docker/
├── compose.yaml
├── .env
├── php/
│   └── uploads.ini
└── my-theme/
    ├── style.css
    └── index.php

.env(パスワード)

データベースのパスワードはcompose.yamlに直接書かず、同じフォルダーの.envに分けます。Composeは.envの値を${...}の部分に自動で埋め込みます。Gitで管理する場合は、.envを.gitignoreに入れてください。

DB_PASSWORD=ここに長いランダムな文字列
DB_ROOT_PASSWORD=ここに別の長いランダムな文字列

compose.yaml

services:
  db:
    image: mysql:8.4
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:6-php8.3-apache
    depends_on:
      - db
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DEBUG: "1"
    volumes:
      - wp_data:/var/www/html
      - ./my-theme:/var/www/html/wp-content/themes/my-theme
      - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro

  wpcli:
    image: wordpress:cli-php8.3
    profiles: ["tools"]
    user: "33:33"
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
    volumes:
      - wp_data:/var/www/html
      - ./my-theme:/var/www/html/wp-content/themes/my-theme

volumes:
  db_data:
  wp_data:

主な設定の意味は次のとおりです。

設定 意味
mysql:8.4 MySQLの長期サポート版。MySQL 8.0はサポートが終了しているため使いません
wordpress:6-php8.3-apache WordPress 6系、PHP 8.3、Apacheの組み合わせ。latestより、使うPHPのバージョンが固定されて再現しやすくなります
127.0.0.1:8080:80 パソコン自身からだけhttp://localhost:8080で開けるようにします。127.0.0.1:を外すと、同じネットワークのほかの機器からも見えます
WORDPRESS_DB_HOST: db Composeのサービス名dbで、データベースのコンテナに接続します
WORDPRESS_DEBUG: "1" WP_DEBUGを有効にします(開発用)
db_data / wp_data データベースとWordPressのファイルを、コンテナを作り直しても消えない名前付きボリュームに保存します
./my-theme:... 手元のテーマのフォルダーをコンテナに見せます。手元で編集すると、すぐに反映されます
profiles: ["tools"] WP-CLI用のコンテナは、docker compose upでは起動せず、使うときだけ起動します

compose.yamlの先頭にversion: '3.8'のような行を書く必要はありません。現在のComposeではこの項目は使われず、書くと「obsolete」という警告が出ます。

認証用のキー(AUTH_KEYなど)は、公式イメージがWORDPRESS_*の環境変数を受け取ったときに、ランダムな値を自動で生成してwp-config.phpに設定します。wp-config.phpを手で編集する必要はありません。

php/uploads.ini(PHPの設定)

公式イメージのPHPは、/usr/local/etc/php/conf.d/にある.iniファイルを読み込みます。アップロードできるファイルの大きさなどを変える場合は、このファイルで指定します。

upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M

my-theme(開発するテーマ)

テーマを開発する場合の最小の例です。既存のテーマを使うだけなら、このフォルダーとcompose.yamlの./my-themeの行は不要です。

my-theme/style.css:

/*
Theme Name: My Theme
*/

my-theme/index.php:

<?php
echo 'My Theme';

手順2: 起動してWordPressをインストールする

compose.yamlのあるフォルダーで、次のコマンドを実行します。

docker compose up -d
docker compose ps

初回はイメージのダウンロードとデータベースの初期化に時間がかかります。直後にブラウザで開くと「データベース接続確立エラー」が表示されることがありますが、depends_onはコンテナの起動順を決めるだけで、MySQLの準備完了までは待たないためです。数十秒待ってからhttp://localhost:8080を開き直すと、WordPressのインストール画面が表示されます。言語、サイト名、管理者ユーザーなどを入力してインストールします。

起動しない場合は、ログを確認します。

docker compose logs -f wordpress
docker compose logs -f db

手順3: WP-CLIを使う

wpcliサービスを使うと、コンテナの中のWordPressをWP-CLIで操作できます。画面からのインストールの代わりにも使えます。

# コマンドでインストールする場合(画面でインストールした場合は不要)
docker compose run --rm wpcli wp core install --url=http://localhost:8080 --title="Dev Site" --admin_user=admin --admin_password='長いパスワード' --admin_email=admin@example.com --skip-email

# プラグインを入れて有効化する
docker compose run --rm wpcli wp plugin install query-monitor --activate

# テーマの一覧を表示する
docker compose run --rm wpcli wp theme list

user: "33:33"は、WP-CLIが作るファイルの所有者を、wordpressコンテナのApacheが使うwww-data(ID 33)にそろえるための指定です。これがないと、WP-CLIで入れたプラグインを管理画面から更新・削除できなくなることがあります。

手順4: データをバックアップする

データベースはmysqldumpで書き出します。

docker compose exec -T db sh -c 'exec mysqldump --no-tablespaces -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > backup.sql

--no-tablespacesを付けないと、一般ユーザーでは権限が足りず「PROCESS privilege」のエラーが出ます。パスワードについての警告が表示されますが、ダンプ自体は作られます。

戻すときは、次のように読み込みます。

docker compose exec -T db sh -c 'exec mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < backup.sql

アップロードした画像などはwp_dataボリュームの中にあります。必要なら、WP-CLIや管理画面のエクスポート、バックアップ用プラグインで書き出します。

手順5: 停止と後片付け

# 停止(データは残る)
docker compose stop

# コンテナを削除(ボリュームのデータは残る)
docker compose down

# データも含めてすべて削除(元に戻せない)
docker compose down -v

down -vは、データベースとWordPressのファイルを保存したボリュームまで削除します。必要なデータを書き出してから実行してください。

本番環境で使う場合の注意

この構成は、パソコンの中だけで使う開発環境を前提にしています。インターネットに公開するサーバーで使う場合は、少なくとも次の点を別に用意する必要があります。

  • HTTPSを処理するリバースプロキシ(NginxやTraefikなど)と証明書の更新
  • WORDPRESS_DEBUGを外す、データベースのポートを公開しない、パスワードを強いものにする
  • データベースとアップロードファイルの定期バックアップと、復元の手順
  • イメージを定期的に取り直して、WordPress・PHP・MySQLの更新を反映する運用

公式イメージは、HTTPSを処理するリバースプロキシの後ろで動かすためのHTTP_X_FORWARDED_PROTOの処理もwp-config.phpに組み込んでいます。

まとめ

  • Docker Desktop、またはDocker EngineとComposeプラグインを入れ、docker composeコマンドで操作します。旧版のdocker-composeやversion:の行は不要です。
  • 公式のwordpressイメージとmysql:8.4をcompose.yamlで定義し、パスワードは.envに分けます。
  • データは名前付きボリュームに保存し、開発するテーマだけを手元のフォルダーからマウントします。
  • PHPの設定は/usr/local/etc/php/conf.d/に.iniをマウントして変えます。
  • WP-CLIはuser: "33:33"を付けたwordpress:cliイメージで動かし、データベースはmysqldump --no-tablespacesでバックアップします。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲