ローカル環境でDocker×WordPressが重い問題を解決する

はじめに

ローカルでDockerを使ってWordPress制作する時、ページの更新が結構遅い。制作中は何度も更新するので、少し遅いがストレスになるので調べてみた。

環境

  • Windows環境
  • docker-compose使用

Mac環境でも同じだと思いますが、Macの場合は、cachedオプションを使う方法もあるようです。詳細は後半で。

原因

volumesでホストPCとDocker側で同期設定している場合、ファイルシステムが異なるため、ファイル形式の変換などに時間がかかっている。

改善策

できるだけファイルのやり取りを減らすために、docker-compose.ymlvolumesの設定を見直す。

例えば、こんなdocker-compose.ymlの場合

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
    #ここ注目
    volumes:
      - ./wordpress:/var/www/html
volumes:
    db_data:

この場合、ホスト側のwordpressフォルダとDocker側の/var/www/htmlを同期している。

これでは、すべてのファイルが同期されるので重い。

なので、ホスト側で編集するファイル群以外はDocker側のボリュームへ入れてしまう。

例えば、themesしかいじらないよって場合

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
    volumes:
      - wp_data:/var/www/html #←変更
      - ./wordpress/wp-content/themes/mytheme:/var/www/html/wp-content/themes/mytheme #←追加
volumes:
    db_data:
    wp_data: #←追加

例えば、wp_dataというボリュームを用意して全体を放り込む。

そして、themes内のテーマフォルダを同期設定する。

結果

ほとんどのファイルがDocker側で動作するので高速になる。

コンテナを落としても全てのデータが保持される。

注意点

  • テーマフォルダ以外のファイルをホストPC側で編集しても反映されない。編集するファイルはvolumesに追加する必要がある。

ダッシュボード内での操作や編集は、Docker側なので反映されます。(設定や記事の作成、画像のアップロードなど全般)

Mac環境でcachedオプションを使う

Windows版にはない?ようなので試していませんが、Macの方はお試しあれ。

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
    #ここ注目
    volumes:
      - ./wordpress:/var/www/html:cached #←cachedを付ける
volumes:
    db_data:

cachedの他に、delegatedがあるようです。違いは以下の通り。

consistent(デフォルト) 完全な一貫性(常にホストとコンテナが完全に同じ表示)
cached ホストの表示が信頼できる(ホスト上の更新がコンテナ上に反映するまで、遅延が発生するのを許容)
delegated コンテナの表示が信頼できる(コンテナ上の更新がホスト上に反映するまで、遅延が発生するのを許容)

自分的な解釈(合ってるか不明)では、「表示だけ先にするけど実際の反映は裏で遅延してやるよ」って事ですかね?なので、場合によってはデータの一貫性が保たれないなどの副作用があるようです。詳細は↓

まとめ

この方法で制作する場合は、手元(ホストPC側)にはテーマフォルダしかない点に気をつけなければいけません。途中からボリュームを作成した場合は、wordpressフォルダ内にファイルが残っているかもしれませんが最新ではありません。(最新はDocker側のボリューム)

テーマ制作のみの場合は特に問題ありませんが、WordPress全体を本番サーバへデプロイしたい場合は、エクスポートできるプラグイン(All-in-One WP Migrationなど)を使うか、手動で…行わなければいけないので、用途に合わせて参考にしてください。

ネットで検索した結果、同様の方法を使った情報がなかったので記事にしました。Docker初心者なので、全体の捉え方や方法に問題がある場合はコメントくださいm(_ _)m