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

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

前のページまでに、Dockerインストール方法や、Docker上で最新版PHP環境のWordPressを構築する方法を紹介しました。
では、これから、ちょっとしたDocker Tipsや、個人的トラブルシューティング事例、およびコマンド種等を紹介したいと思います。

ファイルの所有者やパーミッションをDockerコンテナ内で確認する方法

先ほど述べたように、レンタルサーバーから移行してきたWordPressファイル群の所有者を変更できないと、プラグインが削除できないなどの問題がありました。
なので、docker-compose.ymlファイルにコマンドを書いて、ファイル所有者を変更していました。

ならば、Dockerでファイルの所有者情報を見たい場合どうすれば良いでしょうか?
これはなかなか情報が無くて、かなり苦戦しました。

PowerShell上で、dir というコマンドを打っても、所有者情報は表示されません。
なら、
Get-Acl | fl
というコマンドを打ってみましたが、これは、Windowsのファイルシステムの所有者情報しか表示してくれなかったので、的外れでした。

結局、わかったのは、DockerのWordPressコンテナに入って、Linux環境内でファイルのリストを見なければいけないということでした。

まず、以下のコマンド
docker ps -a
で、現在稼働中のコンテナ一覧を見ます。

そして、WordPressコンテナ名をコピーし、以下のコマンドを打って、WordPressコンテナ中のLinux環境に入り、bashコマンドが使える状態にします。

docker exec -it xxxxxxxx bash

xxxxxxxxがWordPressコンテナ名です。
下図のようになります。

(図40)

Dockerでbashコマンド

Dockerコンテナに入って、execでbashコマンドラインに入る

すると、Linux bash のコマンドプロンプトになります。

次に、ファイル所有者やパーミッションの一覧を表示するLinuxでおなじみの以下のコマンドを打ちます。
ls -l
すると、こうなりました。

(図41)

ls -l コマンド

docker exec bashでls -lコマンド実行結果

所有者とグループ両方とも root となっていました。
この場合ではなぜか、Docker WordPressではプラグイン削除ができませんでした。
ですから、このrootを、www-dataに変えてやれば良いわけです。

この状態で、所有者を変更するコマンド、chownを使って、

chown -R www-data:www-data /var/www/html && apache2-foreground

と打っても良いですし、先ほど紹介したように、docker-compose.ymlcommand: のところでchownコマンドを使っても良いと思います。

exit 0 コマンドでbashを脱出できます。

実は、先ほど述べましたが、WSL2上でUbuntuをインストールすれば、WSLでlsコマンドが使えるそうです。
Twitterで、「しおじゃけ」さんから情報いただきました。
近々試してみたいと思います。
しおじゃけさん、ありがとうございました。

Dockerデータを外部ドライブに置き、ディスク容量を節約する

Dockerをしばらく使っていると、OSが入っているCドライブのディスクを圧迫してきます。
1週間くらいひたすら使い続けていると、Dockerデータが2GBから3.5GBまで膨れ上がりました。
毎回、イメージを削除していても、なぜか膨れ上がります。

よって、私はDockerデータをDドライブのハードディスクに移すことにしました。
こうすると、CドライブがSSDだった場合に、ハードディスクに移行することになり、動作が重くなると思います。
特に、WordPress記事を下書き保存したり、メディアから画像を追加する場合に、少々間ができます。
これが嫌なら、移行は止めた方が良いです。

ただ、私の場合は、WordPressのテスト環境用なので、速度は求めません。
よって、ハードディスクのDドライブに移行することにしました。

では、まず、Docker Desktopで、イメージやコンテナを事前に作成しておきます。

次に、タスクトレイのDockerアイコンを右クリックして、「Quit Docker Desktop」をクリックして、Dockerを停止しておきます。

(図50)

Docker Quit

Docker Desktopを終了させる。

次に、PowerShellに以下のコマンド
wsl -l -v
と打って、起動中のWSLディストリビューションを確認します。

(図51)

wsl -l -v コマンド

wsl -l -vコマンドでWSL2ディストリビューション表示

このようにSTATEが「Stopped」になっていればOKです。

因みに、wsl --shutdown でも停止できますが、タスクトレイのDocker Desktopを停止した方が確実だと思います。

このリストのうち、docker-desktop-data の方だけ、Dドライブの好きなフォルダに移設したいと思います。
因みに、docker-desktop の方も移設することは可能ですが、Docker Desktopを再起動したり、パソコンを再起動したりすると、消えてしまうので、やっても意味無かったです。
私のやり方が間違えていたのかも知れませんが、容量は100MB少々しかなく、増加することは無かったので、docker-desktop-dataだけで良いと思いました。

では、まず、docker-desktop-dataを保存する外部フォルダを決めます。
ここでは、例として、D:\docker とした場合で説明します。

まず、念のため、cdコマンドで、d:\dockerフォルダに移動しておきます。

(図52)

dockerフォルダに移動

cdコマンドでdockerフォルダに移動

次に、現在のdocker-desktop-dataをバックアップ保存します。
tar形式でエクスポートします。
以下のコマンドです。

wsl --export docker-desktop-data D:\docker\docker-desktop-data.tar

(図53)

docker-desktop-dataをexport

wsl –export docker-desktop-dataコマンド使用

すると、エクスプローラーでd:\dockerフォルダを開くと、下図の様にdocker-desktop-data.tarファイルができていると思います。

(図54)

docker-desktop-data.tarファイル

docker-desktop-data.tarファイル

その後、以下のコマンドでWSLからdocker-desktop-dataを登録解除します。

(図55)

docker-desktop-data登録解除

wsl --unregisterコマンドで、docker-deskto-data解除

docker-desktop-data

登録解除が終わったら、以下のコマンド
wsl -l -v
で確認します。

(図56)

wsl -l -v確認

wsl -l -vコマンドで登録解除できたか確認

このように、docker-desktop-dataが消えていればOKです。

次に、バックアップ保存したdocker-desktop-dataを、新たなフォルダを指定してインポートします。
以下のコマンドです。

wsl --import docker-desktop-data D:\docker D:\docker\docker-desktop-data.tar

このコマンドの意味はこんな感じです。

wsl --import <ディストリビューション名> <新規インストール場所> <元ファイル名> [オプション]

(図57)

wsl --importコマンド実行

wsl –importコマンドで、新規場所へdocker-desktop-dataインポート。

このコマンドを実行すると、終了するまで20秒くらいかかりました。

では、wsl -l -v コマンドで確認します。
以下のように、VERSIONが2になっていればOKです。

(図58)

wslバージョン2確認

wslバージョン2確認

もし、下図の様にVERSIONが1になっていたら、Dockerがフリーズしてまともに動きません。

(図59)

wslバージョン1はダメ

wslバージョン1はダメ

この原因は、先に紹介した、以下のコマンドが実行されていなかったためです。

wsl --set-default-version 2

この場合、このコマンドを実行してから、unregisterして再登録をやり直せばOKです。

結果、d:\dockerフォルダには下図の様な ext4.vhdx というファイルができていればOKです。

(図60)

ext4.vhdxファイル

ext4.vhdxファイル

この状態で、Docker Desktopを起動すればOKです。

このファイルは、何度もDockerイメージを作成したり削除したりを繰り返すと、どんどんファイル容量が増加していきますので、十分なハードディスク空き容量が必要です。

また、先ほど述べたように、ハードディスクの場合は動作が重くなるということは頭に入れておいた方が良いです。

メモリ使用制限してくれる.wslconfigファイルについて

さきほど紹介したように、WSL2でDockerを使うと、メモリが鬼のように食われるので、それを抑える方法を探していました。

やっぱり、ちゃんとありました。

yoichiwo7さんの以下の記事を参考にさせて頂きました。

WSL2によるホストのメモリ枯渇を防ぐための暫定対処

テキストエディタで、.wslconfig というファイルを作り、以下のように入力します。

[wsl2]
memory=2GB
swap=0

2GB は、WordPressを使うなら最低限必要だと思います。
swap は、メモリが足りなくなったらディスク内の領域を使用するらしいのですが、SSDの場合は書き込み回数を増やすことになり、寿命を縮めてしまう可能性があるという情報があったので、ゼロにしておけば良いかと思います。

これを、C:\Users\User-Name のところに保存します。User-Nameは自分のパソコンのユーザー名です。

実際にやってみると、確かに2GBに抑えてくれました。
しかし、私の場合、8GBしかメモリを積んでいないので、WordPressの1サイト分ならば、ほとんど変わらないので、結局、wslconfigファイルは使いませんでした。

NGINXサーバー構築は今後の課題

今、多くのレンタルサーバーではApacheではなく、NGINXだと思います。
そこで、docker-compse.ymlファイルでNGINX対応の記述をしてみましたが、まだうまく動作するに至っていません。
うまくいったら、このブログで紹介したいと思います。
今後の課題とします。

個人的トラブルシューティング

Dockerを初めて使ってみて、個人的に遭遇したトラブルシューティングを紹介します。
あくまで備忘録です。

wslのコマンドラインで、’>>’ という表示になった場合

コマンドラインのコピー&ペーストで、改行コードまでPowerShellに貼り付けてしまうと、下図の様に’>>’という表示のままになってしまいます。

(図80)

>>という状態

>>という状態はEnterで脱出

この場合、このまま普通にEnterキーを押せば脱出できました。

Dockerがフリーズしたら、Troubleshootを使う

Dockerでイメージやコンテナをマウントと削除を繰り返していると、何かを誤って、下図の様にDocker Engine starting という画面でフリーズしてしまうことがあります。

(図81)

Docker起動中画面

Docker起動中画面

その場合は、WindowsのタスクトレイのDockerアイコンを右クリックして、「Troubleshoot」をクリックします。

(図82)

Troubleshootクリック

タスクトレイDockerアイコン右クリックで、Troubleshootクリック

そうすると、下図の様な画面になるので、「Clean / Purge data」をクリックします。

(図83)

Clean / Purge dataクリック

Clean / Purge dataクリック

すると、下図の様な画面が出るので、とりあえず全てにチェックを入れて、「Delete」をクリックします。
これをクリックしても、docker-compose.ymlは消えないので、特に問題無いと思います。

(図84)

全てチェック入れる

全てチェック入れて削除しても多分OK

すると、下図の様な警告が出ました。
この原因は不明なので、とりあえず「続行」をクリックします。

(図85)

警告表示

この警告は不明なのでとりあえず続行クリック

すると下図の画面になるので、閉じます。

(図86)

この画面が出たら閉じる

この画面が出たら閉じる

すると、再起動を要求する画面が出るので、Docker Desktopを再起動します。

(図87)

Docker 再起動促す画面

Docker 再起動させる

その後は、
wsl -l -v
というコマンドを打って、WSLバージョンが2で変わっていないことを確認してください。
もし、変わっていたら、先に紹介したように、
wsl --set-default-version 2
を実行して、最初からセットアップした方が良いかと思います。

localhost:8000 が localhostにリダイレクトされてアクセスできなくなった。

これは、ブラウザをスパーリロード、つまり、ブラウザのキャッシュを削除してブラウザを再起動すれば治りました。

ブラウザからWordPress管理画面にアクセスすると、「このサイトで重大なエラーが発生しました。」というメッセージが出てアクセスできない

PHP8 でWordPressインストールした場合、ブラウザで以下のエラーが出ました。(2021/07/13時点)

このサイトで重大なエラーが発生しました。対応手順については、サイト管理者のメール受信ボックスを確認してください。

(図90)

ブラウザのメッセージ

ブラウザで重大なエラーが出ましたというメッセージ

これでは、何が原因だったのかまったくわからないので、WordPressデータ内の wp-config.php ファイルをテキストエディタで開き、以下のデバッグモードをtrueにして、エラー表示させます。

define('WP_DEBUG', true);

そして、WordPress管理画面をブラウザで開くと、私の場合は以下のメッセージが出ました。

Parse error: syntax error, unexpected token “::”, expecting “(” in /var/www/html/wp/wp-content/plugins/search-regex/models/search.php on line 322 Notice: is_embed が誤って呼び出されました。条件付きクエリータグは、クエリーが実行される前には機能しません。それ以前では、常に false を返します。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 3.1.0 で追加されました) in /var/www/html/wp/wp-includes/functions.php on line 5313

これは、実はDocker Desktopのログにも出ていたのです。
どうやら、PHP8.0以上の場合、WordPressプラグインのSearch RegExが問題のようなので、WordPressデータ中のpluginフォルダ内のsearch-regexフォルダを削除します。
すると、管理画面に入れました。

コマンド集

今回使ったコマンドを集めてみました。

Docker コマンド集

PowerShell上で使うDockerコマンドです。

docker images

作成したイメージ一覧表示

docker ps -a

稼働中コンテナ一覧表示

docker rm

コンテナ削除

docker rmi

イメージ削除

docker exec -it xxxxxxxx bash

これは、コンテナ名xxxxxxxxに入って、Linuxのbashコマンドを打つためのコマンドです。

docker execについての詳細はこちらのページを参照してください。

オプションの -it は、-i-t のオプションを合わせたものです。
-i はSTDIN(標準入力)をオープンにし続けて、-t はpseudo-TTYを割り当てるということです。
意味不明ですが、このオプションを付けると、bashコマンド入力を待ち受ける状態になるということです。
こんな感じです。

(図40)

Dockerでbashコマンド

Dockerコンテナに入って、execでbashコマンドラインに入る

すると、ls -l などのLinuxコマンドでファイル所有者やパーミッションなどをみることができます。

exit 0で脱出することができます。

docker-compose コマンド集

PowerShell上で使う、docker-compose コマンドです。

docker-compose --version

docker-compose のバージョンを表示する。
このコマンドを打つと、5秒くらいタイムラグがあって表示される。

docker-compose up -d

docker-compose.ymlファイルで作成した、イメージやコンテナを生成する。
-d オプションは、バックグラウンドで実行するという意味

docker-compose down -v

docker-compose up コマンドでマウントしたコンテナを削除する。
-v オプションは、Docker内で生成したvolumesデータも削除する。

docker-compose down --rmi all -v

docker-compose downだけではコンテナのみでイメージは削除してくれませんが、--rmi all -vというオプションを入れると、イメージまで全て削除してくれる。

Linux bash コマンド集

私は、Dockerコンテナ内に入って、bashコマンドとして使いました。
ただ、WSL2でUbuntuをインストールすれば、WSL2上で以下のコマンドを使えるらしいです。

ls -l

lsコマンドは、Linuxの世界ではお馴染みのコマンドです。
-l や -a オプションを使えば、ファイルやフォルダの所有者やパーミッション情報をみることができます。

chown -R

そのディレクトリの配下ディレクトリ内全てのファイルの所有者とグループ名を変更する。

以下のコマンド
chown -R www-data:www-data /var/www/html && apache2-foreground

var/www/html内のファイル全ての所有者とグループをwww-dataに変更し、apahe2をフォアグラウンドで実行するという意味。

WSL2コマンド集

PowerShell上で使うWSL2コマンドです。

wsl -l -v

現在稼働しているWSL2のディストリビューションを詳細表示する。

wsl --set-default-version 2

WSL ディストリビューションの既定バージョンを2にします。
最新のDockerを使う場合は2021/7月時点で全てWSL2なので、必ずこのコマンドを実行してからDockerをインストールすると良いと思います。

wsl --shutdown

稼働しているすべてのWSL2ディストリビューションを停止する。
でも、これはほとんど使わずに、Docker をQuitすれば良い。

PowerShell コマンド集

PowerShellのコマンドです。

cd

ディレクトリ移動。
cd d:\docker

cd..
とすると、一つ上位のディレクトリに移動。

cls

PowerShell の画面を一括クリアする

Get-Acl | fl

Windowsファイルシステムのファイル所有者情報表示できます。
Linuxのbashのlsコマンドとは異なるので要注意です。

tree (オプション無し)

ディレクトリ構成のみ表示

PS D:\docker\test_wp> tree

フォルダ パスの一覧:  ボリューム Data
ボリューム シリアル番号は C8A8-46FD です
D:.
├─html
│  └─wp
├─mysql
├─php
└─phpmyadmin

tree /f

ファイルも表示

PS D:\docker\test_wp> tree /f
フォルダー パスの一覧:  ボリューム Data
ボリューム シリアル番号は C8A8-46FD です
D:.
│  docker-compose.yml
│
├─html
│  │  default_page.png
│  │  index.php
│  │  phpinfo.php
│  │
│  └─wp
├─mysql
├─php
└─phpmyadmin

まとめ

以上、Dockerを初めて使ってみた感想と、Dockerによる最新PHPバージョンによるローカルPCのWordPress環境構築の個人的備忘録でした。
今回の備忘録は、今まで以上に骨が折れました。
しかし、これで、Docker難民脱出です!

とにかく、PHPのバージョンを変えてサクッとWordPressサイトをテストできるのが最高ですね。
ただ、サクッと変えられる反面、メモリ8GBでは動作が重いです。
せめて16GBは欲しいですね。
でも、個人PCでDockerを試せるなら、私的にはそれで十分です。

そして、多少なりともLinux環境を勉強できたのや良い切っ掛けでした。
これで、Raspberry Piへの移行もし易くなったというものです。

これでローカルのサーバー環境で、Linuxを使っていろいろテストできそうです。
個人Web開発の道が少し開けたような気がします。

というわけで、今回はここまでです。
ではまた…。

コメント

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