DockerコンテナにWordPressを移行した

もともとIDCFクラウドでWordPressを組んでいたが、IDCFクラウドさんが個人ユーザー（個人事業主を除く）は使えなくするというので、真面目に別のサービス動かしているVPS（sakura）に移行しようという流れ。
[個人向けサービス提供の終了を受け取りました。どのような対応をすればよいですか。IDCFクラウド](https://www.faq.idcf.jp/app/answers/detail/a_id/944/c/12)
他にもっといいVPS借りてるのに年間6000円も払ってWordPressだけのサーバーもどうなんだろうとは思っていたよ。
（もともとはIDCFが開発サーバーだったが、触らなくなったのでIDCFにWordPressを入れた）

sakuraのVPSはPHP5.6で動いており、最新WordPressは7系必須のため、DockerでPHP7を乗っけて動かしてみようという感じです。
さすがにほぼ死んでいるとはいえ複数サービス動いているところでいきなりPHP7に上げる勇気はない。
似たようなことをしている人がいてハマったときの参考になればと。

構成としてはDockerでDBサーバーとPHPのサーバーを分けています
PHPのサーバーは8080でつなぐと出るようにし、おおもとのsakuraサーバーからリバースプロキシで特定のドメインに来た際には8080のものを表示するような流れです
VPSはUbuntu14.04で稼働済み
DockerはUbuntu18.04で作成

![kousei.png](https://qiita-image-store.s3.amazonaws.com/0/140947/5b409018-00b3-b631-75d3-8f91329ee3ec.png)


### Dockerのインストール（VPS）
公式ドキュメントを参考にすればよい

https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-repository
https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d

```sh
$ sudo apt-get update
$ sudo apt-get install \
       apt-transport-https \
       ca-certificates \
       curl \
       software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ arch
x86_64
# この結果によって下記のコマンドは変わる
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get install docker-ce
```
### DockerPHPサーバーの作成
今回はDockerfileとかは作らず手動で作成しています。
DBとつなげられるように（コンテナ間で接続できるように）ネットワークの設定も入れます
名前は適当。8080ポートで受けます。

```sh
$ sudo docker network create db
$ sudo docker run --name=php1 -p 8080:80 --net=db -it ubuntu:18.04 bash
```

ここからDockerコンテナ（php1）内

```sh
$ apt-get update
$ apt-get install -y software-properties-common
$ add-apt-repository ppa:ondrej/php
$ apt-get update

$ apt-get install -y git vim
$ apt-get install -y php7.3
#ここで地域(Asia/Tokyo)をきかれます
$ apt-get install -y nginx
$ apt-get install -y php7.3-curl php7.3-gd php7.3-mbstring php7.3-zip php7.3-mysql php7.3-xml php7.3-fpm
$ apt-get install -y mysql-client

必要に応じてnginxとかfpm周りの設定

service nginx restart
service php7.3-fpm restart
```

ここでサーバーに対して8080ポートでアクセスすればサーバーのデフォルトの画面が出ると思います（サーバーが8080を外から受け付けていれば）
もしくはVPSサーバー側から

```sh
$ curl http://localhost:8080
```

で取得されていれば、外から受け付けられる必要はありません。

### DockerDBサーバーの作成

MariaDBで立てています
ポートを8306で見られるようにしていますが、php1からは直接3306でつなげるため実際は不要です
（今後のために入れて見ただけ）

```sh
$ sudo docker run --name=mariadb -p 8306:3306 --net=db -it ubuntu:18.04 bash
```

ここからDockerコンテナ（mariadb）内

```sh
$ apt-get -y update
$ apt-get install -y wget gnupg curl sudo vim
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
$ apt-get -y update
$ apt-get -y upgrade
$ apt-get install -y mariadb-server
```

MariaDBはデフォルトだと外からの接続を受け付けていないようなので、受け付けるようにします
https://casualdevelopers.com/tech-tips/how-to-fix-2003-error-when-connecting-to-mysql-server/

```
$ vim /etc/mysql/my.cnf

bind-address            = 0.0.0.0
```

これでphp1からはmariadbというホスト名で接続できます

### リバースプロキシの設定（VPS）

nginxでリバースプロキシを設定します（nginxはすでに入っている前提）
443のほうがそうです。
ここでhttpsをはじめから設定したので後で少々はまります。http側に設定して、後からhttpsに変えたほうが確実です。

```nginx
server {
    listen 80;
    server_name YOUR_DOMAIN;
    return 301 https://YOUR_DOMAIN$request_uri;
}
server {
  listen 443 ssl;
  server_name YOUR_DOMAIN;

  ssl_certificate /hogehoge/fullchain.pem;
  ssl_certificate_key /hogehoge/privkey.pem;

  location / {
    proxy_pass http://localhost:8080;
    proxy_redirect off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
  }
}
```

### HTTPSの設定1（VPS）
もともと別サーバーで動かしており、
今使っているlet's Encryptを実行するには外からアクセスできる状態じゃないといけない
そのためDNSを設定していない状態だと作成しようがないので、ひとまず既存サーバーの鍵をそのまま持ってくる

### 接続確認
さきほどは8080で確認しましたが、外からちゃんとアクセスできるか確認します。

hostsをVPSのサーバーIPアドレスと、YOUR_DOMAINで指定しておき、
YOUR_DOMAINトップに行き、Docker側のデフォルトページが出ればOK
nginx入れたのにapacheの出てビックリする（/var/www/htmlに自動作成されていた模様）

### WordPressを動かす（php1）

ここはWordPress構築と同じです

- DBの設定
- WordPressのファイルを持っていく
- 適切なパーミッション・所有者設定
- トップに飛んでWordPressの初期設定

ここでHTTPSにしてたらCSS,JSなどが読み込まれず崩れまくりました。
設定においてJSで動作させないといけないところはないので、何とかなるのですが

### WordPressの移行（php1）

これに従いました
https://techacademy.jp/magazine/7859
テーマはファイルごと持って行ったのでそれを適用するだけで、オフィシャルっぽいプラグインを利用

1. 前のサーバーでエクスポート
1. 新サーバーでインポート（記事情報のXMLなのでメディアファイル自体はここでは入らない）
1. メディアの取得（インポート後取得するか聞かれる）
1. プラグインの設定

プラグインがたくさんあるとかだと、まとめて移行ツール（上記記事参照）のほうが良いと思います

### HTTPSの設定2（VPS）
おそらく1のタイミングではなくて、ここでHTTPSの設定をしたほうが良いと思います

### 動作確認→公開

WordPressが正しく動くかの確認です。
問題なければ、あたらしく構築したほうにDNSを向けます

### Let's Encryptの設定（VPS）

コピペして持ってきたものなので、このサーバーから生成するようにします。
といってもこの記事の主旨とは異なるので基本は省略
https://letsencrypt.jp/

ただ、80ポートにアクセスしてごにょごにょやっているため、以下のようにnginxのconfの80ポートの部分を以下のように書き変える

```nginx
server {
    listen 80;
    server_name YOUR_DOMAIN;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/blog;
    }
    location / {
        return 301 https://YOUR_DOMAIN$request_uri;
    }
}
```