WordPressをDockerで手軽に動かそう

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を手元で動作させるのも簡単になりましたね。

同じタグの記事: Docker
同じタグの記事: WordPress
同じカテゴリの記事: Linux
関連書籍: WordPress