経験知ロゴ

DockerでWordPressのテーマ・プラグイン開発環境を構築する手順

DockerでWordPressの開発環境を整える

WindwosでWordPressの開発をしていると、WP CLIが使いづらいという問題がありました。

以前から気になっていたDockerを使って見たところ、学ぶのはちょっと大変でしたが、理解してしまうととても簡単で便利!

もっと早くから導入しておけばよかったなという感じです。

備忘録を兼ねて自分の設定を残しておきます。

Dockerのインストール

WindowsにDockerをインストールする手順は下記記事で紹介しています。

docker-compose.ymlとDockerfile

開発作業をするフォルダに「docker-compose.yml」と「Dockerfile」を作成。「Dockerfile」は拡張子なしでOK。

WordPressの初期設定用のシェルスクリプト「wp-install.sh」(これは任意で自分が分かりやすいファイル名でOK)も開発フォルダ内に作成

docker-compose.yml

version: '3.8'
services:
  wp:
    container_name: wordpress
    build: ./
    restart: always
    working_dir: /var/www/html
    ports:
      - '8080:80'
    depends_on:
      - db
    volumes:
      - wordpress_data:/var/www/html
      - ./themes:/var/www/html/wp-content/themes
      - ./plugins:/var/www/html/wp-content/plugins
      - ./wp-install.sh:/tmp/wp-install.sh
    environment:
      TZ: 'Asia/Tokyo'
      WORDPRESS_DB_HOST: 'db:3306'
      WORDPRESS_DB_USER: 'wordpress'
      WORDPRESS_DB_PASSWORD: 'wordpress'
      WORDPRESS_DB_NAME: 'wordpress'
      WORDPRESS_DEBUG: 1
  db:
    container_name: mysql
    image: mysql:8.0.27
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_DATABASE: 'wordpress'
      MYSQL_ROOT_PASSWORD: 'wordpress'
      MYSQL_USER: 'wordpress'
      MYSQL_PASSWORD: 'wordpress'

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5.1.1
    container_name: phpmyadmin
    ports:
      - 8000:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=wordpress
    depends_on:
      - db

volumes:
  mysql_data:
  wordpress_data:

Dockerfile

FROM wordpress:5.8-php7.4

RUN apt update \
     && apt install -y sudo git default-mysql-client subversion \
     && curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
     && chmod +x wp-cli.phar \
     && mv wp-cli.phar /usr/local/bin/wp \
     && wp --info \
     && echo 'alias wp="wp --allow-root"' >> ~/.bashrc \
     && curl -O https://phar.phpunit.de/phpunit-7.5.20.phar \
     && chmod +x phpunit-7.5.20.phar \
     && mv phpunit-7.5.20.phar /usr/local/bin/phpunit \
     && phpunit --version

初期設定用のシェルスクリプト wp-install.sh

#!/bin/bash

# WordPressの初期設定
wp core install \
--url="http://localhost:8080" \
--title="Test Blog" \
--admin_user='wordpress' \
--admin_password='wordpress' \
--admin_email='info@example.com' \
--allow-root

# 一般設定
wp language core install --allow-root --activate ja
wp option update --allow-root timezone_string 'Asia/Tokyo'
wp option update --allow-root date_format 'Y-m-d'
wp option update --allow-root time_format 'H:i'

# パーマリンク設定
wp option update permalink_structure --allow-root /%postname%/


# 不要なプラグインを削除
wp plugin delete --allow-root hello.php
wp plugin delete --allow-root akismet

解説

WP CLIは、公式Dockerイメージがありますが、実行するコマンドが長かったり、ファイルに書いたシェルスクリプトを実行できなかったりしたので(知識不足の可能性あり)、Dockerfileで直接WP CLIをインストールしています。

docker-compose.yml

version: '3.8'

docker-composeのバージョンを指定。’3’だけだと3.0になってしまうので、小数点以下もしっかり記入。

Dockerとのバージョン対応は下記ページで確認できる。

services:

servicesは、Dockerで使うアプリの一まとまり(サービス)を設定する。

wp:

コンテナの定義。WordPressに関するコンテナなので、wpと自分でつけた。名前は好きに付けられるが、他のコンテナと連携する時に使う名前なのでわかり易い名前をつける。

container_name: wordpress

コンテナの詳細な名前、他のdocker-compose.ymlで指定されてるcontainer_nameとかぶるとエラーが出るので、Docker実行時に注意するか、一意な名前をつけるのが良い。

build: ./

イメージのビルドをDockerfileから行うという設定。「./」の部分で、docker-compose.ymlと同じ階層にある「Dockerfile」を自動で認識してくれる。

docker-compose.ymlからの相対パスも書けるので、別の場所にDockerfileを作りたい場合はそのパスを書く。

restart: always

コンテナ起動時に自動起動するようにする設定。

working_dir: /var/www/html

作業ディレクトリの設定、WordPressの場合は「 /var/www/html」。

ports:
    - '8080:80'

ポートの設定。上記設定は、PCの8080ポートをDockerコンテナの80ポートに接続するという設定。

後のphpmyadminでもポートの設定があり、PCのポートが被るとエラーになるのでかぶらない番号を指定。

depends_on:
      - db

depends_onはサービスの依存関係の設定。後述するmysqlのコンテナ名を「db」に設定しているので、「db」と記入。

    volumes:
      - wordpress_data:/var/www/html
      - ./themes:/var/www/html/wp-content/themes
      - ./plugins:/var/www/html/wp-content/plugins
      - ./wp-install.sh:/tmp/wp-install.sh

volumesは永続データの設定。Dockerは破棄するとすべてのデータが失われてしまうため、volumesで開発用のフォルダを指定することで、Dockerが破棄されても開発コードを残しておくことができる。

- wordpress_data:/var/www/html

「wordpress_data」という名前のボリュームをDocker内に作成し、仮想環境の「/var/www/html」と紐付ける。

「/var/www/html」はWordPress全体が入っているフォルダなので、WordPressのコード全体をDocker内の「wordpress_data」という名前のvolumeに保存するという意味。

Docker内にあるので、エクスプローラーやファインダーからは見ることができないが、下記コマンドで存在しているのを確認できる。

docker volume ls
      - ./themes:/var/www/html/wp-content/themes
      - ./plugins:/var/www/html/wp-content/plugins
      - ./wp-install.sh:/tmp/wp-install.sh

「./themes」のように、フォルダ名のまえに「./」と書くことで、作業フォルダ内の「themes」フォルダをvolumeに指定できる。

実際の作業、ここで指定したフォルダで行うことになる。

仮想環境の「/var/www/html/wp-content/themes」を、docker-compose.ymlと同じ階層にある「themes」と対応させるということ。

プラグインは、仮想環境の「/var/www/html/wp-content/plugins」を、docker-compose.ymlと同じ階層にある「plugins」と対応させる。

これらの「theme」と「plugins」フォルダは、後に「docker-compose up -d」でコンテナを立ち上げる時に自動で作成されるし、既に存在したら上書きされることはない。

「wp-install.sh」はWordPressの初期設定を行うためのスクリプトファイル。

    environment:
      TZ: 'Asia/Tokyo'
      WORDPRESS_DB_HOST: 'db:3306'
      WORDPRESS_DB_USER: 'wordpress'
      WORDPRESS_DB_PASSWORD: 'wordpress'
      WORDPRESS_DB_NAME: 'wordpress'
      WORDPRESS_DEBUG: 1

「environment」はWordPressオフィシャルイメージの環境設定。

「TZ」でタイムゾーンを指定。

「WORDPRESS_DB_HOST」で接続するDBを指定。後述するmysqlのコンテナ名を「db」、ポートを「3306」にしているので「db:3306」と指定。

「WORDPRESS_DB_USER」は、mysqlコンテナ「db」で設定した「MYSQL_USER」の値。
「WORDPRESS_DB_PASSWORD」は「 MYSQL_PASSWORD」、
「WORDPRESS_DB_NAME」は「MYSQL_DATABASE」。

ローカル環境なので、分かりやすいように「wordpress」で統一している。本場環境では絶対に使わない。

「WORDPRESS_DEBUG: 1」でWordPressのデバッグをオンにしている。これがないと開発できない。

その他の環境変数は公式ページで確認できます。
WordPress – Official Image | Docker Hub
db:
 container_name: mysql

mysqlの設定。コンテナ名を「db」とし、container_nameをmysqlとした。

image: mysql:8.0.27

mysqlバージョン8.0.27のイメージを使うという設定。「image:mysql」だけにすると最新バージョンがインストールされる。

「8.0.27」部分のバージョン番号を変えれば、そのバージョンのmysqlが使える。

    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - '3306:3306'

WordPress同様、永続化するためのvolumeの設定と、ポートの設定。

    environment:
      MYSQL_DATABASE: 'wordpress'
      MYSQL_ROOT_PASSWORD: 'wordpress'
      MYSQL_USER: 'wordpress'
      MYSQL_PASSWORD: 'wordpress'

WordPress同様、mysqlの環境設定。開発環境なので全て「wordpress」に統一してみた。本場環境では絶対に使わない。

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5.1.1
    container_name: phpmyadmin
    ports:
      - 8000:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=wordpress
    depends_on:
      - db

phpmyadminの設定。volumesは、sessionsを外部にしておかないと、コンテナ起動毎に増えてしまうようなので設定。

portsはWordPressのポートと被らないように「8000」を指定。

enviromentでは「db」で設定したmysqlの設定を記入。depends_onでmysqlの「db」との依存関係を設定。

volumes:
  wordpress_data:
  mysql_data:

Docker内に作成する永続化用のボリューム設定。wordpressの「wp」コンテナのvolumesで指定した「wordpress_data」と、mysqlの「db」コンテナのvolumesで設定した「mydql_data」を記入。

Dockerfile

Dockerfileに記述した内容の解説

FROM wordpress:5.8-php7.4

wordpressイメージを使って処理をするという宣言。「5.8-php7.4」部分はWordPressのバージョンとPHPのバージョン。

5.8部分を変更すればそのバージョンのWordPressが、7.4の部分を変えるとそのバージョンのPHPがインストールされる。

最新バージョンをインストールしたい場合は、「latest」を使う。

FROM wordpress:latest
RUN apt update \
     && apt install -y sudo git default-mysql-client subversion \

「RUN」でコマンドを実行する。改行する時は末尾に半角空白とバックスラッシュ「 \」を入れる。コマンドを続ける際は「&&」で結合。

処理の流れは、aptのアップデートを確認し、インストール。WP CLIはWordPressコンテナにmysqlが入っていないと実行できないコマンドがあるので、mysqlもインストール。svnコマンドも必要なのでsubversionもインストール。

     && curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
     && chmod +x wp-cli.phar \
     && mv wp-cli.phar /usr/local/bin/wp \
     && wp --info \

curlでWP CLIをダウンロードし、実行権限を変え、「wp」コマンドが使えるように「wp-cli.phar」 を「/usr/local/bin/wp」へ移動。

  && echo 'alias wp="wp --allow-root"' >> ~/.bashrc \

WP CLIを実行する時、「–allow-root」を付けなければならず面倒なので、「~/.bashrc」にエイリアスを書き出し、「wp」だけでWP CLIのコマンドを実行できるようにする。

ただし、シェルスクリプト内の「wp」コマンドは「–allow-root」がなければ実行できない模様。

  && curl -O https://phar.phpunit.de/phpunit-9.5.11.phar \
  && chmod +x phpunit-9.5.11.phar \
  && mv phpunit-9.5.11.phar /usr/local/bin/phpunit \
  && phpunit --version

phpunitのダウンロードと、アクセス権を変更し、phpunitコマンドが使えるように「 /usr/local/bin/phpunit」へ移動。

実行手順

作業フォルダに「docker-compose.yml」と「Dockerfile」、「wp-install.sh」がある状態で進める。

コマンドプロンプトorターミナルで作業フォルダに移動。

cd /path/to/folder

Dockerを起動。「-d」を使うことで、全てバックグラウンドで実行できる。

docker-compose up -d

docker-compose.ymlとDockerfileの記述を元に、ダウンロードとインストールが始まるので暫く待つ。

下記コマンドでコンテナに入り、コンテナ内でコマンド入力。「wp」部分が「docker-compose.yml」で指定したコンテナ名。

docker exec -it wp  /bin/bash

シェルスクリプトの実行。

/tmp/wp-install.sh

WordPressの初期設定が実行されるので暫く待つ。

一応WP CLIでプラグインのテスト環境をscaffoldしてみる。pluginsフォルダ内に「プラグイン名」のフォルダがないとエラーになるので、pluginsフォルダ内にプラグインフォルダを作っておく。

wp scaffold plugin プラグイン名

シェルスクリプトの処理が終わったらブラウザで「localhost」+「docker-compose.yml」の「wp」コンテナで指定したポート番号を追加してアクセス。

http://localhost:8080/

WordPressの画面が表示されればOK。

phpmyadminはポート番号8000に設定したので、下記URLでアクセスできる。

http://localhost:8000/

これで一応の開発環境が整いました。

Dockerコマンド

よく使うDockerコマンドのまとめ。

Dockerの一時停止。

docker-compose stop

Dockerの再開。

docker-compose restart

コンテナを削除。(volumesで設定したフォルダは削除されない)

docker-compose down

削除したコンテナを再開。

docker-compose up -d

コンテナ内でコマンド操作に入る。

docker exec -it [コンテナ名]  /bin/bash

コンテナ内のコマンド操作から出る。

exti

Dockerfileの編集をした後。buildしてからupする。

docker-compose build
docker-compose up -d

docker-compose.yaml変更後、upのみでOK

docker-compose up -d

コンテナ一覧を表示

docker compose ps

docker-composeのバージョンを表示。

docker compose version

ボリューム一覧表示

docker volume ls

指定したボリュームを削除

docker volume rm VOLUME NAME

おわりに

いろいろな情報を見てきましたが、人それぞれの方法で構築していたので、自分にはどれが合っているのか一つずつ調べながら設定したので知識が付きました。

なぜこの設定なのかを理解すると応用ができて良いですよね。

役に立ったらこの記事のシェアをお願いします

ブログのフォロー・RSS購読は下記ボタンから