初めてDockerを使ってみて、最新バージョンPHPでWordPressローカル環境を構築してみた

Docker使って最新PHPでWordPress構築 ブログメンテナンス

前ページで基本的なDockerインストール方法を紹介したので、ここからは最大の目的、Docker上でWordPressを構築して、しかも、最新版PHP8.0(2021/07/18時点) 環境にしてみたいと思います。

DockerでWordPress 環境構築(PHP8)

では、今回の最大の目的、Docker上でローカルのWordPress環境構築してみたいと思います。
ここでは、既にレンタルサーバーにWordPressサイトが存在している場合のテスト環境構築のためとして話を進めていきます。
あくまで、個人の備忘録です。

XAMPPの場合は、いろいろセットアップが大変でしたが、Dockerははるかに楽です。
ただ、あまりにいろいろなことができてしまうので、カチッと自分に合った環境を構築するのは結構大変でした。

パソコンのフォルダを構成しておく

まず、自分の好きなところにWordPressデータ用のフォルダを作って置きます。
ここでは、例として、Dドライブにdockerというフォルダを作り、そこにtest_wpというフォルダを作っていく方式で進めていきます。

そこに、以下のように新たにフォルダを作って置きます。
フォルダ構成はこんな感じ。

D:\docker
├─test_wp
├─html
│  └─wp
├─mysql
├─php
└─phpmyadmin

これは、Xserverの場合は、htmlフォルダがpublic_htmlフォルダに相当します。
wpフォルダは個人の設定によりあっても無くてもよいかと思います。
ロリポップなどのサーバーならば、public_htmlフォルダが無かったと思いますので、htmlフォルダをそのまま使えば良いと思います。

レンタルサーバーからFTPソフトでダウンロードしたWordPressファイル群を移す

事前に、レンタルサーバーからWordPress関連ファイル群をFTPソフトでバックアップしておきます。
Xserverならば、public_html内のすべてのファイルやフォルダ。ロリポップサーバーならば、ルートのファイル群全てをhtmlフォルダまたはwpフォルダにコピーしておきます。

docker-compose ファイルの作成

さて、WordPress環境構築には、docker-composeというものを使います。
これはとても便利で、docker-compose.yml というYAML(ヤメルまたはヤムル)形式ファイルに、テキスト形式でインストール仕様を記述しておけば、あとはコマンド一発で、Apache、PHP、MySQL、WordPress、phpMyAdminを一括してイメージとコンテナをインストールしてくれます。
PHPのバージョンやWordPressバージョンなども簡単に変えられます。

初めて使ってみて、これはなるほど便利だなと思いました。
先ほど、Hello Worldで使ったdocker runコマンドを使うよりも、複数のアプリを一括して書き込めるので、とても楽です。
しかも、YAML形式ファイルは、コメントを書き込めるのが素晴らしいですね。

YAML形式とは

では、YAML形式のdocker-compose.yml ファイルをテキストエディタで作っていきます。
UTF-8形式で保存すれば良いです。

YAML(ヤムル、ヤメル)形式はあまり深く考えなくて良いです。
詳しいことは知らなくてOK。
一種の書式、決まり事と覚えておけば良いです。

YAMLとは、ネットで調べれば豊富に情報ありますが、簡単に言うとXMLやJSONのようなデータ形式の一種で、以下の感じで入力していきます。

【シーケンス形式(配列形式)】

- aaa
- bbb
- ccc

【マップ型(ハッシュ形式)】

test1:aaa
test2:bbb
test3:ccc

シーケンス型とマップ型はどちらでも好きな方を使って良いみたいです。
インデント(字下げ)が重要で、TABは不可で、スペースのみでインデントします。
そして、JSON形式と違って、以下のようにコメントを入れることができます。

app1:
# アプリ1番目
  - aaa
  - bbb

app2:
  test1:ccc # アプリ2番目のtest2設定
  test2:ddd

このYAML形式を使って、テキストエディタでdocker-composeファイルを入力していきます。

docker-compose.ymlファイルの作成

今回、私が使ったものは、こんな感じです。
PHP8.0 で、2021/07/18時点では最新版だと思われます。
これは、先ほど作ったtest_wpフォルダに保存しておきます。

version: "3.8"

services:
  mysql-1:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    restart: always # Docker起動時にコンテナも自動起動
    ports:
      - "3306:3306" # PC側ポート:DockerのLinux側ポート
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: wp # データベース名
      MYSQL_USER: user_name # phpMyAdminのユーザー名になる
      MYSQL_PASSWORD: user_password # phpMyAdminのユーザーパスワードになる
      TZ: Asia/Tokyo #ログ用のタイムゾーン

  wordpress-1:
    image: wordpress:php8.0-apache
    volumes:
      - ./html:/var/www/html
      # WordPressにアップロードする上限サイズを設定するファイル
      - ./php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /var/www/html/wp # これがポイント
    restart: always # Docker起動時にコンテナも自動起動
    depends_on:
      - mysql-1
    ports:
      - "8000:80" # PC側ポート:DockerのLinux側ポート
    environment:
      WORDPRESS_DB_HOST: mysql-1:3306
      WORDPRESS_DB_USER: user_name
      WORDPRESS_DB_PASSWORD: user_password
      WORDPRESS_DB_NAME: wp # データベース名
      TZ: Asia/Tokyo #ログ用のタイムゾーン
    # 本番環境から移行した場合、プラグインが削除できない場合の対処
    #command: bash -c "/bin/chown -R www-data:www-data /var/www/html && apache2-foreground"

  phpmyadmin-1:
    depends_on:
      - mysql-1 # MySQLが起動終わってから起動
    image: phpmyadmin/phpmyadmin
    environment:
      # PMA_ARBITRARY=1を指定してあげると、サーバーをローカル以外も指定ができるようになる。
      #- PMA_ARBITRARY=1
      - PMA_HOSTS=mysql-1
      # ユーザー名とパスワードを指定すると、入力しなくて済むようになる。
      #- PMA_USER=user_name
      #- PMA_PASSWORD=user_password
      - TZ=Asia/Tokyo #ログ用のタイムゾーン
    restart: always # Docker起動時にコンテナも自動起動
    ports:
      - "8080:80" # PC側ポート:DockerのLinux側ポート
    volumes:
      # phpMyAdminにインポートする上限サイズを決める設定ファイル
      - ./phpmyadmin/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini

# 名前付きボリューム。トップレベルボリュームは使わない
#volumes:
#   db_data: {}
#   wordpress_data: {}
version:

version表記についてはDocker公式の以下ページに書かれています。
https://docs.docker.com/compose/compose-file/

これによると、2021/7/12時点で、Docker Engine Releaseが19.03.0以上の場合、バージョンを3.8にするとなっています。
docker --version コマンドで見てみると、20.10.7 となっていたので、docker-compose.yml ファイルのバージョンは3.8で良いのではないかと思います。

services:

サービス名にはここでは以下の3つにしています。
これは自分の好きな名前にすることができます。

myspl-1
wordpress-1
phpmyadmin-1

この名前は何なのかということですが、PowerShellで、docker ps -aコマンドで動作中コンテナを見ると、コンテナ名が、

test_wp_mysql-1_1
test_wp_wordpress-1_1
test_wp_mysql-1_1

となっています。
Docker Desktop のダッシュボードを見ると、test_wpというプロジェクト名があります。
そこをクリックしてみると、同じコンテナ名があります。

つまり、docker-compose.ymlファイルはtest_wpフォルダに保存してあることを考慮すると、
(フォルダ名)+(サービス名)+(アンダーバー入り連番)
ということです。
アンダーバー入り連番は、自動で割り当てられるそうです。
ですから、私の場合、サービス名の末尾に’-1’と入れてしまいましたが、これは入れない方が良いですね。

ところで、個人的に思ったのは、serviceという名称は、初めてDockerを使う人にとっては混乱するので、ここはコンテナ名とかにしてほしいですね。
そもそも、コンテナという名称自体が意味不明で混乱しますが…。

image:

ここでDocker Hubからダウンロードするイメージを決めます。
image名は、Docker Hub で検索して探し出したアプリのTag名を記述します。
WordPress イメージについては、以下のDocker Hubサイトにあります。

https://hub.docker.com/_/wordpress/?tab=tags&page=1&ordering=last_updated

Docker Hub の機能をガッツリ使うには、サインイン登録した方が良いようです。

そこで、使いたいタグ名を探し出し、image名に記載します。
イメージ名:タグ名
という感じです。

例として、WordPress最新版ならば、
wordpess:latest
で良いと思います。
2021/07/13 時点で、WordPressバージョンは5.7.2 です。
これで、ApacheとPHPもインストールされます。

これを、旧バージョンWordPress 4.6.1 で、PHPのバージョン5.6にしたい場合、コロン(:)の後のタグ名を変えます。
タグ名は、4.6.1-php5.6-apache でしたので、
wordpress:4.6.1-php5.6-apache
となります。

また、WordPressは最新版で、PHP8.0にしたい場合は、以下の感じです。
wordpress:php8.0-apache

volumes:

これは、docker-composeコマンドのdownや、dockerコマンドのrmおよびrmiコマンドを使っても、データが消えず、ハードディスク内に保存できる設定をする項目です。
逆に、docker-compse down –volumes コマンドでデータを消去したい場合は、volumes項目を記載しなければよいです。

また、レンタルサーバーの本番環境と同じデータで復元したい場合は、このvolumes項目を使って、ハードディスクに保存してあるフォルダを指定すれば良いです。
例えば、ハードディスクのD:\docker\test_wp\htmlに元のWordPressデータがある場合、

volumes:
  - ./html:/var/www/html

とすれば良いです。
(自分のパソコンのディレクトリ名):(DockerのLinuxのWordPressフォルダ)

自分のパソコンのディレクトリパス名については、PowerShellでdocker-composeコマンドを叩く時に、すでにD:\docker\test_wp にcdコマンドで移動しているので、そこからの相対パスで良いわけです。

DockerのLinuxのWordPressフォルダは、/var/www/html として、予め決まっていますので変更できません。

また、htmlフォルダ配下にwpフォルダ等を作って階層化している場合は、working_dir:項目を使います。これは次で説明します。

php.iniphpmyadmin-misc.iniファイルについては後で詳しく説明していますが、これはアップロードやインポートのファイルサイズの上限を変更するためのものです。

working_dir:

これは、WordPress関連ファイルをルートの配下にwpフォルダを作成して階層化している場合に使います。
例えば、Xserver 等で、public_html/wp/という階層になっている時です。

/var/www/html/wp
としておけば、Docker Linux上のWordPressもwpフォルダから表示するようになります。

restart:

alwaysとすれば、Dockerを起動する度にコンテナも再起動するものと思われます。

depends_on:

コンテナ(サービス)の起動順序を決めます。
ここで、mysql-1となっていると、mysql-1を起動した後に当サービスが起動します。

ports:

各コンテナ(サービス)のポート番号を決めます。
これは、コロンを挟んで以下のようになります。

(パソコンのポート番号):(Docker Linuxのポート番号)

ここでは、ネット上の多くの情報に習って、パソコンのポート番号を決めています。

MySQL: ポート番号3306
WordPress:  ポート番号8000
phpMyAdmin:  ポート番号8080

右側のDocker Linux側のポート番号は変えないようにします。

environment:

見てお分かりの通り、MySQLのデータベース名やパスワード等を明記しています。
レンタルサーバーからのデータを使う場合は、ユーザー名やパスワードをレンタルサーバー側と同じにしておきます。

また、タイムゾーン指定は、デフォルトではUSとなっていて、Dockerダッシュボードのログ確認に支障がでるため、日本時間に変更しておきます。

command:

この部分でLinuxコマンドを実行して、レンタルサーバーから移行してきたWordPressファイル群の所有者を変更します。
そうすると、WordPressプラグインを削除することができるようになります。

なぜ、そうするかというと、レンタルサーバーから移行してきたデータでDockerを使ってWordPress管理画面を開くと、プラグインを削除できないという事態になりました。
これは、WordPressファイルの所有権が問題でした。
それについては、makutamotoさんの以下の記事を参照させていただきました。

Docker上のWordpressでVolumeマウント時にプラグインのインストールや削除に失敗する場合の対処法

このbashコマンドについて私はよく知りませんが、何となく得た知識で述べます。

bash -c は、Linuxのコマンドを実行させるという意味だそうです。

chownはファイルの所有権を変更するLinuxコマンドです。

chown (所有者):グループ名 ファイル名

オプション -R は、指定したディレクトリとその配下のディレクトリおよびファイルの全ての所有者を変更します。(再帰的変更というらしい)
所有権はDocker Linux側のrootユーザーになっているので、www-dataに移行します。
私の様なLinux初心者にはwww-dataという所有者が何なのか分からないので、後で所有者やパーミッションの表示方法の項目で説明します。

apache2-foreground はApacheをフォアグランドで起動するという意味らしいですが、よくわかりません。

wp-config.php ファイルの編集

WordPressのwp-config.phpファイルを書き換えます。
以下の所を、docker-compose.ymlファイルに入力したものと同じように書き換えます。
基本的に、レンタルサーバーから移行してきたものは、docker-compose.ymlファイルの方のユーザー名やパスワードをwp-config.phpと同じにした方が良いです。

/** WordPress のためのデータベース名 */
define('DB_NAME', 'wp');/** MySQL データベースのユーザー名 */
define('DB_USER', 'user_name');/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'user_password');/** MySQL のホスト名 */
define('DB_HOST', 'mysql-1');

なお、後で詳しく述べますが、デバッグモードにしておいた方がエラー確認し易いです。
以下の所をtrueに変更しておきます。

define('WP_DEBUG', true);

レンタルサーバーから移行してきた場合、wp-config.phpのプレフィックスについては、特に変更する必要はありません。
後でMySQLをphpMyAdminでインポートすれば、MySQL側のプレフィックスもすべて引き継がれます。

php.iniファイルを作成し、WordPressのアップロードファイルサイズの上限を変更しておく

WordPressのデフォルトのアップロードサイズ上限は2MBになっていて、これではテーマのバックアップファイルすら復元できませんし、画像ファイルを一括してアップロードもできません。
また、Cocoonテーマの場合、外部ファイルからインストールする必要があり、それが13MB以上あってインストールできません。

よって、Docker上でもphp.iniファイルを変更して、アップロードサイズを変更しておきます。
ただ、Dockerの場合は、php.iniファイルを予め新規にテキストエディタで作成し、以下の入力をして、先ほど作成したphpフォルダに保存しておきます。
UTF-8形式です。

memory_limit = 128M
post_max_size = 100M
upload_max_filesize = 90M

ファイルの大きさの順序は、
memory_limit >= post_max_size >= upload_max_filesize
となっていればOK。

D:\docker\test_wp\php フォルダにphp.iniとして保存しておきます。

phpmyadmin-misc.ini ファイルを作成し、phpMyAdminのインポートサイズ上限を変更しておく

バックアップしておいたMySQLファイルは、phpMyAdminでインポートしますが、phpMyAdminのデフォルトのインポートファイルサイズの上限は約2MB(= 2,048KiB)しかありません。
gz形式で圧縮しても、とても足りないので、phpmyadmin-misc.ini ファイルを新たにテキストエディタで作成し、上限を変更します。
UTF-8形式で保存します。

allow_url_fopen = Off
max_execution_time = 180
memory_limit = 128M
post_max_size = 128M
upload_max_filesize = 128M

allow_url_fopen はURLを使ってファイルを読み込む設定ですが、本番環境でこれをONにしてしまうと、外部からURLでファイルを開けてしまい、とんでもないセキュリティーホールになるので、気を付けたいです。

max_execution_time は、PHP実行してからタイムアウトするまでの時間(秒単位)です。
私のパソコンのメモリ8GBでは動作が重いので、多めに設定しておきます。

その他は、php.ini設定と同様で、希望の上限サイズに設定しておきます。

これを、phpmyadmin-misc.ini というファイルで保存しておき、
d:\docker\test_wp\phpmyadmin フォルダにコピーしておきます。

docker-compose up -d コマンドで、イメージとコンテナを一括インストール実行

では、Docker を起動し、タスクトレイのDockerアイコンを右クリックしてダッシュボードを開いて、完全に起動するまで待ちます。
下図の状態ではまだ何もできません。

(図81)

Docker起動中画面

Docker起動中画面

下図の様に切り替わればOKです。1分くらいかかりました。

(図33)

Docker起動完了画面

Docker起動完了画面

また、この間、パソコンのメモリは2GB前後喰われるので、タスクマネージャのパフォーマンスを注視しておきます。

落ち着いたら、PowerShellを起動し、cdコマンドでtest_wpディレクトリに移動しておきます。

cd d:\docker\test_wp

そして、以下のコマンドを打つと、イメージとコンテナの一括インストールが始まります。

docker-compose up -d

-dオプションは、バックグラウンドで起動するという意味だそうです。
以下の感じになります。
Docker Hubからダウンロードしている感じが見て取れます。

(図34)

docker-compose up中

docker-compose up中のコマンドライン

(図35)

docker-compose up完了

docker-compose up完了した時のコマンドライン

これで完了です。
3分くらいかかりました。

では、以下のコマンドでイメージを確認してみます。
docker images

(図36)

imegeコマンド確認

docker-compose up完了したら、imagesで確認

ちゃんと、WordPressのPHP8.0バージョンがインストールされているようです。
実は、WordPressのPHPバージョンの確認については、ちょっと問題ありなのです。それについては後で述べています。

MySQLもphpMyAdminもインストールされているようです。

では、以下のコマンドを打って、コンテナを確認してみます。
docker ps -a

(図37)

psコマンドでコンテナ確認

docker-compose upした後のpsコマンドでコンテナ確認

行を折り返しているのでちょっと見にくいですが、それぞれのポート番号でコンテナが起動しているようです。

まず、MySQLデータベースインポート

WordPress、MySQL、phpMyAdminまでイメージとコンテナがマウントできたら、まずは、phpMyAdminを使って、レンタルサーバーから移行してきたデータベースをMySQLにインポートします。

ブラウザを起動し、URL入力欄に
http://localhost:8080
と入力し、phpMyAdminを起動します。

ユーザー名は管理者権限のrootでログインします。
パスワードは、docker-compse.ymlファイルに記載したroot_passwordです。

すると、下図の様に表示されると思いますので、左側のデータベース名wpを選択してから、インポートをクリックします。

(図38)

phpMyAdmin起動

ブラウザからphpMyAdmin起動

ところで、上部に「サーバ:mysql-1」とあるのが分かると思います。
これは、docker-compose.ymlで、PMA_HOSTSで設定した名前だということが分かると思います。

インポートをクリックすると、下図の様に表示されます。

(図39)

phpMyAdminでインポート

phpMyAdminでMySQLインポート

この様に、まず、右側のアップロード上限サイズが128MBになっていることを確認します。
これは、先ほど説明したように、phpmyadmin-misc.iniファイルで設定した値です。

そして、予めレンタルサーバからバックアップしておいたMySQLファイルを選択します。gz形式でOKです。
あとは、部分インポートのチェックを外して、実行をクリックすれば、MySQLにインポートできると思います。

この時、今一度、レンタルサーバのデータベース名と、Dockerで起動したphpMyAdminのデータベース名が一致していることを確認してください。
異なっていると、WordPressが開けません。

MySQLデータベース内のURLを変更

インポートしたデータベース上のURLをlocalhostに書き換えます。
これを書き換えないと、ローカル環境のWordPress管理画面にログインできません。

例えば、このブログの場合、URLは
https://www.mgo-tec.com/
ですが、これを
http://localhost:8000
に変更します。
wpフォルダを伴う場合、
https://www.mgo-tec.com/wphttp://localhost:8000/wp
とします。

まず、phpMyAdminで検索をかけて、対象のURLを検出します。
そして、テーブル名が判明したら、SQLタブで以下のコマンドを実行します。
ここでは、例として、以下の変更をしました。

UPDATE `wp_comments` SET comment_author_url=REPLACE (comment_author_url,'https://www.mgo-tec.com','http://localhost:8000');
UPDATE `wp_options` SET option_value=REPLACE (option_value,'https://www.mgo-tec.com','http://localhost:8000');
UPDATE `wp_users` SET user_url=REPLACE (user_url,'https://www.mgo-tec.com','http://localhost:8000');

WordPressセキュリティ系プラグインはフォルダごと削除しておく

WordPress管理画面にログインするためには、セキュリティ系プラグインが入っているとログインできません。
よって、ローカルのWordPressプラグインのフォルダを削除します。
wp-content/plugins フォルダ中の対象のプラグインフォルダを削除します。

WordPress 管理画面にログイン

ここで、ようやくWordPress管理画面にログインします。
ユーザー名やパスワードは、本番環境でログインしているものでOKです。

ログインしたらやることは以下です。

検索エンジンにインデックスされないようにする

WordPress管理画面 → 設定 → 表示設定 で、「検索エンジンがサイトをインデックスしないようにする」にチェックを入れます。

WordPressテーマの設定ファイルを復元する

ここで、WordPressテーマの設定ファイルがある場合は、復元しておきます。

広告タグを削除

Googleアドセンス広告タグ等がある場合は、削除しておいた方が良いです。

PHPバージョン表示して確認(phpMyAdminでは確認できない!)

さて、みなさん、WordPressサイトのPHPバージョン確認はどうやっていますか?

私は今まで、ずっとだまされていました。
phpMyAdminにログインして、右側にの「ウェブサーバー」欄に表示されたPHPバージョンは、正しい物だと思い込んでいました。

(図45)

phpMyAdminのPHPバージョンは嘘

phpMyAdminのPHPバージョンは嘘

でも、実はこれはデタラメだったのです。
ずーっとだまされていました。
PHPバージョンをいくら変えても、そこに表示されているバージョンは変化しなくて、多大な無駄な時間を費やしてしまいました。

実は、正確なバージョン情報を知るための一番確実な方法は、WordPressサイトの任意の場所に以下の様なPHPファイルを作成します。

<?php
phpinfo();
?>

そして、これをphpinfo.phpファイルとしてhtmlフォルダに保存しておきます。

そうしたら、ブラウザのURL欄に
http://localhost:8000/phpinfo.php
と入力して、そのファイルにアクセスすると、こんな感じで表示されるんです。

(図46)

PHPの正しいバージョン表示

PHPの正しいバージョン表示

これが、正しいPHPバージョンです。

まじか!!!

今までの時間を返せ! phpMyAdmin!

でも、これでようやくDocker上でPHPバージョンを変えて確実にWordPressサイトをテストすることができるようになりました。

では、次のページでは、ファイル所有者やパーミッション情報の表示方法や、その他Docker Tips、トラブルシューティング、コマンド集を紹介していきます。

コメント

タイトルとURLをコピーしました