リモートサーバー上(本番環境)で運用・公開しているWordpressを、自分のPCの中のDocker上に構築したWordpressに移管する方法についてまとめています。
なお、自分のPC上にDockerを使ってWordpressを構築する方法については下記をご参照ください。
【初心者向け】Dockerを使って超簡単にWordPressをローカル環境に構築する方法
WordPressのディレクトリをまるごとコピーする
リモートサーバー上の移管したいWordpressのディレクトリをまるごとコピーして、ローカルに持ってきます。
コピーしてくる方法は様々で、FTP(S)ソフトや、WebDAV、Githubのレポジトリにプッシュしてクローンするなどなんでもいいです。
ごっそり丸ごととってきて、htmlというディレクトリの中に入れます。(※Dockerファイルでマウントしているボリューム名と合わせるために「html」を使っています。適宜変更してください。)
htmlディレクトリがある場所に「docker-compose.yml」も配置します。
↓ 「html」ディレクトリの中身は以下のようになります(一部のみ表示)
.htaccessをデフォルトに戻す
.htaccessは本番と同じ状態でも動く場合もありますが、httpsへの転送設定やプラグインによる転送設定が行われている場合、Wordpressで正しく開けない場合があります。
このため、.htaccessをデフォルトの状態に戻しておきます。
.htaccessを開いて以下をコピペし保存して閉じます。
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
wp-configのデータベース情報を修正する
WordPressではデータベース(MySQL)への接続情報は「wp-config.php」ファイルに記載さいれています。
リモートサーバーから拾ってきた状態だと、リモートサーバーのMySQLに接続する設定になっているため、これを、Docker内のMySQLに接続するように変更します。
例えば、docker-compose.ymlで定義しているMySQLが以下のようになっているとします。
version: "3.7"
services:
db:
image: mysql:5.7
container_name: wp_mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root # rootユーザのパスワード(任意に指定可)
MYSQL_DATABASE: wp_db # WordPress用データベース名(任意に指定可)
MYSQL_USER: wp_user # WordPress用接続ユーザ名(任意に指定可)
MYSQL_PASSWORD: root # WordPress用パスワード(任意に指定可)
この場合、必要な情報は以下になります。
情報 | 内容 |
---|---|
ホスト名 | db |
データベース名 | wp_db |
ユーザー名 | wp_user |
パスワード | root |
ホスト名はMySQLのサービス名、それ以外の情報はenvironment(環境変数)で定義しています。
この内容に合わせて、wp-config.phpの内容を修正します。
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wp_db' );
/** MySQL database username */
define( 'DB_USER', 'wp_user');
/** MySQL database password */
define( 'DB_PASSWORD', 'root' );
/** MySQL hostname */
define( 'DB_HOST', 'db' );
リモートサーバーのMySQLのバックアップファイルを生成する
リモートサーバーのMySQLの中身を移管するためにバックアップファイルを生成します。
特定のデータベースの全てのテーブルを移管したい場合と、一部のテーブルのみを移管したい場合で実行するコマンドが変わってきます。
全てのテーブルを移管する場合
特定のデータベースの中身をごっそり抜き出したいときは以下のコマンドを実行します。
$ mysqldump -u <ユーザー名> -h <ホスト名> -p <データベース名> --skip-column-statistics > 出力ファイル名.sql
パスワードの入力を求められるので、MySQLのパスワードを入力します。
すると、指定したファイル名で「出力ファイル名.sql」が生成されます。
これがバックアップ用のファイル(ダンプファイル)になります。
指定したテーブルのみ移管する場合
特定のデータベースの中の指定したテーブルのみを抜き出したいときは、以下のコマンドを実行します。
mysqldump -u <ユーザー名> -h <ホスト名> -p <データベース名> <テーブル名1> <テーブル名2>,,,, > 出力ファイル名.sql
対象となるテーブルがたくさんある場合
対象となるテーブルが複数あるとき、個別にテーブル名を入力していくのは大変です。
そんなときは、パターンマッチングを使って対象となるテーブルをまとめて指定することもできます。
$ mysql -u <ユーザー名> -h <ホスト名> -p <データベース名> -N -e 'show tables like "パターンマッチング"' | xargs mysqldump -u <ユーザー名> -h <ホスト名> -p <データベース名> --skip-column-statistics > 出力ファイル名.sql
パスワード入力を2回求められるので、それぞれMySQLのパスワードを入力してください。
すると、指定したファイル名「出力ファイル名.sql」のファイルが生成され、指定したテーブルの内容のみが入ります。
なおパターンマッチングの部分は、SQLのLike句で指定します。
ワイルドカード | 内容 |
---|---|
% | 0文字以上の任意の文字列 |
_ | 任意の1文字 |
例えば、「show tables like “pre_%”」とすれば、テーブル名の冒頭に「pre_」がつくテーブルのみがダンプの対象となります。
ダンプファイルをインポートする
バックアップ用のダンプファイル(~.sql)が生成できたら、これをDocker内のMySQLコンテナ内のデータベースにインポートします。
事前準備
Docker内のMySQLコンテナ内のデータベースにインポートする前に以下の2つが前提となります。
- 「docker-compose up」コマンドなどで、MySQLのコンテナを起動しておく。
- ダンプファイル(~.sql)を、Dockerfileやdocker-compose.ymlファイルと同じ場所に移動しておく。
テーブルの内容をインポートする
MySQLのコンテナを指定して以下のコマンドを実行します。
$ docker exec -i <コンテナ名> sh -c 'mysql <データベース名> -u <ユーザー名> -p<パスワード>' <ダンプファイル名>.sql
このコマンドを実行することで、コンテナのbashを起動することなく、mysqlコマンドを実行できます。
-iオプションとは何か?
「-i」オプションは、標準入力(STDIN)をオープンにし続けるオプションです。これにより指定したコマンドを実行することが可能になります。
通常「-t」オプションと合わせて使用されることが一般的です。「-t」オプションは疑似ターミナル(tty)を割り当てるオプションで、コンテナの中に入ってターミナルでコマンド操作することが可能になります。
今回は、コマンドのオプションで実行するmysqlコマンドを指定するので、疑似ターミナルは不要なため、「-i」オプションのみとなります。
shとは何か?
shは「shell(シェル)」のことで、指定したコンテナのシェルを起動します。これでシェルのコマンドが渡せる状態になります。
-cオプションとは何か?
「-c」オプションはコンテナの中で実行したいスクリプト(コマンド)を指定します。
「-c」のあとに、シングル(ダブル)クオテーションで、コマンドを記述します。
なお、「-c」がないとコマンドとして認識されません。
コマンドは実行可能である必要があり、連結されていたりクォートで囲まれていたりすると動作しません。
例として
docker exec -ti my_container "echo a && echo b"
は動作しませんが、docker exec -ti my_container sh -c "echo a && echo b"
であれば動作します。
mysql <データベース名> -u <ユーザー名> -p<パスワード>’ <ダンプファイル名>.sql
「-c」オプションの後ろに記述したコマンドが、mysqlの指定したデータベースに対象のダンプファイル(バックアップファイル)をインポートする処理です。
mysql -u <ユーザー名> -p<パスワード> <データベース名> < <インポートするファイル名>.sql
実例
ダンプファイルの生成
リモートサーバーにアクセスして「prograshi_」という接頭語がつくテーブルのみを抽出する場合は以下のようになります。
$ mysql -u userName -h mysq.lolipop.lan -p database -N -e 'show tables like "prograshi_%"' | xargs mysqldump -u userName -h mysq.lolipop.lan -p database --skip-column-statistics > dump_prograshi.sql
Enter password:
Enter password:
コマンドを実行すると、パスワードの入力を2回求められるので、入力します。
lsコマンドで確認すると、指定したファイルが生成されていることがわかります。
$ ls
dump_prograshi.sql wp-admin wp-content wp-login.php xmlrpc.php
この「dump_prograshi.sql」ファイルを、移管したいDockerのルートディレクトリ直下に配置します。
ダンプファイルのインポート
まずは対象となるMySQLコンテナが起動していることを確かめます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ba4912ef774 wordpress:latest "docker-entrypoint.s…" 36 seconds ago Up 34 seconds 0.0.0.0:10090->80/tcp, :::10090->80/tcp wordpress
a08ad79e6342 phpmyadmin/phpmyadmin:latest "/docker-entrypoint.…" 37 seconds ago Up 34 seconds 0.0.0.0:10099->80/tcp, :::10099->80/tcp phpmyadmin
b399b142387b mysql:5.7 "docker-entrypoint.s…" 39 seconds ago Up 37 seconds 3306/tcp, 33060/tcp wp_mysql
上記の、コンテナ名「wp_mysql」が今回生成したsqlファイルをインポートするデータベースを持つMySQLになります。
コンテナ名「wp_mysql」、ユーザー名「wp_user」、パスワード「root」、データベース名「wp_db」に「dump_prograshi.sql」をインポートする場合は以下のようになります。
$ docker exec -i wp_mysql sh -c 'mysql -u wp_user -proot wp_db' < dump_prograshi.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
コマンドライン上にパスワードを入力すべきではないという警告がでますが無視して問題ありません。
以上でインポートは完了です。
テーブルのドメイン情報を書き変える
現状のデータベースの中で指定されているドメインは本番環境のドメインになっています。
これを、Dockerで指定したドメインに変更する必要があります。
例えばdocker-compose.ymlが以下のようになっている場合は本番環境で指定していた「https://~」を「localhost:10090」に変更します。
wordpress:
image: wordpress:latest
container_name: wordpress
depends_on:
- db
ports:
- "10090:80"
書き換えの必要があるテーブルとカラム
書き換えの必要があるのは以下のテーブルとカラムです。
テーブル名冒頭の「xxx」はテーブルの接頭語です。通常は「wp」(例 wp_options)のようになっています。
また、書き換えは念のためhttp://~とhttps://~の両方に対して行うようにします。
本番環境のドメインの確認方法
本番環境のドメインは実際のサイトでも確認できますが、Docker上でインポート済みのMySQLのテーブルでも確認することができます。(不要な方は読み飛ばしてください。)
MySQLのコンテナの中に入る
$ docker exec -it <MySQLのコンテナ名> bash
mysqlの対話モードを開く
# mysql -u <ユーザー名> -p<パスワード>
実例
$ docker exec -it wp_mysql bash
root@b399b142387b:/# mysql -u wp_user -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.7.37 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
データベースを選択する
データベースの一覧を表示します。
show databases;
データベースを選択します。
use <データベース名>
実例
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| wp_db |
+--------------------+
2 rows in set (0.00 sec)
mysql> use wp_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
テーブルを確認する
テーブルの一覧を表示します。
show tables;
実例
mysql> show tables;
+-----------------------------------+
| Tables_in_wp_db |
+-----------------------------------+
| prograshi_actionscheduler_actions |
| prograshi_actionscheduler_claims |
| prograshi_actionscheduler_groups |
| prograshi_actionscheduler_logs |
| prograshi_aioseo_cache |
| prograshi_aioseo_notifications |
| prograshi_aioseo_posts |
| prograshi_bwt_failed_submissions |
| prograshi_bwt_passed_submissions |
| prograshi_commentmeta |
| prograshi_comments |
| prograshi_ewwwio_images |
| prograshi_ewwwio_queue |
| prograshi_links |
| prograshi_options |
| prograshi_postmeta |
| prograshi_posts |
| prograshi_siteguard_history |
| prograshi_siteguard_login |
| prograshi_term_relationships |
| prograshi_term_taxonomy |
| prograshi_termmeta |
| prograshi_terms |
| prograshi_usermeta |
| prograshi_users |
| prograshi_wpforms_tasks_meta |
| prograshi_wpmailsmtp_debug_events |
| prograshi_wpmailsmtp_tasks_meta |
+-----------------------------------+
28 rows in set (0.00 sec)
サイトのURLを確認する
まずは、xxx_optionsテーブルのカラム一覧を確認します。
show columns from xxx_options;
xxx_optionsテーブルの中のoption_valueカラムの中で「http」から始まる内容のみを抽出します。
select option_value from xxx_options where option_value like 'http%';
すると、以下のように本番環境のドメインが表示されます。
+----------------------------+
| option_value |
+----------------------------+
| https://本番環境のドメイン |
| https://本番環境のドメイン |
| http://rpc.pingomatic.com/ |
| https://本番環境のドメイン |
+----------------------------+
実例
mysql> show columns from prograshi_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| option_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| option_name | varchar(191) | NO | UNI | | |
| option_value | longtext | NO | | NULL | |
| autoload | varchar(20) | NO | MUL | yes | |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> select option_value from prograshi_options where option_value like 'http%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 21
Current database: wp_db
+----------------------------------+
| option_value |
+----------------------------------+
| https://https://prograshi.com |
| https://https://prograshi.com |
| http://rpc.pingomatic.com/ |
| https://https://prograshi.com |
+----------------------------------+
4 rows in set (0.03 sec)
mysql>
xxx_optionsテーブルのoption_valueカラムの書き換え
xxx_optionsテーブルのoption_valueカラムを書き換えるには以下のコマンドを実行します。
update `xxx_options` set option_value=replace (option_value,'http://本番環境のドメイン','http://localhost:ポート番号');
update `xxx_options` set option_value=replace (option_value,'https://本番環境のドメイン','http://localhost:ポート番号');
接頭語の「xxx」を自分のMySQLのテーブル名に変更し、「本番環境のドメイン」と「http://localhost:ポート番号」を適宜設定してください。
「ポート番号」はDockerで指定したホスト側(自分のPC側)のポート番号です。
実例
mysql> update `prograshi_options` set option_value=replace (option_value,'https://prograshi.com','http://localhost:10092');
Query OK, 0 rows affected (0.00 sec)
Rows matched: 364 Changed: 0 Warnings: 0
mysql> update `prograshi_options` set option_value=replace (option_value,'https://prograshi.com','http://localhost:10092');
Query OK, 6 rows affected (0.07 sec)
Rows matched: 364 Changed: 6 Warnings: 0
xxx_postsテーブルのguidカラムと、post_contentカラムの書き換え
xxx_postsテーブルのguidカラムと、post_contentカラムを書き換えるには以下のコマンドを実行します。
update `xxx_posts` set guid=replace (guid,'http://本番環境のドメイン','http://localhost:ポート番号');
update `xxx_posts` set guid=replace (guid,'https://本番環境のドメイン','http://localhost:ポート番号');
update `xxx_posts` set post_content=replace (post_content,'http://本番環境のドメイン','http://localhost:ポート番号');
update `xxx_posts` set post_content=replace (post_content,'https://本番環境のドメイン','http://localhost:ポート番号');
接頭語の「xxx」を自分のMySQLのテーブル名に変更し、「本番環境のドメイン」と「http://localhost:ポート番号」を適宜設定してください。
「ポート番号」はDockerで指定したホスト側(自分のPC側)のポート番号です。
実例
mysql> update `prograshi_posts` set guid=replace (guid,'https://prograshi.com','http://localhost:10092');
date `prograshi_posts` set guid=replace (guid,'https://prograshi.com','http://localhost:10092');
updaQuery OK, 145 rows affected (0.03 sec)
Rows matched: 372 Changed: 145 Warnings: 0
te `prograshi_posts` set post_content=replace (post_cmysql> update `prograshi_posts` set guid=replace (guid,'https://prograshi.com','http://localhost:10092');
ontent,'https://prograshi.com','http://localhost:10092');
update `prograshi_posts` set post_content=Query OK, 227 rows affected (0.02 sec)
Rows matched: 372 Changed: 227 Warnings: 0
mysql> update `prograshi_posts` set post_content=replace (post_content,'https://prograshi.com','http://localhost:10092');
replace (post_content,'https://prograshi.com','http://localhost:10092');Query OK, 94 rows affected (0.03 sec)
Rows matched: 372 Changed: 94 Warnings: 0
mysql> update `prograshi_posts` set post_content=replace (post_content,'https://prograshi.com','http://localhost:10092');
Query OK, 83 rows affected (0.04 sec)
Rows matched: 372 Changed: 83 Warnings: 0
xxx_postmetaテーブルのmeta_valueカラムの書き換え
xxx_postmetaテーブルのmeta_valueカラムを書き換えるには以下のコマンドを実行します。
update `xxx_postmeta` set meta_value=replace (meta_value,'http://本番環境のドメイン','http://localhost:ポート番号');
update `xxx_postmeta` set meta_value=replace (meta_value,'https://本番環境のドメイン','http://localhost:ポート番号');
接頭語の「xxx」を自分のMySQLのテーブル名に変更し、「本番環境のドメイン」と「http://localhost:ポート番号」を適宜設定してください。
「ポート番号」はDockerで指定したホスト側(自分のPC側)のポート番号です。
実例
mysql> update `prograshi_postmeta` set meta_value=replace (meta_value,'https://prograshi.com','http://localhost:10092');
ue=replace (meta_value,'https://prograshi.com','Query OK, 0 rows affected (0.02 sec)
Rows matched: 597 Changed: 0 Warnings: 0
mysql> update `prograshi_postmeta` set meta_value=replace (meta_value,'https://prograshi.com','http://localhost:10092');
Query OK, 1 row affected (0.01 sec)
Rows matched: 597 Changed: 1 Warnings: 0
以上で移管処理は完了です。
ブラウザで確認する
サイトを開く
ブラウザにローカル環境のURLを入力し、正常に表示されるか確認します。
URLはDockerで指定したものです。
例えばdocker-compose.ymlが以下のようになっている場合は「localhost:10090」とします。
wordpress:
image: wordpress:latest
container_name: wordpress
depends_on:
- db
ports:
- "10090:80"
管理画面を開く
通常のサイトと合わせて管理画面( /wp-admin/ )が正しく表示されるかも確認します。
ブラウザの表示例
どちらも無事表示されれば完了です。
トップページ以外は404(Not Fount)になる場合
トップページは正しく表示されるものの、リンクをクリックすると、他のページが404(Not Found)となることがあります。
これは、Wordpressのパーマリンクの設定が上手く読み込まれていないことが原因であることがほとんどです。
管理画面左メニューの「設定」→「パーマリンク設定」を選択し、何も変更せずに、一番下の「変更を保存」をクリクすれば直ります。
これでページをリロードすれば、たいていの場合は正しく表示されます。
これでも改善しない場合は、.htaccessで転送処理がかかっているなど本番環境の設定を引き継いでいる可能性があります。