リモートサーバーのWordPressをローカル(自分のPC)のDockerに移管する方法を実例で解説|コマンドライン(mysqlとmysqldump)

wordpress-prograshi(プロぐらし)-kv WordPress
記事内に広告が含まれていることがあります。

リモートサーバー上(本番環境)で運用・公開しているWordpressを、自分のPCの中のDocker上に構築したWordpressに移管する方法についてまとめています。

なお、自分のPC上にDockerを使ってWordpressを構築する方法については下記をご参照ください。

【初心者向け】Dockerを使って超簡単にWordPressをローカル環境に構築する方法


参考

ここではコマンドラインを使ってMySQLの内容をバックアップ&インポートする方法で解説していますが、コマンドラインではなく、phpMyAdminを使って移管することもできます。

phpMyAdminを使う方法については下記をご参考ください。

(参考)本番環境のWordPressをローカル環境に移行する方法。エラー・ページが表示されない・上手く行かない時の確認ポイントと注意点


WordPressのディレクトリをまるごとコピーする

リモートサーバー上の移管したいWordpressのディレクトリをまるごとコピーして、ローカルに持ってきます。

コピーしてくる方法は様々で、FTP(S)ソフトや、WebDAV、Githubのレポジトリにプッシュしてクローンするなどなんでもいいです。

参考

リモートサーバーのディレクトリの中身をコピーしてくる方法については下記をご参考ください。(個人的にはWebDAVがとても簡単なのでお勧めです)

WebDAVを使う場合

【超簡単】WebDAVを使ってレンタルサーバーのディレクトリをローカルのフォルダ(エクスプローラー)に表示する方法


FTPソフトを使う場合

FTPソフトのWinSCPの使い方は以下をご参考ください。

【画像で解説】WinSCPの使い方。無料FTPソフトでサーバーと接続しファイルをダウンロード・アップロードする方法


Githubを使う場合

リモートサーバーからGithubにSSH接続でアクセスする方法は以下をご参考ください。SSH接続ができたら、git pushでリモートサーバーの内容をGithubのレポジトリにプッシュできます。あとはそれをクローンすれば完了です。

【初心者向け】秘密鍵と公開鍵を作成して、Githubに登録しSSH接続する方法を実例で解説

【Git】git clone(クローン)とは何か?使い方を実例で解説



ごっそり丸ごととってきて、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
注意点

Git管理している場合は、修正後の.htaccessをGithubの本番用ブランチにプッシュしないように注意してください。意図的にGit管理から外すことも可能です。詳細は下記をご参考ください。

【Git】.gitignoreできないファイル無視する方法を実例で解説|update-index –assume-unchangedと–skip-worktreeとは何か?


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' );
point

ここではdocker-compose.ymlの内容に合わせてwp-config.phpの内容を変更しましたが、wp-config.phpの内容に合わせて、docker-compose.ymlのMySQLの情報を修正することも可能です。

こうした場合、config.phpの内容はリモートサーバーの内容と全く同じものになります。


リモートサーバーの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_」がつくテーブルのみがダンプの対象となります。

合わせて読みたい

上記のパターンマッチングで対象となるテーブルのみのダンプファイルを生成するコマンドの詳細については下記をご参考ください。

MySQLで複数のテーブルをパターンマッチングでダンプ(dump)/バックアップする方法



ダンプファイルをインポートする

バックアップ用のダンプファイル(~.sql)が生成できたら、これをDocker内のMySQLコンテナ内のデータベースにインポートします。


事前準備

Docker内のMySQLコンテナ内のデータベースにインポートする前に以下の2つが前提となります。

  1. 「docker-compose up」コマンドなどで、MySQLのコンテナを起動しておく。
  2. ダンプファイル(~.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"であれば動作します。

(参考)docker公式 docker exec


mysql <データベース名> -u <ユーザー名> -p<パスワード>’ <ダンプファイル名>.sql

「-c」オプションの後ろに記述したコマンドが、mysqlの指定したデータベースに対象のダンプファイル(バックアップファイル)をインポートする処理です。

mysql -u <ユーザー名> -p<パスワード> <データベース名> < <インポートするファイル名>.sql
注意点
  1. インポートするファイル(.sql)の前に記述するのは「<」です。
  2. 「-p」オプションの後ろにパスワードを記述するときは半角スペースは不要です。


実例

ダンプファイルの生成

リモートサーバーにアクセスして「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"


書き換えの必要があるテーブルとカラム

書き換えの必要があるのは以下のテーブルとカラムです。

書き換えの必要があるテーブルとカラム
  1. xxx_optionsテーブルのoption_valueカラム。
  2. xxx_postsテーブルのguidカラムと、post_contentカラム。
  3. xxx_postmetaテーブルのmeta_valueカラム。

テーブル名冒頭の「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で転送処理がかかっているなど本番環境の設定を引き継いでいる可能性があります。


タイトルとURLをコピーしました