WordPressウェブサイトをDocker&Svelteを使ってローカル環境で開発する①〜準備編


※ 当ページには【広告/PR】を含む場合があります。
2022/06/11
2022/08/19
【Svelte Framework入門】Svelteを使ってJavascript/CSSからSVG曲線チャートを描く
WordPressウェブサイトをDocker&Svelteを使ってローカル環境で開発する②〜テーマ開発編



今回は何回かの記事に分けて、
「SvelteとWordPressの連携」 をテーマに扱った記事を紹介していきます。
WordPressは言わずもがな、世界中でもっとも利用されているCMSの一つです。
機能的にも充実しており、WordPressでECサイトのような高機能サイトを独自に構築する場合、WooCommerceに代表されるような決済APIをプラグインとして手軽に連携することが出来るため、ネットショップを一からフルスクラッチするよりはWordPressベースで構築することで比較的楽に開発作業ができます。
ネットショップサイトを作るならフロントエンド周りは、JSフレームワークだとReactやVue、Next.js等で実装されているページが多いようです。
実績や実例が多く紹介されてあるReactでECサイトを作るのが一番楽そうに思えますが、今回は出来れば軽量なサイト設計にしたいことと、まだやられている例の少なそうなチャレンジ性の高さからSolid.jsやSvelteなどを利用したいと考えていました。
WordPress界隈だとまだまだヘッドレスCMS等での設計に本格採用されるケースは少ないようですが、とりあえず鋭意勉強中のSvelteを使ってWordPressページを作成していきます。
今回は手始めに、手元の環境でプレビューしながら開発できるように、WordPress用のDockerコンテナを構築するまでの手順を考えていきます。


合同会社タコスキングダム|蛸壺の技術ブログJavascript(js)&Typescript(ts)プログラミング入門〜これから学ぶ人のためのおすすめ書籍&教材の手引き
超JavaScript 完全ガイド 2024

Docker wordpressイメージの導入



おおよそ
Docker公式のドキュメントに紹介されている手順 を使えるようにしてみます。

リソースファイルの追加



適当なプロジェクトフォルダを
my_wp という名前で新規作成し、その中で作業を開始します。


            $ mkdir my_wp
$ cd my_wp

        

今回はカスタムイメージは利用しないので、docker-composeだけでWordPress開発環境を構築します。

            $ touch docker-compose.yml

        

で空の設定ファイルを作成し、以下の内容に編集しましょう。


            version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
       MYSQL_DATABASE: ${MYSQL_DATABASE}
       MYSQL_USER: ${MYSQL_USER}
       MYSQL_PASSWORD: ${MYSQL_PASSWORD}

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
       WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
       WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}

volumes:
    db_data:

        

docker-composeで処理するコンテナ内の環境変数は
.env ファイルに切り出して任意のタイミングで変更できるようにしておくと後々便利です。

            $ touch .env

        

作成した
.env ファイルは以下のように書き換えておきます。

            MYSQL_ROOT_PASSWORD=somewordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress

        

Docker Compose ビルド



では、先程docker-compose.ymlを元にデタッチモードでDockerコンテナを起動してみます。

            $ docker-compose up -d
$ docker-compose ps
           Name                          Command               State                  Ports                
-----------------------------------------------------------------------------------------------------------
sveltewordpress_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp                 
sveltewordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8000->80/tcp,:::8000->80/tcp

        

正常に起動したら、ここで一度
http://localhost:8000 にアクセスしてみましょう。
アクセスしてみると、WordPressの初期設定が開始されることが分かります。

合同会社タコスキングダム|蛸壺の技術ブログ


言語は
[日本語] を選択し、 [次へ] に進みます。


合同会社タコスキングダム|蛸壺の技術ブログ


ここでは、ウェブサイトの基本情報を入力していきます。
とりあえずローカルでの閉じた環境とはいえ、WordPressの本番と同様に以下の登録項目は必須のようです。

            サイトのタイトル: ウェブサイトの概要等。例)svelte-wp-example
ユーザー名: ユーザー名。例)taco777@wp
パスワード: ログインパスワード。
メールアドレス: 連絡先となるEメールアドレス。例)hoge@tacoskingdom.com
検索エンジンでの表示: 今回はローカルなので関係のないオプション

        

後でいくらでも変更が効くようですので、適当な値を入力しましょう。
基本情報を入力後に、
[WordPressをインストール] ボタンを押すと、

合同会社タコスキングダム|蛸壺の技術ブログ


というように設定が完了します。



合同会社タコスキングダム|蛸壺の技術ブログJavascript(js)&Typescript(ts)プログラミング入門〜これから学ぶ人のためのおすすめ書籍&教材の手引き
超JavaScript 完全ガイド 2024

ローカル環境版のWordPressを使ってみる



では先程で初期設定が完了しましたので、先程設定したユーザー名とパスワードを使って一度ログインしてみましょう。

合同会社タコスキングダム|蛸壺の技術ブログ



確かにWordPressが起動しているようです。


合同会社タコスキングダム|蛸壺の技術ブログ



見ての通り中身はWordPressそのものですので、後は通常通りWordPressのページを編集なりしていくことで(もちろんローカルですので誰もサイトに訪れることはありませんが)ブログサイトになります。
ちなみにこのローカルのWordPress環境を停めても設定は維持されるのかどうか少し気になっている方もいると思うので、起動しているDockerコンテナを停止してみます。

            $ docker-compose down

        

そして、再び再起動してみます。

            $ docker-compose up -d

        

再度、
http://localhost:8000 へ移動すると、以下のような初期ページが表示されていることが分かります。


合同会社タコスキングダム|蛸壺の技術ブログ



これは、docker内部できちんとWordPress内部のデータベースが永続化されているためで、データベースの保存場所はLinuxOS環境下では以下のように確認することができます。


            $ sudo ls /var/lib/docker/volumes | grep db_data
sveltewordpress_db_data

        

もし、データベースごと消去したい場合には、以下のコマンドで該当のデータベースを消去することができます。

            $ docker-compose down --volumes

        

このクリーンアップコマンドを利用すると、データベースのみならず、コンテナとネットワークも同時に初期化されますのでご注意ください。

管理者ダッシュボードへのログイン



管理者画面に戻る場合には、
http://localhost:8000/wp-admin にアクセスすることで、再ログインするダイアログが表示できます。

合同会社タコスキングダム|蛸壺の技術ブログ

開発用DockerコンテナからWordpressの内部DBへのアクセス権限を設定する



Dockerを用いたWordPressのローカル開発環境だと、Wordpressコンテナ(アプリケーション側)とMySQLコンテナ(内部データベース側)が分離された形でそれぞれバックグラウンドで稼働した状態になっています。
以降で説明しますがプラグイン開発など、フロントエンド周りをカスタマイズしていくため、共有リソース(Wordpressリソース本体の入っている
/var/www/html フォルダ)をボリューム指定で操作することで開発を進めることができます。
他方で、画像やブログ記事のテキストデータのような、MySQLコンテナが保持しているリソースは、
Wordpress REST API で外部から操作することができます。

Wordpress REST API を利用するには、WordpressのアカウントIDとパスワードを利用する必要があります。
本記事では、
Wordpress REST API には触れませんが、今後急に Wordpress REST API を使いたくなったときに備えて、以下のように .env ファイルにユーザー名とログインパスワードをシェル変数として追加しておきます。

            MYSQL_ROOT_PASSWORD=somewordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress
#👇以下を追記
WP_USER=<登録したユーザー名>
WP_AP_PASS=<ログインパスワード>

        

これで、ローカルの開発用コンテナから
Wordpress REST API を呼び出す際に、環境変数からユーザー名とパスワードを付与することが可能です。


合同会社タコスキングダム|蛸壺の技術ブログJavascript(js)&Typescript(ts)プログラミング入門〜これから学ぶ人のためのおすすめ書籍&教材の手引き
超JavaScript 完全ガイド 2024

Wordpressのローカル開発用Dockerコンテナの構築




先程の節まででは、Docker上で単なるワードプレスが起動しただけでしたので、ここからさらにギアを上げて
「WordPressプラグイン開発のコンテナ」 を盛り込んでいきましょう。

先程のdocker-compose.yml を以下のように新しいサービス dev を追加します。

            version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
      WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
      WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
    #👇プラグイン拡張のためにVOLUMEの追加も行う
    volumes:
      - ./wordpress:/var/www/html

  #👇Wordpressプラグイン開発用のコンテナ
  dev:
    image: wp_dev:node14.19
    build: .
    user: "node:node"
    container_name: wp6-dev
    environment:
      NODE_ENV: ${NODE_ENV}
    volumes:
      - ./:/usr/src/app
    stdin_open: true
    working_dir: "/usr/src/app"
    ports:
      - "4200:4200"
    tty: true

volumes:
  db_data:

        

今回のプラグイン開発によるWordpress開発の手法では、共有ボリューム上のリソースを書き換えるので各コンテナサービス間の通信はあまり問題になりませんが、
Wordpress REST API などコンテナ間のポートフォワーディングを行うなら、ネットワークブリッジを共有する作業が必要になるかも知れません。
また、環境変数の定義(
.env )も以下のように更新しておきます。

            MYSQL_ROOT_PASSWORD=somewordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress
WP_USER=<登録したユーザー名>
WP_AP_PASS=<ログインパスワード>
#👇以下を追記
NODE_ENV=development

        

新たに追加したdocker-composeサービス・
dev は以下のDockerfileをビルドしたイメージで利用します。

            FROM node:14.19-alpine

RUN apk update && apk upgrade && \
    apk add --no-cache bash openssh git ca-certificates wget curl

ENV PS1="[\u@\w]$"
CMD ["bash"]

        

この例ではnode.js v14のnodeイメージを利用しています。 node.jsのバージョンは、開発に使うnpmパッケージの状況を見て適切に組み換えてください。
ここまでで現在のプロジェクトフォルダの中身は以下のようになっています。

            $ tree
.
├── Dockerfile
├── .env
└── docker-compose.yml

        

ここで一旦docker-composeからイメージのビルドを行います。

            $ docker-compose build

        

ビルドしたイメージに問題が無ければ、各コンテナを起動させてみます。

            $ docker-compose up -d
$ docker-compose ps
NAME                           COMMAND                  SERVICE             STATUS              PORTS
svelte-wordpress-db-1          "docker-entrypoint.s…"   db                  running             33060/tcp
svelte-wordpress-wordpress-1   "docker-entrypoint.s…"   wordpress           running             0.0.0.0:8000->80/tcp, :::8000->80/tcp
wp6-dev                        "docker-entrypoint.s…"   dev                 running        

        

これでdocker-composeで定義したコンテナが全てスタンバイ状態で起動していることが分かります。

wordpressフォルダを編集するための前処理

wordpress Docker イメージ において、Wordpressプログラム本体は /var/www/html というフォルダ内に置かれています。
本来であれば、LinuxにWordpressに導入するための手順として、以下のサイトで説明されているように、Wordpress公式のダウンロードページからバイナリプログラムをダウンロードして、適切なディレクトリにリソースを手動で展開する流れとなっています。

参考サイト|WordPressのインストールと設定/var/www/html 内のファイルの中身は、Wordpressそのものですので、フォルダ構造は こちらの参考サイト|WordPress のフォルダ構成 で詳しく解説されているように、多岐に渡るWordpressの機能が全て詰まっているものになります。
まずは、Docker版のWordpressイメージからこのWordpress中身を直接を扱うための前処理について触れましょう。
実は、先程のdocker-composeを初回起動した際に、現在の
wordpress コンテナから /var/www/html 以下にあるリソースが、ローカルの wordpress フォルダにコピーされています。
ただし
wordpress コンテナからコピーされたリソースファイルは、権限をもつユーザー名・グループ名が www-data という名前になっており、そのまま使うには編集する権限が無効になっています。

            $ ls -la wordpress/
合計 244
drwxr-xr-x  5 www-data  www-data   4096  7月  3 17:49 .
-rw-r--r--  1 www-data  www-data    261  6月 10 12:47 .htaccess
-rw-r--r--  1 www-data  www-data    405  2月  6  2020 index.php
#...中略
-rw-r--r--  1 www-data  www-data   4748  4月 11 20:42 wp-trackback.php
-rw-r--r--  1 www-data  www-data   3236  6月  9  2020 xmlrpc.php

        

そこで、これらのファイルにアクセスするために、リソースの権限を現在のお手元のユーザー名・グループ名に書き換えます。 (なおユーザー名・グループ名が分からないときは、
cat /etc/group を確認するか、書き換え可能な任意のファイルを ls -l して見てください。)
以下のchownコマンドでフォルダごと権限を上書きします。

            $ sudo chown -hR [ユーザー名]:[グループ名] wordpress

        

これで
wordpress フォルダ内のリソースは全て書き換え可能になりました。
これでWordpressのテストサイトが書き換え可能になっているかを簡単に確認してみます。
ダッシュボードからデモとして使えるテーマの内、
Tewnty Twenty を選択します。

合同会社タコスキングダム|蛸壺の技術ブログ
合同会社タコスキングダム|蛸壺の技術ブログ



この
Tewnty Twenty というテーマのスタイルファイルは、 wordpress/wp-content/themes/twentytwenty/style.css に格納されています。
ということで、このスタイルファイルを空にするとどうなるのかやってみましょう。

            $ cd wordpress/wp-content/themes/twentytwenty
#👇後で戻せるようにバックアップをコピー
$ cp style.css style.copy.css
#👇style.cssの中身を空っぽにする
$ cp /dev/null style.css

        

これでWordpressサイトを再度読み込んでみると、

合同会社タコスキングダム|蛸壺の技術ブログ


期待通り(?)にCSSスタイルが消えて、スタイルなしのHTMLページになりました。
これでDockerからWordpressサイトをカスタマイズしていく開発環境のベースが構築できたことになります。

Svelteアプリ開発用のコンテナも構築する



先程の説明で、Wordpressのウェブページのテーマが自由に編集・カスタマイズ出来ることは分かりました。
ですが、wordpressのリソースを直接編集して独自のウェブサイトに作り上げることはかなり煩雑な作業になって現実的ではありません。
ウェブサイトを効率よく開発するためには、何かしらの
「フレームワーク」 を利用しながらWordpressのテーマの中身を拡張する必要があります。
ここでは主題の通り、
「Svelte」 アプリでWordpressのテーマの各リソースを適切に統合していくことを目指します。
前段階として兎にも角にも、SvelteでSPA(シングルページアプリケーション)が構築出来るようにしておかないといけません。
以前、SvelteフレームワークとTypescriptで開発環境を構築する方法を記事にしていました。

合同会社タコスキングダム|蛸壺の技術ブログ
【Svelte Framework入門】Svelteの開発環境をDocker Alpine内で簡単に構築する

Alpine LinuxコンテナからSvelteアプリ開発環境を構築するやり方を紹介します。




この記事で説明した手順で、起動中の開発用コンテナ・
wp6-dev の中にアタッチして、 wordpress をプロジェクトにもSvelteを導入する作業を行います。
ちなみにこのコンテナは中身を色々と拡張するので、インタラクティブモードで一旦中に入って操作します。

            $ docker-compose exec dev bash
[node@/usr/src/app]$ #...インタラクティブモードで以下作業する

        

ちなみに、wordpressフォルダ内のリソースの権限をこのコンテナ内から確認すると、

            $ ls -la wordpress/
total 244
drwxr-xr-x    5 node     node          4096 Jul  3 08:49 .
-rw-r--r--    1 node     node           261 Jun 10 03:47 .htaccess
-rw-r--r--    1 node     node           405 Feb  6  2020 index.php
#...中略
-rw-r--r--    1 node     node         32051 Apr 11 11:42 wp-signup.php
-rw-r--r--    1 node     node          4748 Apr 11 11:42 wp-trackback.php
-rw-r--r--    1 node     node          3236 Jun  8  2020 xmlrpc.php

        

となっていることも確認できます。
プロジェクトにSvelteアプリケーション用のフォルダ・
svelte-app を作成し、その中で作業します。

            $ mkdir svelte-app && cd svelte-app

        

後はもう
以前のブログの内容と同じ手順 でSvelteアプリがビルド出来るまで作業します。


合同会社タコスキングダム|蛸壺の技術ブログ


問題なくSvelteアプリが単独で立ち上がればここではOKです。


合同会社タコスキングダム|蛸壺の技術ブログJavascript(js)&Typescript(ts)プログラミング入門〜これから学ぶ人のためのおすすめ書籍&教材の手引き
超JavaScript 完全ガイド 2024

まとめ



今回の記事ではDocker/Docker-composeを活用した、WordpressウェブサイトとSvelteアプリを統合する上で欠かせない環境の準備作業をまとめてみました。
次回からはWordpressのテーマとSvelteのビルド済みリソースをどのように統合していくかを考えて行く予定です。