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でバックアップします。