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
コマンドを実行できます。