👓

【docker】wordpressローカル開発環境を複数人で共有する構成を考えてみる

2021/07/30に公開

概要

wordpressのローカル開発を複数人でデータ共有する環境構成を考えてみます。

背景

それぞれのローカル環境にMySQLを立てると
ページのデータが分散してしまい、後で統合するのがしんどいので
同じ場所にデータを集約できる環境にしたほうが便利かなと思ったのがきっかけです。

方法

パブリッククラウドにインスタンスを構築してMySQLを立てるのがスタンダードな気がしましたが
今回は、共有ストレージにデータのみを集約する方法を考えてみます。
各自のローカル環境からMySQLサーバのデータ格納先を
同じ共有ストレージにマウントします。
あとは各自の環境でdockerでwordpressとMySQLを起動するだけです。
テーマなどのwordpressのコンテンツデータはgithubなどのリポジトリで共有します。

前提

共有ストレージをローカル(finderとか)で参照できるようにしておきます。
onedriveとかdropboxとか。

構成

テスト環境に利用するには

wordpressのコンテンツもすべて共有ストレージに格納するようにすれば
各人が全く同じ状態でwordpressを起動できるはずなので
テスト等をする際はそういう構成もありかもしれません。

構成

手順

以前に書いたdockerでwordpressのローカル環境を構築する方法で
マウント先を少し変更するだけです。
MySQLのマウント方法はボリュームマウントからバインドマウントに変えます。
https://zenn.dev/persona/articles/50f87da99c92af

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - /drive/mysql:/var/lib/mysql # ★★★マウントするディレクトリに共有ストレージを指定★★★
     ports:
       - "3306:3306"
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - /drive/html:/var/www/html # ★★★マウントするディレクトリに共有ストレージを指定(テスト環境の場合)★★★
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

最後に

気になる点があるとすれば、
MySQLサーバは各自のローカル環境にコンテナとして立っている状態になるので
同じディスクに存在するレコードに同じタイミングでアクセスする際の
排他制御の挙動がどうなるかが少し気になります。
開発者が少人数なら共有ストレージ方式でもそこまで問題はなさそうですが
多数の開発者がいる場合は
どこかのサーバに共用のMySQLを立てた方が無難な気がします。

追記(2021/09/17)

wordpressでWEBサイトを作成する仕事をちょうど受けたので
上記の構成を複数人で試してみました。
使用した共有driveはgoogle driveでやってみました。

結果

一人の開発やテスト環境として公開する分には便利だと思いますが、
複数人での開発にDBを共有ドライブに構築するのはあまり向いてないかもしれません。
やはり、別途DBを立てたほうがリスクがないですね。。

理由

共有ドライブの同期機能がDBのデータ更新を瞬時に検出できないので、
データ同期の競合が発生することがありました。
それにより、Aさんが更新したデータがBさんの環境の古いデータで上書きされて、
デグレードしてしまうなどが発生することがあります。

詳細

▼cssやphpなどの一般的なファイルの変更
→瞬時に動的に検出して同期
▼DBのデータ(バイナリ)
→瞬時に動的に検出できてなさそう
 →「バックアップと同期」アプリがファイルクローリングをしたタイミングで検出される。タイミングは非同期。
 →コンテナの起動のタイミング等では同期される

Discussion