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 - ./tmp:/tmp - ./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
- ./tmp:/tmp - ./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の初期設定を行うためのスクリプトファイル。
「tmp」はテスト用のWordpPressファイルが入るフォルダ。
「bash bin/install-wp-tests.sh」を実行すると「/tmp」以下にテスト用のWordPressがダウンロードされるが、コンテなを再起動する度にインストールするのは面倒なので、tmp毎ローカルに保存。
mysqlのようにDocker内に保存してもよいが、docker compose する時にtmpフォルダがまだ存在していないためエラーが出るので、とりあえず作業フォルダ内においておく。
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の記述を元に、ダウンロードとインストールが始まるので暫く待つ。
下記コマンドでコンテナに入り、コンテナ内でコマンド入力。「wordpress」部分が「docker-compose.yml」で指定したコンテナ名。
docker exec -it wordpress /bin/bash
シェルスクリプトファイルの権限を変更。
chmod +x /tmp/wp-install.sh
シェルスクリプトの実行。
/tmp/wp-install.sh
下記エラーが出たら、wp-install.shの改行コードがおかしいので、改行コードを「LF」に直してから再実行。
bash: /tmp/wp-install.sh: /bin/bash^M: bad interpreter: No such file or directory
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/
ファイル権限でプラグインをインストール出来ない場合は下記コマンドでファイルの書き込み権限を変える。
chown -R www-data:www-data *
これで一応の開発環境が整いました。
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
おわりに
いろいろな情報を見てきましたが、人それぞれの方法で構築していたので、自分にはどれが合っているのか一つずつ調べながら設定したので知識が付きました。
なぜこの設定なのかを理解すると応用ができて良いですよね。