DockerでWordPressを立ち上げてwordmoveで本番環境と同期する話

Dockerを使ってローカルでWordPressを編集することは手軽にできるようになってきましたが、データの同期はどうしていますか?この記事では、wordmoveを使ってDockerのWordPressコンテナと本番環境の同期を行う環境構築をしていきます。

この記事はこんな人にオススメ
  • 本番環境で実行する前にDockerを使ってWordPressを編集している(しようとしている)
  • 実際DockerのWordPressコンテナを本番環境にどうやって同期させるの?
  • DockerのWordPressコンテナと本番環境を同期させるのにwordmoveってのがあるらしいけど、どう使うの?

BearFruitのマスコットキャラ「クマ」がLINEスタンプになりました!

プログラマーの心に刺さる、「プログラミングあるある」。毎日使いたくなること間違いなし!

目次

始めに(読み飛ばしてよいです)

色々ありまして、ブログを始めようと思い立ちました。しかも書きたいことがたくさんあるので、将来的には複数ブログ管理したいなぁと思いながら始めました。最初は「まぁ勉強にもなるし、ブログくらいは作れるんじゃね?」くらいのノリで、HTMLとCSSとPHPをベタ打ちしながらブログを0から作っていました。今思うと結構無謀なことしてました…。確かに結構勉強にはなりましたが、ページネーションを実装する段階で「流石にちょっと面倒だなぁ」と思ってしまいました。いや、かなり前の段階から、ベタ打ちは面倒だし色々な機能を実装するのは厳しい、とは思っていたのですが…。どのみち2つ目からはWordPressを使って作ることを決めていたので、「もう結構勉強したし、WordPressに移行しよう。よく頑張ったよ、俺は」と言うことで、WordPressでブログを作り始めました。が、開発環境の構築で手間取ったので、その覚書。

クマ

Dockerに慣れていないのとWordPressの仕組みがよくわかっていないこともあって、結構手間取りました。

詰まったところ

以下のところで詰まったので、このあたりの開発環境が似ている人は参考になるかもしれないです。

  • https + サブディレクトリ でブログ運用の環境構築。
  • wordmoveでエラー吐きまくられた

事前準備

私の開発環境

  • MacBook Air (M1)
  • Docker Desktop for Mac
  • git

Docker Desktopとgit(GitHub)は事前に使えるようにしておいてください。

クマ

GitHubのスキルはプログラミングするなら必須。まぁ、この記事を読んでいる人は十中八九使ってるだろうけど。

基本的な流れは以下の記事を参考にしました。

Docker-composeで最強(自分史上)のWordPress開発環境を作る

開発環境を整えていく

以下では、

  • 「ローカル」→ パソコン内
  • 「コンテナ」→ パソコン内にあるDockerコンテナ
  • 「本番」→ サーバなど、インターネットから閲覧できるWordPress

を指します。

ローカルに適当に作業ディレクトリを作って、gitを使ってリポジトリをクローン

以下のコマンドを作業ディレクトリで実行します。

$ git clone https://github.com/kawamataryo/quick-start-wordpress-docker.git project-dir

これで大まかなファイル群はコピーできたはずです。

.envファイルに環境変数を入れていく

docker-composeで使う環境変数を記入していきますが、地味にハマりました。当たり前ですが、正確な情報を記入していきましょう。

クマ

docker-composeはDocker Desktopをインストールしてたら入っているはず。docker-composeを使うと(今回初めて使った)、様々な設定を適応しながら複数のコンテナを立ち上げられるので、使い慣れればとても便利。

# -------------------------------------------
# wordpress・mysqlコンテナの設定
# -------------------------------------------
# プロダクトの名前 作成されるcontainer名の接頭語として使用
PRODUCTION_NAME=
# local WordPressを紐付けるPort名(ex: 8080)
LOCAL_SERVER_PORT=
# localのmysqlを紐付けるPort名(ex: 3306)
LOCAL_DB_PORT=
# -------------------------------------------
# wordmoveコンテナの設定
# -------------------------------------------
# 全て本番環境の情報
# URL
PRODUCTION_URL=
# WordPressのディレクトリの絶対パス
PRODUCTION_DIR_PATH=
# DB名
PRODUCTION_DB_NAME=
# DBのユーザー名
PRODUCTION_DB_USER=
# DBのパスワード
PRODUCTION_DB_PASSWORD=
# DBのホスト名
PRODUCTION_DB_HOST=
# DBの接続ポート
PRODUCTION_DB_PORT=
# SSHホスト名
PRODUCTION_SSH_HOST=
# SSHユーザー名
PRODUCTION_SSH_USER=
# SSHポート名
PRODUCTION_SSH_PORT=

URL、WordPressのディレクトリの絶対パスなど、それぞれのサーバーの環境によるので、確認しながら正確な値を入れていきましょう。どんな値を入れればいいか分からなければ、ググって調べましょう。(2、3箇所間違えてて、その都度最初からやり直しました。無駄に時間を食うので、ここはキチンと入れましょう。反省…。)

例.PRODUCTION_URL=https://ドメイン名/サブディレクトリ

ローカルにあるdocker-compose.ymlをいじる

クマ

docker-compose.ymlをちょっと書き直します。docke-compose.ymlはDockerのコンテナの環境設定をまとめて記述しておく設定ファイルです。これでコマンドひとつで複数コンテナが設定通りに立ち上がります。

以下にdocker-compose.ymlを記述しておきます。

version: '3'
services:
    database:
        platform: linux/x86_64
        image: mysql:5.7
        command:
            - "--character-set-server=utf8"
            - "--collation-server=utf8_unicode_ci"
        ports:
            - "${LOCAL_DB_PORT}:3306"
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_db"
        environment:
            MYSQL_USER: wordpress
            MYSQL_DATABASE: wordpress
            MYSQL_PASSWORD: wordpress
            MYSQL_ROOT_PASSWORD: wordpress
    wordpress:
        depends_on:
            - database
        image: wordpress:latest
        container_name: "${PRODUCTION_NAME}_wordpress"
        ports:
            - "${LOCAL_SERVER_PORT}:80"
            - "${HTTPS_PORT}:443"
        restart: on-failure:5
        volumes:
            - ./public:/var/www/html
            - ./certs:/etc/ssl/private ※1
        working_dir: /var/www/html/サブディレクトリ ※2
        environment:
            WORDPRESS_DB_HOST: database:3306
            WORDPRESS_DB_NAME: wordpress
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: wordpress
    wordmove:
        tty: true
        depends_on:
            - wordpress
        image: welaika/wordmove
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_wordmove"
        volumes:
            - ./config:/home/
            - ./public:/var/www/html
            - ~/.ssh:/home/.ssh ※3
        environment:
            LOCAL_SERVER_PORT: "${LOCAL_SERVER_PORT}"
            PRODUCTION_URL: "${PRODUCTION_URL}"
            PRODUCTION_DIR_PATH: "${PRODUCTION_DIR_PATH}"
            PRODUCTION_DB_NAME: "${PRODUCTION_DB_NAME}"
            PRODUCTION_DB_USER: "${PRODUCTION_DB_USER}"
            PRODUCTION_DB_PASSWORD: "${PRODUCTION_DB_PASSWORD}"
            PRODUCTION_DB_HOST: "${PRODUCTION_DB_HOST}"
            PRODUCTION_DB_PORT: "${PRODUCTION_DB_PORT}"
            PRODUCTION_SSH_HOST: "${PRODUCTION_SSH_HOST}"
            PRODUCTION_SSH_USER: "${PRODUCTION_SSH_USER}"
            PRODUCTION_SSH_PORT: "${PRODUCTION_SSH_PORT}"

※1 あとでSSL証明書を発行して./certsディレクトリに入れておきます。で、その./certsディレクトリをwordpressコンテナにマウントします。( ./certs:/etc/ssl/private でPC内の./certsをコンテナの/etc/ssl/privateにマウントする、という意味)
※2 サブディレクトリで運用している場合、ここを本番環境と揃えておきます。
※3 wordmoveでのローカルと本番の環境同期はssh接続で行います。秘密鍵を入れた~/.sshディレクトリをコンテナの/home/.sshにマウントします。

ここまでできたら、コマンドラインでdocker-compose.ymlのあるディレクトリまで移動して、以下のコマンドで今設定したコンテナ達を立ち上げます。

$ docker-comopse up -d

-dでバックグラウンド実行します。

参考

ちなみに、その他、wordmoveのコンテナと本番の環境を同期するまでに、以下のdocker-composeコマンドをよく使いました。

$ docker-dompose stop   ← コンテナ達を停止させる。
$ docker-compose restart   ← コンテナ達をリスタートさせる。
$ docker-compose down   ← コンテナ達を破棄する。コンテナのデータ、データベースなど全部破棄してしまう。docker-compose.ymlを書き直したときなどはこれをせざるを得ない。

SSL証明書を発行してローカル環境でHTTPS接続ができるようにする

こちらを参考にHTTPS接続ができるようにします。
HTTPSに対応したWordPressのローカル開発環境をDockerで構築

クマ

証明書を発行するあたりまでは、上記のサイトをご覧ください。

  • mkcertをインストール。
  • 作業ディレクトリに./certsディレクトリを作って移動し、証明書を発行。
  • 以下のコマンドでwordpressのコンテナに入る。コンテナ名は docker-compose ps などで確認できる。(「docker-compose.ymlをいじる」の※1でマウントしてるところに証明書が見えるはず。)
$ docker exec -it コンテナ名 /bin/bash
  • コンテナ内のSSLの設定ファイルをいじるためにエディタをインストールする。
$ apt-get update
$ apt-get install vim
  • SSLの設定ファイルをいじる。
$ vi /etc/apache2/sites-available/default-ssl.conf
# 32, 33行目を編集
SSLCertificateFile /etc/ssl/private/localhost+1.pem
SSLCertificateKeyFile /etc/ssl/private/localhost+1-key.pem
  • SSLの設定を反映する。
$ a2ensite default-ssl
$ a2enmod ssl
  • exitでコンテナから脱出。docker-compose restartでコンテナ再起動。
クマ

長くなってきました…。が、ここまできたら、ブラウザで「https://localhost/サブディレクトリ」と入力すれば、wordpressに接続できるはず。あと少し。

movefile.ymlをいじる

movefile.ymlはwordmoveでデータを同期する際の設定ファイルです。ローカルの作業ディレクトリ内のconfigディレクトリにあるはずです。以下にファイルの内容を載せておきます。

global:
  sql_adapter: default
local:
  vhost: "https://localhost/サブディレクトリ" ※1
  wordpress_path: "/var/www/html/サブディレクトリ/" ※2
  database:
    name: "wordpress"
    user: "root"
    password: "wordpress"
    host: "database"
production:
  vhost: "<%= ENV['PRODUCTION_URL'] %>"
  wordpress_path: "<%= ENV['PRODUCTION_DIR_PATH'] %>"
  database:
    name: "<%= ENV['PRODUCTION_DB_NAME'] %>"
    user: "<%= ENV['PRODUCTION_DB_USER'] %>"
    password: "<%= ENV['PRODUCTION_DB_PASSWORD'] %>"
    host: "<%= ENV['PRODUCTION_DB_HOST'] %>"
    port: "<%= ENV['PRODUCTION_DB_PORT'] %>"
  exclude:
    - '.git/'
    - '.gitignore'
    - '.gitmodules'
    - '.env'
    - 'node_modules/'
    - 'bin/'
    - 'tmp/*'
    - 'Gemfile*'
    - 'Movefile'
    - 'movefile'
    - 'movefile.yml'
    - 'movefile.yaml'
    - 'wp-config.php'
    - 'wp-content/*.sql.gz'
    - '*.orig'
    - "wp-content/uploads/backwpup*/*"
    - ".htaccess"
  ssh:
    host: "<%= ENV['PRODUCTION_SSH_HOST'] %>"
    user: "<%= ENV['PRODUCTION_SSH_USER'] %>"
    port: "<%= ENV['PRODUCTION_SSH_PORT'] %>"
    rsync_options: "--verbose"

※1 もともとは”http://localhost:<%= ENV[‘LOCAL_SERVER_PORT’] %>”となっているはずです。が、HTTPS接続に変更したので、ポート番号を.envファイルから拾ってくる形ではなく、この形にして直接記入しています。
※2 この形で。

いよいよwordmoveでローカルと本番環境を同期

  • SSH接続に使う秘密鍵を~/.sshに入れておく
クマ

うちはConoHa WINGのレンタルサーバーを借りています。ConoHa WINGでは「サーバー管理」→「SSH」→「+ SSH Key(画面右上)」で設定保存したらプライベートキー(秘密鍵)を発行してくれます。他のサーバーも似たようなものだと思います。

  • wordmoveコンテナに入ります。
$ docker exec -w /home/ -it wordmoveのコンテナ名 /bin/bash
  • SSH設定。コンテナ内で以下のコマンドを実行します。
$ ssh-agent bash
$ ssh-add /home/.ssh/秘密鍵
  • 以下のコマンドで本番環境をローカルにpullできるようになる。
$ wordmove pull --all
  • 逆に、ローカルのデータを本番にpushするときは以下のコマンド。
$ wordmove push --all

この2つのコマンドを実行すると、コンテナ、本番のデータが置き換わるので注意して行いましょう。

クマ

私がやったときはwordmove pull –allでエラーが出まくりました。一つずつ調べましたが、結果環境変数が間違ってました。エラーログはよく読もう…。そして変数は正しく記入しよう…。(当たり前)

ちなみに、wordmove pull –all をしたときに、以下の警告が出ることがあります。

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "C.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

ググってみたら色々と原因はあるようですが、私は以下の修正で警告が出なくなりました。

  • wordmoveコンテナ内でssh-configファイルをいじるので、エディタをインストール。
$ apt-get update
$ apt-get install vim
  • ssh-configファイルの以下の部分をコメントアウト
$ vi /etc/ssh/ssh_config
…
SendEnv LANG LC_* → # SendEnv LANG LC_* としてここをコメントアウト

改めてwordmove pull –all

クマ

これでようやくwordmoveを使ってローカルのコンテナと本番環境を同期できるようになりました!お疲れ様でした!コマンド一発で同期できるので、実験的に本番環境をいじりたいときなどはすごく便利。

ちなみにサーバーはを使っています。

クマ

コスパ最高でおすすめです。レンタルサーバーを考えている人は検討してみてください。

まとめ

かなり長くなりました。結構つまづきどころがあったので(自分だけかもしれませんが)、健忘録として残しておきます。同じようにつまづいている方の参考になれば幸いです。

自分で学ぶことは大事ですが、一人ではどうしても躓きがちです。本気でエンジニアを目指したい方は教えてもらう、というのも重要だと思います。

あなたへオススメ!
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次