DockerでWordPress開発環境を作る

WordPressの開発環境というとVCCWが有名で、私もかなり愛用していました。しかし、VCCWはVirtualBoxを使用した仮想環境上でLAMPを動作させ、そこでWordPressを動かすという構成になるので、どうしても負荷が高めなんですよね。起動が遅い、アクセス速度も微妙・・・という感じ。

そこで、より軽量でサクサク動く環境を目指して、Dockerで環境構築することにしました。

ちなみに、Windows(WSL2)上でDockerを動かす場合は、WSL2のホームディレクトリなど、Windows上から直接見えない場所にファイルを置いた方がアクセス速度が圧倒的に早くなります。Windows上から直接見えないと開発しづらそうですが、Visual Studio Codeのリモート開発環境を使えばWSL2上のファイルを直接編集できるので、特に問題になりません。

WordPress Dockerイメージの作成

WordPerssのDockerイメージとして、WordPress純正のものを使用するがWP-CLIが使いたいので、下記のDockerfileを作成してイメージを更新します。

適当なディレクトリ(以下、プロジェクトディレクトリという)を作成し、その直下にDockerfileとして下記の内容のファイルを作成します。(前述のとおり、Windows上ではWSL2のホームディレクトリ配下などが好都合です。)

FROM wordpress:latest

RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
    && chmod +x wp-cli.phar \
    && mv wp-cli.phar /usr/local/bin/wp \
    && wp --info

RUN apt update && apt install -y less

docker-composeで環境作成

docker composeで下記のような環境を一気に作成します。

  • データベース:MySQL 5.7
  • WordPress:上記のDockerfileをもとにイメージをビルド
  • WordMove
  • phpMyAdmin

docker-compose.ymlと.envファイルの作成

下記のファイルを作成し、docker-compose.ymlとして保存します。

version: "3"

services:
  mysql:
    image: mysql:5.7
    command:
      - "--character-set-server=utf8"
      - "--collation-server=utf8_unicode_ci"
    container_name: ${SITE_NAME}_db
    volumes:
      - db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    env_file: .env
    ports:
      - "${MYSQL_LOCAL_PORT}:3306"
  wordpress:
    build: .
    container_name: ${SITE_NAME}_wp
    ports:
      - "${WORDPRESS_LOCAL_PORT}:80"
    depends_on:
      - mysql
    environment:
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
    env_file: .env
    volumes:
      - ./public:/var/www/html
  wordmove:
    image: welaika/wordmove
    container_name: ${SITE_NAME}_wordmove
    tty: true
    depends_on:
      - wordpress
    env_file: .env
    volumes:
      - ./public:/html
      - ./wordmove:/root/wordmove
      - ~/.ssh:/root/.ssh
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: ${SITE_NAME}_phpmyadmin
    depends_on:
      - mysql
    environment:
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=password
    env_file: .env
    ports:
      - "${PMA_LOCAL_PORT}:80"

volumes:
  db_data:
    name: ${SITE_NAME}_data
    driver: local

このdocker-compose.ymlでは、一部の設定内容を.envから取るようにしています。
下記の内容のファイルを、.envとして作成します。

# Dockerコンテナの名前の一部として使用される
SITE_NAME=

# Docker上のMySQLの接続情報(ここで指定した内容で設定される)
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
# Docker上のMySQLに外部から接続するためのポート
MYSQL_LOCAL_PORT=13307

# Docker上のMySQLに作成するWordPressデータベースの接続情報(ここで指定した内容で設定される)
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress
WORDPRESS_LOCAL_PORT=80
WORDPRESS_TABLE_PREFIX=wp_

# phpMyAdminの接続情報(ここで指定した内容で設定される)
PMA_HOST=mysql
PMA_USER=root
PMA_PASSWORD=password
PMA_LOCAL_PORT=8080

# WordMoveのmovefile.ymlに設定する内容
LOCAL_VHOST=
PRODUCTION_VHOST=
PRODUCTION_WORDPRESS_PATH=
PRODUCTION_DB_NAME=
PRODUCTION_DB_USER=
PRODUCTION_DB_PASSWORD=
PRODUCTION_DB_HOST=
PRODUCTION_SSH_HOST=
PRODUCTION_SSH_USER=

WordPress環境の立ち上げ

docker compose up -d

Dockerfileの更新時は、ビルドを行うためdocker compose up -d --buildとします。

hostsファイルに127.0.0.1で設定しておけば、あとはそのドメイン名をWebブラウザで開けば、WordPressサイトが表示されます。(最初はWordPressのインストール画面が表示される。)

WordPressが導入されているディレクトリは、プロジェクトディレクトリのpublic配下に置かれるので、ローカルのテキストエディタ等で編集できます。(ファイルのオーナーに注意)

データベースの情報は${site_name}_dataというコンテナに保存されています。

WordPress環境の終了

docker compose down

終了した後、再度docker compose up -dを実行すると、作業途中の環境が復元されます。

作成した環境を削除したい場合は、docker rmなどを用いて削除します。

各種環境へのアクセス

WP-CLIを使う場合

WP-CLIは${site_name}_wpコンテナに入っているので、下記のコマンドでコンテナの中に入って操作します。

docker exec -it ${site_name}_wp /bin/bash

WordMoveを使う場合

WordMoveを使用するには、プロジェクトディレクトリにwordmoveというディレクトリを作成し、下記のmovefile.ymlファイルを作成します。
ほとんどの設定項目は、.envファイルに設定した内容が用いられるようになっています。

global:
  sql_adapter: wpcli
  #sql_adapter: default

local:
  vhost: "<%= ENV['LOCAL_VHOST'] %>"
  wordpress_path: /html # use an absolute path here

  database:
    name: wordpress
    user: wordpress
    password: "wordpress" # could be blank, so always use quotes around
    host: mysql
    mysqldump_options: "--default-character-set=utf8 --no-tablespaces"

production:
  vhost: "<%= ENV['PRODUCTION_VHOST'] %>"
  wordpress_path: "<%= ENV['PRODUCTION_WORDPRESS_PATH'] %>" # use an absolute path here

  database:
    name: "<%= ENV['PRODUCTION_DB_NAME'] %>"
    user: "<%= ENV['PRODUCTION_DB_USER'] %>"
    password: "<%= ENV['PRODUCTION_DB_PASSWORD'] %>"
    host: "<%= ENV['PRODUCTION_DB_HOST'] %>"
    mysqldump_options: "--default-character-set=utf8"
    # port: 3308 # Use just in case you have exotic server config
    # mysqldump_options: '--max_allowed_packet=1G' # Only available if using SSH
    # mysql_options: '--protocol=TCP' # mysql command is used to import db

  exclude:
    - ".git/"
    - ".gitignore"
    - ".gitmodules"
    - ".env"
    - "node_modules/"
    - "bin/"
    - "tmp/*"
    - "Gemfile*"
    - "Movefile"
    - "movefile"
    - "movefile.yml"
    - "movefile.yaml"
    - "wp-config.php"
    - "wp-content/*.sql.gz"
    - "*.orig"

  # paths: # you can customize wordpress internal paths
  #   wp_content: wp-content
  #   uploads: wp-content/uploads
  #   plugins: wp-content/plugins
  #   mu_plugins: wp-content/mu-plugins
  #   themes: wp-content/themes
  #   languages: wp-content/languages

  ssh:
    host: "<%= ENV['PRODUCTION_SSH_HOST'] %>"
    user: "<%= ENV['PRODUCTION_SSH_USER'] %>"
  #   password: password # password is optional, will use public keys if available.
  #   port: 22 # Port is optional
  #   rsync_options: '--verbose --itemize-changes' # Additional rsync options, optional
  #   gateway: # Gateway is optional
  #     host: host
  #     user: user
  #     password: password # password is optional, will use public keys if available.

  # ftp:
  #   user: user
  #   password: password
  #   host: host
  #   passive: true
  #   port: 21 # Port is optional
  #   scheme: ftps # default `ftp`. alternative `sftp`

  # hooks: # Remote hooks won't work with FTP
  #   push:
  #     before:
  #       - command: 'echo "do something"'
  #         where: local
  #         raise: false # raise is true by default
  #     after:
  #       - command: 'echo "do something"'
  #         where: remote
  #   pull:
  #     before:
  #       - command: 'echo "do something"'
  #         where: local
  #         raise: false
  #     after:
  #       - command: 'echo "do something"'
  #         where: remote
  #
  # forbid:
  #   push:
  #     db: false
  #     plugins: false
  #     themes: false
  #     languages: false
  #     uploads: false
  #     mu-plugins: false
  #   pull:
  #     db: false
  #     plugins: false
  #     themes: false
  #     languages: false
  #     uploads: false
  #     mu-plugins: false
# staging: # multiple environments can be specified
#   [...]

下記のコマンドでWordMoveコンテナに入ることができます。

docker exec -it ${site_name}_wordmove /bin/bash

movefile.ymlはWordMoveコンテナ内では、/root/wordmoveに配置されているので、そのディレクトリでwordmoveコマンドを実行できます。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。