古いWordPressサイトのアップデート作業をすることになり、ローカルに本番と近い環境を構築する必要がありました。

今回の本番環境はこちらです。

  • WordPress 5.6.40
  • PHP 5.6.40

いきなり本番環境でPHPやWordPressをアップデートするのは怖いので、まずはローカル環境にサイトを複製して検証してからアップデートすることにしました。

普段はMAMP PROを使っているので、最初はMAMPでPHP 5.6環境を作ろうとしたのですが、ここで問題が発生。

現在使用しているMAMP PRO 7.4では、追加できるPHPのバージョンがPHP 7.1以降となっており、PHP 5.6を選択できませんでした。

そこで今回は、勉強も兼ねてDockerを使ってPHP 5.6のWordPress環境を構築してみます。

今回使用したMac

今回使用した環境はこちらです。

  • Intel MacBook Air
  • macOS 15.7.7
  • MAMP PRO 7.4
  • Docker Desktop
  • Docker 29.7.2
  • Docker Compose v5.4.0

Apple Silicon MacではなくIntel Macでの作業になります。

Intel MacがDockerに対応しているか確認する

まず、MacがDockerを動かせる環境なのか確認しました。

ターミナルを開いて、以下を実行します。

sysctl kern.hv_support

今回の環境では、

kern.hv_support: 1

と表示されました。

1になっていれば、Macの仮想化機能が利用できます。

続いてmacOSのバージョンも確認しました。

sw_vers -productVersion

結果はこちら。

15.7.7

問題なさそうなのでDocker Desktopをインストールします。

Docker Desktopをインストールする

Docker公式サイトからDocker Desktop for Macをダウンロードします。

今回はIntel Macなので、Intel Chip用を選択しました。

ダウンロードしたDocker.dmgを開き、Docker.appをApplicationsフォルダへ移動します。

その後Docker.appを起動。

Docker Desktop上で「Engine running」と表示されれば、Docker Engine自体は起動しています。

dockerコマンドが見つからない

Docker Engineは起動したのですが、ターミナルで確認してみると、

docker --version

以下のエラーが発生しました。

zsh: command not found: docker

Docker Desktopは起動しているのに、ターミナルからdockerコマンドを利用できません。

Docker CLI本体を確認します。

ls -l /Applications/Docker.app/Contents/Resources/bin/docker

ファイルが存在していたため、/usr/local/bin/から利用できるようにシンボリックリンクを作成しました。

sudo ln -s /Applications/Docker.app/Contents/Resources/bin/docker /usr/local/bin/docker

Docker Composeについても同様に設定します。

sudo ln -s /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose /usr/local/bin/docker-compose

設定後、

hash -r

を実行して再確認。

docker --version
docker compose version

無事に、

Docker version 29.7.2
Docker Compose version v5.4.0

と表示されました。

docker-credential-desktopのエラーが発生

Dockerが使えるようになったので、定番のhello-worldを実行します。

docker run hello-world

しかし、今度はこちらのエラー。

docker: error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH

Docker本体だけでなく、認証情報を扱うdocker-credential-desktopにもPATHを通す必要がありました。

まずファイルを確認。

ls -l /Applications/Docker.app/Contents/Resources/bin/docker-credential-desktop

存在していたので、こちらもシンボリックリンクを作成しました。

sudo ln -s /Applications/Docker.app/Contents/Resources/bin/docker-credential-desktop /usr/local/bin/docker-credential-desktop

再度、

hash -r
docker run hello-world

を実行。

今度は、

Hello from Docker!

This message shows that your installation appears to be working correctly.

と表示されました。

これでDockerのインストールは完了です。

WordPress用のDocker環境を作る

ここから今回の本題です。

Docker上に、

  • WordPress
  • PHP 5.6
  • Apache
  • MySQL 5.7

という環境を構築します。

まず作業用ディレクトリを作成します。

mkdir -p ~/Sites/legacy-wordpress
cd ~/Sites/legacy-wordpress

今回は、

legacy-wordpress

という名前にしました。

普段VS Codeを使っている場合は、

code .

でこのディレクトリをVS Codeから開けます。

compose.yamlを作成する

legacy-wordpressディレクトリ内に、

compose.yaml

を作成します。

内容はこちらです。

services:
  db:
    image: mysql:5.7
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:5-php5.6-apache
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

YAMLはインデントに意味があるので、全角スペースなどが入らないよう注意が必要です。

存在しないWordPressイメージを指定してしまった

最初はWordPress 5.6を指定したかったので、

wordpress:5.6-php5.6-apache

というイメージ名を指定していました。

しかし、

docker compose up -d

を実行すると、

failed to resolve reference "docker.io/library/wordpress:5.6-php5.6-apache"
not found

というエラー。

このタグは存在しませんでした。

そこで、

wordpress:5-php5.6-apache

へ変更しています。

古いDockerイメージを使用するときは、「このバージョンならこんなタグだろう」と推測せず、実際に存在するタグを確認した方がよさそうです。

YAMLの書き方でもエラー

途中でcompose.yamlを編集していたところ、

mapping key "volumes" already defined

というエラーも発生しました。

これは同じ階層に、

volumes:

を重複して記述していたことが原因でした。

さらに、

mapping values are not allowed in this context

というエラーも発生。

こちらはYAMLのインデントが崩れていたことが原因です。

YAMLはインデントにかなり厳しいので、ターミナル上のnanoなどで編集するより、VS Codeなどのエディターを使った方が個人的には扱いやすかったです。

設定ファイルが正しく書けているかは、

docker compose config

で確認できます。

DockerでWordPressを起動する

compose.yamlが完成したら、以下を実行します。

docker compose up -d

初回はWordPressやMySQLのDockerイメージがダウンロードされるので、少し時間がかかります。

今回の環境では最終的に、

Image wordpress:5-php5.6-apache Pulled
Image mysql:5.7 Pulled
Network legacy-wordpress_default Created
Volume legacy-wordpress_db_data Created
Volume legacy-wordpress_wp_data Created
Container legacy-wordpress-db-1 Started
Container legacy-wordpress-wordpress-1 Started

となり、無事起動しました。

コンテナの状態を確認する

以下のコマンドで起動状態を確認できます。

docker compose ps

今回の環境では、

legacy-wordpress-db-1          mysql:5.7
legacy-wordpress-wordpress-1   wordpress:5-php5.6-apache

の2つが起動しました。

WordPress側は、

0.0.0.0:8080->80/tcp

となっています。

そのためブラウザから、

http://localhost:8080

へアクセスします。

無事WordPressの初期設定画面が表示されました。

これでMAMPとは完全に独立したWordPress環境をDocker上に構築できました。

PHPのバージョンを確認する

最後に、本当にPHP 5.6で動いているのか確認します。

docker compose exec wordpress php -v

結果はこちら。

PHP 5.6.39 (cli) (built: Dec 29 2018 07:54:03)

Zend Engine v2.6.0
with Zend OPcache v7.0.6-dev

PHP 5.6で動いています。

ただし、今回再現したかった本番環境は、

PHP 5.6.40

です。

今回使用したwordpress:5-php5.6-apacheでは、

PHP 5.6.39

となりました。

完全一致ではありません。

同じPHP 5.6系の最終盤なので、古いWordPressやプラグインの互換性を検証する環境として今回はこのまま使用してみますが、PHP 5.6.40との完全一致が必要な場合は別途Dockerfileを作成するなどの対応が必要になります。

Dockerを使ってみた感想

今回初めてDockerを使ってみました。

最初は、

Docker
Container
Image
Volume
Docker Compose

など聞き慣れない用語が多く、MAMPより難しそうな印象がありました。

ただ、実際にWordPress環境をひとつ作ってみると、Dockerを使うメリットがかなり分かりやすかったです。

例えば、

案件A
PHP 5.6

案件B
PHP 7.4

案件C
PHP 8.3

といった環境を、それぞれ独立して管理できます。

MAMPのPHPバージョンを変更したり、古いMAMPを別途インストールしたりする必要がありません。

特に今回のような「かなり古いWordPressサイトをアップデートするため、一度ローカルに当時の環境を再現したい」という用途には、Dockerはかなり便利そうです。

よく使いそうなDockerコマンド

今回使った中で、今後も頻繁に使いそうなのはこちらです。

Docker環境を起動。

docker compose up -d

コンテナの状態を確認。

docker compose ps

WordPressコンテナのPHPバージョン確認。

docker compose exec wordpress php -v

Docker環境を停止。

docker compose down

再び起動するときは、

docker compose up -d

です。

このあたりを覚えておけば、WordPressのローカル検証環境としてはかなり使えそうです。

まとめ

今回はMAMP PRO 7.4ではPHP 5.6を追加できなかったため、Dockerを使って古いWordPress環境を構築してみました。

最終的には、

Intel Mac
↓
Docker Desktop
↓
WordPress
↓
Apache + PHP 5.6.39
↓
MySQL 5.7
↓
localhost:8080

というローカル環境を構築できました。

Dockerの導入途中では、

zsh: command not found: docker

docker-credential-desktop:
executable file not found in $PATH

wordpress:5.6-php5.6-apache:
not found

mapping key "volumes" already defined

mapping values are not allowed in this context

など、いろいろなエラーにも遭遇しました。

ただ、ひとつずつ原因を確認していけば、Docker未経験でもWordPressを起動するところまで進めることができました。

次は、今回作ったDocker環境に実際の本番WordPressサイトを複製してみたいと思います。

本番サイトを、

WordPress 5.6.40
PHP 5.6系
MySQL 5.7

に近い状態でDockerへ移行し、そこからWordPress・プラグイン・PHPをどの順番でアップデートすれば安全なのか検証していく予定です。