ローカル環境でDocker×WordPressが重い問題を解決する
はじめに
ローカルでDockerを使ってWordPress制作する時、ページの更新が結構遅い。制作中は何度も更新するので、少し遅いがストレスになるので調べてみた。
環境
- Windows環境
- docker-compose使用
Mac環境でも同じだと思いますが、Macの場合は、cached
オプションを使う方法もあるようです。詳細は後半で。
原因
volumesでホストPCとDocker側で同期設定している場合、ファイルシステムが異なるため、ファイル形式の変換などに時間がかかっている。
改善策
できるだけファイルのやり取りを減らすために、docker-compose.ymlのvolumes
の設定を見直す。
例えば、こんな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
-
前の記事
記事がありません
-
次の記事
【Docker】client_max_body_sizeが効かない時 2022.02.07
コメントを書く