WordPressの開発でローカル開発環境にDocker使って、テーマ部分のみをXSERVERにアップロードした話

こんにちは、WeJaプログラミング担当のhal-boです。

私が所属しているゲーム制作団体WeJaでは、現在オンラインマルチプレイゲームを作成しています。WeJaではゲームプログラミングやホームページ制作などの役割を担っています。WeJaについては下記の記事で説明しています。

このブログではゲーム開発中の気づきなどを残していけたらと思っています。

WeJaのブログでは担当者ごとにゲームプログラミング、ホームページ、音楽、モデリング、マーケティングなどゲーム開発に特化した様々な記事が投稿されるので、学生や個人のゲーム開発者の助けとなればいいなと思っています!皆様からのメッセージがモチベーションに繋がります。ご質問なども受け付けておりますのでぜひ気軽にご連絡ください。

WordPressの開発環境にDockerをつかってみた話

今回の内容は、皆さんが見ている私達WeJaのホームページの開発をどのようにおこなっているかという話です。ゲームとは直接関係ありませんが、ゲームをつくったらやっぱりホームページはほしいですよね。ホームページをつくりたいと思っている方の助けになれば幸いです。

といっても今回説明する方法は少々めずらしいと思います。そもそもWordPressなど気軽にホームページやブログをつくることができるサービスを使おうとしているのにDockerなんて難しそうな雰囲気の技術を使う人は少ないのではないでしょうか。それに、知っている人もいると思いますが、今ではWordPressのローカル環境を用意するのがとても簡単なLocalというサービスもあります。

今回とった方法はまわりくどいし、無駄な部分もあると思います。ではなぜ今回の方法をとったかを説明します。それは、

Dockerがつかってみたかったからです

これ重要です。私達は学生団体であり、営利目的の団体ではありませんので、しばしば効率の悪い方法やベストプラクティスではない手法をとります。それが逆に誰かの気付きや助けになってくれればいいなと思っています。ですが「こうしたほうがいいよ」などといったアドバイスはとてもためになるので、アドバイスがあればぜひいただきたいと思っております。

それでは前置きが長くなりましたが今回構築した開発環境について説明します。

WordPress開発環境を表した図
開発環境を表した図

今回の開発環境を図に表すと上記のようなイメージになります。開発者はDockerでWordPressの開発環境を立ち上げ、その中でWordPressのメインテーマの編集を行います。これによってローカルサーバーを通じて挙動を確認することができます。また、本番環境はXSERVER上に用意されています。XSERVERではDockerを利用することができないため、XSERVERの簡単インストールによってワードプレス環境を用意し、その環境に、開発しているメインテーマ部分のみをとりいれるといった構造になっています。Dockerを理解しているひとからしたら本番環境でDocker使わないんかいってつっこみたくなると思いますが、あとで説明するようにXSERVERをすでに契約していることを前提で今回取り組んだためこのような構成になっております。ご理解ください。

それではひとつずつ説明していきます。

DockerでWordPressを立ち上げる

まずそもそもDockerとはコンテナを用いてアプリケーションを高速に構築することができるコンテナ化技術です。Dockerを使うことで

  • Dockerの設定ファイルさえあれば、コンピュータのOSに関わらずどこでも誰でも同じ環境をつくることができる
  • 設定ファイルさえあればいいので共有が簡単
  • サーバーの立ち上げが容易、高速

などといった恩恵を受けることができます。今回で言えばdocker-compose.ymlファイルを共有するだけで複数の開発者が全く同じ環境で開発できるようになります。(WeJaにはWindowsとMac利用者どちらも存在しています。)

docker-compose.ymlファイルを受け取った人は

$ docker-compose up -d

というコマンドを一つ打つだけで環境が立ち上がるようになっており、非常に快適でした。しいていうならばdocker-compose コマンドを使える状態にするためにインストールなどが必要であり、そこは各自で行ってもらう必要があります。

今回はdockerのインストール方法などは詳しく解説しません。

dockerをインストールしていない方は以下の公式ページからインストールしてください

Docker の入手

またdocker-compose コマンドを使うためにこちらもインストールしてください

Docker Compose のインストール

インストールが完了したらターミナルで以下のコマンドを実行してエラーがでなければインストールが成功していることが確認できます。バージョンは人によって違うので気にしなくて大丈夫です。(dockerとdocker-composeのバージョンの組み合わせによっては動かないことがあります。どちらも同時にインストールしたのであればおそらく大丈夫ですがどちらか片方のみを新しくした場合はもう一方も新しくするなどしましょう。)

$ docker-compose -v 
docker-compose version 1.27.4, build 40524192

ここまで来たら実際にdocker-compose.ymlを記述します

docker-compose.yml は以下のように記述しました

version: '3'
services:
 db:
   image: mysql:5.7
   volumes:
     - ./db/mysql:/var/lib/mysql
     - ./db/mysql.dump.sql:/docker-entrypoint-initdb.d/install_wordpress.sql
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: somewordpress
     MYSQL_DATABASE: wordpress
     MYSQL_USER: wordpress
     MYSQL_PASSWORD: wordpress
 wordpress:
   depends_on:
     - db
   image: wordpress:latest
   ports:
     - "8000:80"
   restart: always
   environment:
     WORDPRESS_DB_HOST: db:3306
     WORDPRESS_DB_USER: wordpress
     WORDPRESS_DB_PASSWORD: wordpress
   volumes:
     - ./wordpress/html:/var/www/html
     - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
 phpmyadmin:
   image: phpmyadmin/phpmyadmin:latest
   restart: always
   depends_on:
     - db
   ports:
     - 8080:80
volumes:
  db_data:

WordPressを動かすためにはデータベースが必要なため、WordPressとMySQLを同時に用意する必要があります。また、データベースをGUIで確認するために、phpmyadminも立ち上げるようにしています。それぞれ公式のイメージが用意されているため、このように記述するだけでコマンド実行とともにDockerの公式レジストリがらダウンロードされ、ローカルに環境が立ち上がるようになっています。また、一度ダウンロードしてしまえば二回目以降は、コマンド実行後すぐに、環境が立ち上がるようになります。

上記ファイルを記述したらdocker-compose up -dコマンドを実行することで環境が立ち上がります。portsの設定でWordPressのページは8000ポート、phpmyadminは8080ポートにアクセスすることができるようになっているので
それぞれブラウザにて

http://localhost:8000
http://localhost:8080

のURLでアクセスすることができます。
docker-compose.yml の設定内容については

docker-compose を使って WordPress テーマ開発環境を構築しよう
こちらのページを参考にさせていただきました。

dockerで立ち上げた環境はコンテナをたたむとファイルがすべて失われてしまうのでvolumesを設定することで一部ファイルをホストマシンと同期させ、データが失われないようにしています。

同期しているのは以下です

volumes:
  - ./db/mysql:/var/lib/mysql
  - ./db/mysql.dump.sql:/docker-entrypoint-initdb.d/install_wordpress.sql

1つ目はまずデータベースの中身の共有です。立ち上げるたびにデータが空になってしまうのは大変なのでホストマシンのdb/mysqlにマウントします。

2つ目はデータベースの初期データです。初期データとしてdb/mysql.dump.sqlが保存されていた場合にはこれを使ってコンテナ初回立ち上げ時にデータベースを初期化してくれます。

  volumes:
     - ./wordpress/html:/var/www/html
     - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini

3つ目はwordpressの中身部分です。これは開発対象部分になりますので消えないようにしなければなりません。

最後がphp.iniです。phpプログラムの動作や環境を設定するときに使うことがあるのでこちらも消えないようにマウントしておきます。

フォルダ構成は以下のようになります

-root
  -db
    -mysql
    -mysql.dump.sql
  -php/php.ini
  -wordpress
  -docker-compose.yml

また開発時はこれをgitで管理していました。このときデータベースの中身までアップロードしてしまうと容量が大きくなってしまうので。.gitignore次のように設定します

db/mysql

XSERVERではWordPressのテーマ部分だけを受け取りたい

ここまででDockerでWordPressを立ち上げて開発する環境が出来上がりましたが、実は本番環境にはすでにWordPressがインストールされています。つまり、Dockerなど必要ない状態にありました。ほんとは本番環境もDockerで立ち上げることで本番環境も全く同じ環境をつくることができるので、本当のDockerの恩恵を受けられるようになります。しかし、現時点ではXSERVERをすでに契約していたため他のサーバーを用意するとお金がかかるので断念しました。いずれサーバーをAWSかGCPにうつしてDockerで運用したいと考えているのでその時はまた記事を書こうと思っています。

このように開発環境ではDockerで立ち上げたWordPress、本番環境ではXSERVERで用意したWordPressを利用するため共有する部分はWordPressのテーマ部分のみになります。今回はdocker-compose.ymlを含んだフォルダをgitで管理していたのでテーマ部分をサブモジュール化してから本番環境でテーマ部分のみをpullできるようにします。

git管理フォルダのWordPressメインテーマ部分をサブモジュール化する

現段階で開発の都合上docker-compose.ymlを含んだフォルダ全体をgitで管理していましたが本番環境ではこれのroot/wordpress/html/wp-content/themas/テーマのみをpullしたかったのでテーマフォルダをさらにgitで管理することにします。

テーマフォルダを別で用意しgithubなどのリモートリポジトリにあげ

それをroot/wordpress/html/wp-content/themasで

git submodule add リモートリポジトリのURL テーマの名前
としてサブモジュールとして登録します

XSERVERにsshで接続し、WordPressのメインテーマモジュールをgit cloneする

gitを使ってアップロードしたいので、サーバーにsshで接続します

SSH設定 | XSERVER

まずはこちらをもとに公開鍵の登録、秘密鍵の生成をします。このとき鍵を生成する際に打ち込んだパスフレーズはssh接続の際に必要になるので覚えておきましょう

保存した秘密鍵は任意の名前で ~/.ssh/の下に保存します

mv hoge.key .ssh/hoge.key

また.ssh以下にconfigというテキストファイルをつくり以下のように記述します。

Host hoge
HostName ○○○○.xsrv.jp
Port 10022
User ○○○○
IdentityFile ~/.ssh/hoge.key
ServerAliveInterval 60

hoge.keyは自身の秘密鍵の名前を入力してください。○○○○はXSERVERからサーバーIDを調べ記入してください。Host hogeのhoge部分は自由に決めてもらって大丈夫です

Host hogeなら

$ ssh hoge

Host wejaなら

$ ssh weja

といった風にアクセスできるようになります。

アクセスする前にパーミッションを変更します

chmod 400 .ssh/hoge.key
chmod 700 .ssh/

アクセスしてみましょう

ssh hoge

このとき鍵を生成する際に使ったパスフレーズを要求されるのでそのパスフレーズを打てば接続できます。

wordpressのwp-content/themasまで移動したら

git clone でテーマフォルダを引っ張ってきてようやく完了になります!

リモートリポジトリの内容を本番環境に反映させたいときは毎回ssh接続してgit pullすればokです。ftpよりこっちのほうが好きです。

今回のまとめ

  • 今回はWordPressの開発環境をdockerで立ち上げgitで管理しました。
  • そのなかのテーマ部分だけをサブモジュール化しました
  • XSERVERにssh接続しテーマ部分をgit cloneしました。

どうでしたでしょうか。Dockerはいま流行りの技術で試してみたいという方、ぜひ開発環境だけにでも利用してみてください。そのスマートさに虜になると思います。AWSやGCPに移行したときには、また記事を書こうと思っていますのでお待ちしていてください。

また、実際のWordPressのテーマ制作については今後Denが記事を書いていってくれると思うのでそちらを参照してください。Den1つ目の記事はこちらです。WordPressのテンプレートファイルって何?テーマ作成で迷ったこと

この記事を書いた人:hal-bo

hal-bo