docker-composeで構築した最新のwordpress環境に旧環境から移行した

# やりたいこと

* docker-composeを使って、Web3層(nginx+wordpress+mariadb)環境を構築する。
* 古いバージョンのバックアップファイルを使って新環境へリストア方法を明確化する。(DBダンプファイルや、Wordpressの設定関連ファイルなど直接)
* 構築している環境の設定やミドルウェアバージョンなども明確化して、すぐ改善できるようにしたい

# 環境
* CentOS 7.3
* nginx 1.17
* PHP 7.3
* Wordpress 5.2.2
* mariadb 10.4.7

# 環境構築
今回はdockerおよびdocker-composeを使って環境を構築していくので、
まだインストールしていない人は下記公式サイトを参考に構築してください。
※[Docker のインストール](http://docs.docker.jp/engine/installation/index.html)
※[Docker Compose のインストール](http://docs.docker.jp/compose/install.html)

## ディレクトリ構成
環境構築のためのディレクトリは以下の構成です。

```
/[任意の作業ディレクトリ]
　├ docker-compose.yml
　├ initdb.d/
　├ logs/　　　　　　
　├ mariadb/
　│ 　└ db-data/
　├ nginx/
　│ 　├ wordpress.conf
　│ 　└ Dockerfile
　└ wordpress/

```
各ファイルやフォルダの説明は以下になります。

```
・docker-compose.yml ・・・今回構築するための設定情報を記載したファイル。この設定に従って環境が構築されます。
・initdb.d/・・・初期構築用バックアップDBデータ(SQLファイル)格納場所です。ここにSQLを配置しておくだけで、自動的にそのデータを初期データとして入れ込んでくれます。
・logs/・・・各種ログファイルを格納します。
・mariadb/・・・wordpressのDBデータを格納しています。
・nginx/・・・nginxの設定ファイルおよびnginxコンテナ作成のためのDockerfileを格納しています。
・wordpress/・・・wordpressアプリケーションのファイル類を格納しています。
```

## composeファイルの作成
環境構築に使った`docker-compose.yml`の例は以下になります。

```
version: '3.7'
 
services:
    # Webサーバ
    nginx:
        build:
            context: ./
            dockerfile: ./nginx/Dockerfile
        container_name: nginx
        ports:
            - '80:80'
        volumes:
            - ./nginx/:/etc/nginx/conf.d/
            - ./logs/nginx:/var/log/nginx
            - ./wordpress:/var/www/html
        restart: always
        environment:
          TZ: Asia/Tokyo
        depends_on:
          - wordpress

    # Wordpress本体
    wordpress:
        image: wordpress:5.2.2-php7.3-fpm
        container_name: wordpress
        expose:
            - '9000'
        volumes:
            - ./wordpress:/var/www/html
        restart: always
        environment:
            WORDPRESS_DB_HOST: {WORDPRESS_DB_HOST}
            WORDPRESS_DB_USER: {WORDPRESS_DB_USER}
            WORDPRESS_DB_PASSWORD: {WORDPRESS_DB_PASSWORD}
            WORDPRESS_DB_NAME: {WORDPRESS_DB_NAME}
            TZ: Asia/Tokyo
        links:
            - mysql

    # DBサーバ
    mysql:
        image: mariadb:10.4.7
        container_name: mariadb
        volumes:
            - ./mariadb/db-data:/var/lib/mysql
            - ./initdb.d:/docker-entrypoint-initdb.d
        ports:
            - '3306'
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: {MYSQL_ROOT_PASSWORD}
            MYSQL_USER: {MYSQL_USER}
            MYSQL_PASSWORD: {MYSQL_PASSWORD}
            MYSQL_DATABASE: {MYSQL_DATABASE}
            TZ: Asia/Tokyo

volumes:
    nginx:
    wordpress:
    mysql:
```
※container_nameや、environmentの各パラメータは環境に応じて適宜任意の値に変更してください。

■補足説明

* nginx:
    * [build:]の項目では、docker-hubにある公式イメージに少し設定を加えたかったので、dockerfileを使って今回の環境専用のイメージを作成しています。詳細は後述
* wordpress:
    * [image:]の項目では、wordpressのイメージにはデフォルトでApacheが入っているものもあるが、nginxを別に立てるのでapache無しのイメージ(fpm版)を選択しました。[ここ](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)を参考にしました。
    * [volumes:]の項目では、dockerに格納されている5.2.2の一部ファイルをリストア時には更新する必要があるため、ローカルとマウントして、操作できるようにしています。
    * [environment:]の項目では、接続するmariadbの認証情報などを記載しています。この内容は、mariadbの設定と合わせてください。また、記載内容も適宜修正してください。また、構築環境にPROXYが設定されている場合は、[ここ](https://qiita.com/euxn23/items/83852da65151dc194335)を参考にPROXY設定をしてください。
* mariadb:
    * [environment:]の項目では、構築するdbの情報を記載しています。

## nginx設定
nginx環境構築のために、以下の設定ファイルを作成しました。

dockerfile：

```Dockerfile
FROM nginx:1.17

COPY nginx/wordpress.conf /etc/nginx/conf.d/wordpress.conf

CMD ["nginx", "-g", "daemon off;"]
```
■補足説明

* FROMで、元となるnginxのバージョンを指定
* COPYで、wordpress用の設定ファイルをコピー
* CMDで、nginxをバックグラウンドで起動させるためにdaemonを切る。[参考](http://yinm.hatenadiary.jp/entry/2017/05/04/220439)

wordpress.conf

```
server {
    listen 80;
    server_name _;

    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```

## コマンドでdocker環境を起動

ディレクトリ配下に各ファイル等の格納が完了したら、`docker-compose.ymlファイルのある場所で`、下記docker-composeコマンドを実行し、環境を構築します。
起動コマンド：`docker-compose up -d --build`
起動ログでや、`docker ps`コマンドなどで、エラー無く正常に起動していることを確認したら、ブラウザからアクセスできることを確認します。
初期構築は以上です。

続いて、旧環境からの移行(バックアップファイルからのリストア)の方法を説明します。

# 旧環境データの移行方法

Wordpressからの移行方法は多々(プラグインを使ったり、import/exportを使ったり)ありますが、今回は「DBダンプファイルや、旧環境の設定ファイルを使った」移行を行います。

## 移行対象コンテンツのバックアップ

必要なファイルのバックアップを作成します。対象は以下になります。

* コンテンツ
    * WordPressコンテンツルートフォルダ直下にある「wp-content」フォルダ一式をコピーします。
* 設定ファイル
    * WordPressコンテンツルートフォルダ直下にある「wp-config.php」ファイルをコピーします。※docker-compose.ymlに旧環境と同じ設定を記載している場合は不要
* DBデータ
    * 利用しているDBに合わせて、ダンプファイルを作成します。

## リストア処理

移行元環境からバックアップしたファイルを、最新環境にリストアします。

* コンテンツ
    * 移行元の「wp-content」フォルダ一式で上書きします。
* 設定ファイル
    * 移行元の「wp-config.php」ファイルで上書きします。※docker-compose.ymlに旧環境と同じ設定を記載している場合は不要
* DBデータ
    * docker環境起動中の場合：`docker cp`コマンドを利用し、DBコンテナ内にダンプファイルをコピーして、`docker exec`コマンドでコンテナにアクセスし、ダンプファイルからSQLを流し込みます
    * docker環境起動前：`initdb.d`ディレクトリにダンプファイルを格納し、docker環境を構築。

正常なブラウザアクセスや、管理画面へのログイン、コンテンツ不備有無など必要な確認をしてみてください。

以上で旧バージョン環境から、最新環境への移行は完了です。
お疲れ様でした。


# 参考
* [Docker: Nginxを使ったWordPress開発環境の構築方法](https://keruuweb.com/docker-how-to-build-wordpress-development-environment-using-nginx/)
* [nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)
* [PROXY 環境下でdocker-compose を実行する](https://qiita.com/euxn23/items/83852da65151dc194335)
* [Docker nginxのコンテナすぐに終了してしまう現象](http://yinm.hatenadiary.jp/entry/2017/05/04/220439)