0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

dockerでWordPress

Last updated at Posted at 2025-12-21

内容

自作テーマを使って運用していたWordPressブログを別のサーバーに移すにあたり
gitでソースコード管理してdockerでデプロイするようにしてみました

テーマのソースコード管理はやりやすくなりますし
DBのポートを隠蔽できるのでセキュリティもちょっとだけ改善する気がします

1. 環境を作成

docker-compose.yml

WordPressとmysqlは公式のdockerコンテナがあるので環境は簡単につくれます

docker-compose.yml
version: "3.9"

services:
  db:
    image: mysql:8.0
    container_name: blog_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost -p$${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    image: wordpress:6.5.4-php8.2-apache
    container_name: blog_wordpress
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    ports:
      - "8080:80"
    volumes:
      - ./wordpress:/var/www/html

後は起動するだけでコンテナが自動的に必要なファイルを生成して環境が完成します

docker compose up -d

.gitignoreを追加

WordPressのwp-contentやDBの永続化ファイルがモリモリ作成されます

要らないものは.gitignoreに書いておきます

.gitignore
# =========================
# Docker / 永続データ
# =========================

# MySQL の実データ(必ず除外)
mysql/

# WordPress 実行時に生成されるファイル群
wordpress/wp-content/uploads/
wordpress/wp-content/cache/
wordpress/wp-content/upgrade/
wordpress/wp-content/themes/twentytwentyone/
wordpress/wp-content/themes/twentytwentytwo/
wordpress/wp-content/themes/twentytwentythree/
wordpress/wp-content/themes/twentytwentyfour/
wordpress/wp-content/plugins/akismet/
wordpress/.htaccess
wordpress/wp-content/index.php
wordpress/wp-content/plugins/hello.php
wordpress/wp-content/plugins/index.php
wordpress/wp-content/themes/index.php

# =========================
# WordPress コア(公式イメージが自動生成)
# =========================

wordpress/wp-admin/
wordpress/wp-includes/
wordpress/index.php
wordpress/xmlrpc.php
wordpress/wp-*.php
wordpress/license.txt
wordpress/readme.html

# =========================
# 設定・秘密情報
# =========================

.env
.env.*
*.env

# =========================
# バックアップ・ダンプ
# =========================

*.sql
*.sql.gz

# =========================
# OS / Editor
# =========================

.DS_Store
Thumbs.db
.vscode/
.idea/

# =========================
# Logs
# =========================

*.log

2. 旧環境からバックアップする

以下の3つをバックアップします
対象ファイルをscpなどで回収するだけです

1: DB
2: アップロードしたファイル
3: テーマ

DB

DBの内容をSQLファイルに書き出してコピーします

旧サーバーのCLI
mysqldump -u ユーザー名 -p パスワード > ~/wp_backup.sql
作業環境のCLI
scp ユーザー名@xxx.xxx.xxx.xxx:~/wp_backup.sql ./wp_backup.sql

アップロードしたファイル

アップロードされたファイルはwp-content/uploadsに
保存されていますので、まるごとコピーしておきます

作業環境のCLI (kusanagi環境の場合)
scp -r ユーザー名@xxx.xxx.xxx.xxx:/home/kusanagi/サイト名/DocumentRoot/wp-content/uploads ./wp-content/uploads

テーマ

テーマはwp-content/themes に保存されています
テーマごとにフォルダ分けされているので必要なものだけ回収します

作業環境のCLI (kusanagi環境の場合)
scp -r ユーザー名@xxx.xxx.xxx.xxx:/home/kusanagi/サイト名/DocumentRoot/wp-content/themes/テーマ名 ./wp-content/themes/テーマ名

3. 新環境に復元する

DB

引っ越し先サーバーにsqlファイルを置いてインポートします

作業環境のCLI
scp ./wp_backup.sql ユーザー名@xxx.xxx.xxx.xxx:~/wp_backup.sql

今回、docker-compose.ymlから起動しているので

新サーバーのCLI
docker compose exec -T db sh -lc \
'mysql -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < ~/wp_backup.sql

アップロードしたファイル

作業環境のCLI
scp -r ./wp-content/uploads ユーザー名@xxx.xxx.xxx.xxx:gitプロジェクトのパス/wordpress/wp-content/uploads

テーマ

作業環境のCLI
scp -r ./wp-content/themes/テーマ名 ユーザー名@xxx.xxx.xxx.xxx:gitプロジェクトのパス/wordpress/wp-content/themes/テーマ名

4. localhostで開発できるようにする

localhostで動かそうとすると、以下の2つの問題が発生します

1. 内部リンクが本番環境のURLになってしまう
2. 管理ページがhttpsを強制する

上記については以下のように解決できます

1: hostsで名前解決を変更する
2: mkcertでhttps用の証明書を作る

hostsで名前解決を変更する

WordPressは基本的に本番環境URLの絶対パスで動作するように作られていて、/wp-adminのようなWordPressが制御する内部リンクも、画像などのメディアへのリンクも本番環境の絶対パスで動作します。WordPressが制御する内部リンクは設定に書き込むことで変更できますが、メディアへのリンクは記事データに直接書かれてしまっているので開発環境用にはURLを書き換えた開発用DBを用意することになってしまってイマイチに思えます

そこで、本番環境URLへのリクエストの名前解決をOSレベルで置き換えてしまおうと思います。Windowsの場合はC:\Windows\System32\drivers\etc\hostsに以下のように書くと、開発PCにおけるexample.comへのリクエストをOSが127.0.0.1として置き換えてくれます。実際にはご自分の開発対象のURLを記載してください

C:\Windows\System32\drivers\etc\hosts
127.0.0.1  example.com
127.0.0.1  www.example.com

開発終了後に本番デプロイしたら記載を消して本来のURLにアクセスするようにします

mkcertでhttps接続するようにする

mkcertで証明書を登録する

mkcertで鍵を作ります
https://qiita.com/studio_haneya/items/3ea028a728de320f9249

作成した鍵ファイル (example.comの場合)
example.com-key.pem
example.com.pem

以下の様に鍵ファイルを配置します

├─ nginx/
│  ├─ conf.d/
│  │  └─ wordpress.conf
│  ├─ keys/
│  │  ├─ example.com-key.pem
│  │  └─ example.com.pem
│  └─ .gitignore
├─ docker-compose-local.yml
└─ docker-compose.yml

docker-compose.yml

最初に作成したdocker-compose.ymlに環境変数を追加します

docker-compose-dev.yml
services:
  nginx:
    image: nginx:1.27-alpine
    container_name: dev-nginx
    restart: unless-stopped
    depends_on:
      - wordpress
    ports:
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/keys:/etc/nginx/ssl:ro

nginxでTLS終端を作ります
example.comの部分はご自分のサイト名に変更してください

nginx/conf.d/wordpress.conf
server {
    listen 80;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name _;

    ssl_certificate /etc/nginx/ssl/example.com.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com-key.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://wordpress:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

起動するときには以下のようになります

開発環境CLI
docker compose -f docker-compose.yml -f docker-compose-dev.yml up -d

5. その他

パスワードをリセットする

以下で1番目のユーザーのパスワードをTempPass123!に変更できますので、ログインした後に管理画面で適切なパスワードに変更してください

サーバーのCLI
docker compose exec -w /var/www/html wordpress php -r '
require "wp-load.php";
wp_set_password("TempPass123!", 1);
echo "done\n";
'

まとめ

WordPressセットアップ済みのVPSを使った方がもっと簡単ですから、WordPressユーザーの多数派であろう非エンジニアの方はそちらを選択するのが合理的だと思います

サーバーを用意して自分でLAMP環境つくるのと比べるとかなり楽に環境がつくれますので、エンジニアが受託でWordPress開発をやるような場合には、このやり方はそれなりに選択肢になると思います

フロントエンドを書けるエンジニアが自分用にブログを作るのであれば、このWordPressの独特のお作法に制約されながら遅いブログを作るよりもヘッドレスCMS+SSGで書くのが合理的だと思います

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?