WordPressをDockerで手軽に動かせそうなので調べてみました。dockerとdocker-composeをインストールしてあれば、動かすだけならすぐでした。
DockerHubにOfficialのWordPress Dockerイメージがあり、クイックスタートのマニュアルも「Quickstart: Compose and WordPress | Docker Documentation:」にあります。
docker-component.ymlをコピーして用意したら、docker-compose.ymlファイルがあるディレクトリで下記コマンドで起動できます。
$ docker-compose up -d
あとは、http://localhost:8000/ へアクセスしてWordPressインストールをすれば完了。停止をさせるには下記。
$ docker-compose down
DBのデータを消したい場合は下記のようにします。
$ docker-compose down --volumes
MySQLのデータはDockerのボリューム領域にあるdbdataに保存されます。WordPressのDBバックアッププラグインなどをインストールしてバックアップするとか、mysqldumpコマンドをdocker execで実行してバックアップすることになります。
この公式イメージだと、WordPressがコンテナ内に保存されるので、テーマやプラグインはコンテナ側に入ってしまうということで、テーマの開発をしたり、その成果をファイルで管理したいときには、ちょっと工夫が必要になります。
ということでカスタマイズ。次のようなディレクトリー構成になります。
. ├── Dockerfile ... 開発用カスタムWordPressイメージ(wp-uid1000)用 ├── docker-compose.yml ... 開発時用 ├── restore/ │ └── docker-compose.yml ... DBリストア用 ├── wordpress_dump.sql ... DBリストア用にWordPressインストール後に手動で入手 └── wp/ ... コンテナ起動後に作成されます。
次のDockerfileを用意します。いろいろ調べて、後でWordPressのディレクトリーがホスト側に保存されるように設定しました。
ここで、コンテナ起動をしたユーザーがホスト側で編集できるようにするには、コンテナ内でgroupmodとusermodコマンドを使ってUIDとGIDの調整をする必要があります。そのためにカスタムイメージが必要になります。
FROM wordpress:latest ARG HOST_USER_ID=1000 ARG HOST_GROUP_ID=1000 RUN groupmod -g ${HOST_GROUP_ID} www-data \ && usermod -u ${HOST_USER_ID} www-data \ && chown -R www-data:www-data /usr/src/wordpress
docker-compose.ymlファイルは次のようになります。公式のものと違うのはカスタムイメージをビルドする必要があるのでbuild要素が増えてimage要素で使用しているイメージ名が変更されています。また、WordPressのボリュームもホスト側のファイル領域を使うようにしています。
version: '3' services: db: image: mysql:5.7 volumes: - dbdata:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db build: context: . args: - HOST_USER_ID - HOST_GROUP_ID image: wp-uid1000 ports: - "8000:80" volumes: - ./wp:/var/www/html restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: dbdata:
準備ができたら、コンテナを起動します。初めて起動するときは、wp-uid1000のビルドが必要なので、HOST_USER_IDとHOST_GROUP_IDを指定して次のようにdocker-composeコマンドを実行します。
$ HOST_USER_ID=$(id -u $USER) HOST_GROUP_ID=$(id -g $USER) docker-compose up -d
起動したら、http://localhost:8000/ へアクセスするとWordPressをインストールできます。通常の停止は下記になります(公式と同じですね)。
$ docker-compose down
MySQLのDBも破棄して停止するには下記。
$ docker-compose down --volume
カスタム作成したWordPress Dockerイメージを破棄するには下記。
$ docker rmi $(docker images|grep wp-uid1000|awk '{print $3}')
参考までに開発で使ったWordPressを削除するには下記になります。
$ rm -fr wp
さて、WordPressをインストールしたら、DBのバックアップをとる方法を確認しておきましょう。「docker-compose up」で起動してWordPressをインストールした後に、次のようにdocker execでMySQLのデータベースからバックアップのSQLデータを取得します。
$ docker exec -it custom_db_1 \ sh -c 'mysqldump wordpress -u wordpress -pwordpress 2> /dev/null' \ > wordpress_dump.sql
リストア用のdocker-compose.ymlはrestore/Dockerfileとして用意します。services – db – volumes でdocker-entrypoint-initdb.dの指定を追加してあります。また、wordpressのimageはビルド済みという前提でwp-uid1000を指定してあります。
version: '3' services: db: image: mysql:5.7 volumes: - dbdata:/var/lib/mysql - ../wordpress_dump.sql:/docker-entrypoint-initdb.d/restore_wordpress.sql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wp-uid1000 ports: - "8000:80" volumes: - ../wp:/var/www/html restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: dbdata:
動作確認をしてみましょう。MySQLのデータを破棄してから、restoreディレクトリーからコンテナ起動をします。
$ docker-compose down --volume $ cd restore $ docker-compose up -d
コンテナが起動したら、http://localhost:8000/ へアクセスしてリストアができていることを確認してください。インストーラは起動せずにトップページが表示されればリストアができています。確認ができたら、コンテナは停止します。
$ docker-compose down
この後、テーマやプラグインの開発をするには普通にコンテナを起動します。wp-uid1000のビルドをしない場合は、HOST_USER_IDとHOST_GROUP_IDを指定する必要はないので、単純にdocker-compose upを実行して使います。
$ cd .. $ docker-compose up -d
WordPressを手元で動作させるのも簡単になりましたね。