dockerでWordPressの開発環境を構築したメモ

勉強がてら既存のWordPressサイトのローカル環境を構築したのでメモ。

条件

  • Docker Desktopインストール済み
  • 管理しているWordPressサイトがある

作業の流れ

  1. docker-compose.ymlの作成
  2. ボリュームの作成
    1. テーマ
    2. プラグイン
    3. 画像
  3. データベース初期値の設定
    1. sqlファイルの用意
    2. エクスポートしたSQLファイルを取り込む
    3. テーブル接頭辞の設定

最終的なファイル構成

mySite
 ┣ docker-compose.yml
 ┣ plugins
 ┃ ┣ plugin A
 ┃ ┣ plugin B
 ┃ plugin C
 ┣ themes
 ┃ ┣ mytheme
 ┃ ┗ mytheme-child
 ┣ uploads
 ┃ ┣ 2020
 ┃ ┗ 2021
 ┗ db_data
   ┗ initdb
     ┗ exported_data.sql

docker-composeのコマンド

コンテナの起動 docker-compose up -d
  • -d オプション:コンテナをバックグラウンドで起動させておくことが出来る
コンテナの再起動 docker-compose up -d
  • 更新したdocker-compose.ymlを反映させられる
コンテナの停止 docker-compose stop
  • コンテナは削除されずに残る
  • 再び起動してもDBのデータはそのまま保持される
停止したコンテナの起動 docker-compose start
コンテナの削除 docker-compose down
  • コンテナは削除される
  • 再び起動しても、以前のDBのデータは削除される(ボリューム{後述}を利用すれば削除されない)

docker-compose.ymlの作成

Docker Compose 概要

Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose においては YAML ファイルを使ってアプリケーションサービスの設定を行います。コマンドを1つ実行するだけで、設定内容に基づいたアプリケーションサービスの生成、起動を行います。

https://docs.docker.jp/compose/overview.html

docker-compose.ymlは、公式のものを編集して作成していきます。https://docs.docker.com/samples/wordpress/

上記サイトにあるコードをコピーして、mySiteディレクトリにdocker-compose.ymlを作成します。

version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

ターミナルでmySiteディレクトリ に移動して、次のコマンドを実行しWordPressの環境を立ち上げます。

docker-compose up -d

http://localhost:8000/にアクセスするとWordPressの初期設定画面が表示されます。
画面に従って、WordPressの初期設定を完了させます。

ボリュームの作成

ボリュームとは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組みです。

https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/

今回、既存サイトのローカル環境の構築ということなので、すでにWordPressで使っているテーマ、プラグイン、DBのデータをこのボリュームを使ってコンテナにマウントすることで、コンテナからアクセスできるようになります。

テーマ、プラグイン、画像のボリューム作成

docker-compose.ymlファイルの19行目のvolumesに以下を追加

      - ./themes:/var/www/html/wp-content/themes
      - ./plugins:/var/www/html/wp-content/plugins
      - ./uploads:/var/www/html/wp-content/uploads

mySiteディレクトリ の直下にthemes, pulugins, uploadsディレクトリを作成し、それぞれに既存サイトで使っているテーマ、プラグイン、画像を配置します。

コマンドラインで、次のコマンドを実行して、コンテナを再起動します。
編集したdocker-compose.ymlファイルの内容を取り込みます。

docker-compose up -d

WordPressの管理画面からテーマの編集ページにアクセスすると、themesディレクトリに配置したテーマが、プラグインの編集ページにアクセスすると、pluginsディレクトリに配置したプラグインが表示されます。
この時点で、画像もマウントされてますので、次に説明するデータベースのデータを読み込めば、表示されます。

データベース初期値の設定

既存サイトで投稿された記事、ページ、プラグインの設定などのデータを初期値としてmySQLコンテナに取り込みます。

新しいインスタンスの初期化

コンテナが初めて起動されると、指定された名前の新しいデータベースが作成され、提供された設定変数で初期化されます。さらに、/docker-entrypoint-initdb.d にある拡張子 .sh, .sql, .sql.gz のファイルがアルファベット順で実行されます。このディレクトリにSQLダンプをマウントすることで、簡単にmysqlサービスにデータを取り込むことができ、カスタムイメージにデータを提供することができます。SQLファイルはデフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます。

https://hub.docker.com/_/mysql/

sqlファイルの用意

まずは、既存サイトのデータをエクスポートします。今回は、phpMyAdminからエクスポートします。次のページを参考にエクスポートしてください。
WordPress Codex

エクスポート設定

  • エクスポート方法:「詳細」を選択
  • 生成オプション:「DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER コマンドを追加する」オプションを選択

siteurl, homeの編集

エクスポートしたファイルのままだとoptionsテーブルのsiteurlとhomeが既存サイトのURLになっているので、サイトが表示されませんので、修正します。

エクスポートしたファイルをエディターで開いて、’siteurl’や’home’でファイル内を検索すると以下のような箇所がありますので、urlをhttp://localhost:8000に置き換えます。

(1, 'siteurl', 'https://hogehoge.jp/', 'yes'),
(37, 'home', 'https://hogehoge.jp/', 'yes'),

これで、SQLファイルの用意ができました。

エクスポートしたSQLファイルを取り込む

SQLファイルをSQLコンテナに取り込むには、/docker-entrypoint-initdb.dにSQLファイルをマウントします。

docker-compose.ymlファイルの6行目にあるvolumesに以下を追加します。

      - ./db_data/initdb:/docker-entrypoint-initdb.d

mySiteディレクトリ の直下にdb_dataディレクトリを作成し、用意したsqlファイルを配置します。

コマンドラインで次のコマンドを実行して再起動させます。

docker-compose down
docker volume rm $(docker volume ls -qf dangling=true)
docker-compose up -d

docker-compose up -dだけではなく、docker volume rm $(docker volume ls -qf dangling=true)で、ボリュームを一旦削除しています。そうしないと更新まえのボリュームを読み込んでしまい、sqlが読み込まれません。

参考記事:
https://qiita.com/kondo0602/items/ab0a85fb1e731234eb1a
https://qiita.com/t-kigi/items/82e36bcc7630f92fc24e

テーブル接頭辞の設定

既存サイトのWordPressのテーブル接頭辞がwp_でない場合、テーブル接頭辞の設定が必要です。

docker-compose.ymlファイルの28行目environmentに以下を追加します。(接頭辞をhoge_の場合)

      WORDPRESS_TABLE_PREFIX: hoge_

コマンドラインで、次のコマンドを実行して、コンテナを再起動します。

docker-compose up -d

http://localhost:8000/にアクセスすると既存サイトが表示されるはずです。

その他メモ

//使用していないDockerオブジェクトの削除
docker system prune
https://docs.docker.jp/config/pruning.html

//mySQLに入る
docker exec -it <コンテナ名> bash
※コンテナ名は、docker psで表示されるNAMESの値

// wordpressに入る
docker-compose exec <サービス名(wordpress)> sh
※サービス名は、docker-compose psで表示されるSERVICEの値

//データベース接続
mysql -u root -p

//データベース確認
show databases;

//データベース選択
use <データベース名>;

//テーブル確認
show tables;

プラグインを起動時にインストール(Dockerfile)(いつか書く)

参考:https://tech.recruit-mp.co.jp/infrastructure/post-11266/#h-5