Docker + nginx-proxy + PHP7 on Apache + MySQL5.7 で WordPress の環境を作る　その2


[前回（その1）](http://qiita.com/ABE_TAKASHI/items/f0cd899fd7ac2cc9b5a0)からの続きです。

# ドメインをDNSに登録する

さて、その1までの作業でWordPressを立ち上げる準備はできているのですが、nginx-proxy を使ってドメインでアクセスできるようにするには、DNSにドメインとAレコードを登録する必要があります。私は AWS の EC2 上に Docker の環境があり、同じく AWS の Route53 で DNSレコードの管理を行っています。ということで、ここでは wp.XXXXXXX.org というサブドメインがついた形式で wordpress にアクセスができるように、Route53で設定を行います。基本的には、以下のような設定だけです。

![010.png](https://qiita-image-store.s3.amazonaws.com/0/104477/45d0b310-0b33-e9fa-b94c-64957db6d054.png)

あまり説明する必要もないと思いますが、DockerのホストのIPアドレスをAレコードとして登録しているだけです。ローカルの開発環境などで試している方は hostsファイル に記載するなどで同様のことができると思います。これで `http://wp.XXXXXXX.org/` にアクセスしてWordPressが表示できるようにします。

# Docker Compose を使って WordPressを立ち上げる

ようやく WordPress を立ち上げる段階となりますが、データの永続化やポータビリティを考慮すると最低でも3つのコンテナを立ち上げる必要があります。

WordPressコンテナ
MySQLコンテナ
データコンテナ（WordPressプログラム/リソースおよびMySQLデータ共用）

これらを一つ一つ立ち上げたりするのは面倒なので、Docker Compose を使ってまとめて管理するようにします。任意のディレクトリに docker-compose.yml というファイルを作成します。

```shell-session:
[docker-op@~]$ mkdir docker_compose_wordpress && cd docker_compose_wordpress

[docker-op@docker_compose_wordpress]$ vi docker-compose.yml
```

```yaml:docker-compose.yml
wordpress:
  image: abe-local/wordpress-php7
  volumes_from:
    - data
  ports:
    - 8080:80
  links:
    - db:mysql
  environment:
    - WORDPRESS_DB_NAME=wordpress
    - VIRTUAL_HOST=wp.XXXXXXX.org
    - TZ=Asia/Tokyo
db:
  image: mysql
  volumes_from:
    - data
  environment:
    MYSQL_ROOT_PASSWORD: --PASSWORD--

data:
  image: busybox
  volumes:
    - /var/lib/mysql
    - /var/www/html
```

ざっくり説明しますと、wordpress の image: に、その1で作成した wordpress のイメージ名を記述します。同じく wordpress の environment: に先ほどDNSに登録したドメインを記述します。これだけで nginx-proxy は向き先を正しく向けてくれます。（AWSなどの場合、nginxが受け付ける80番ポートが開いてることを確認してください）。ports: の指定は nginx-proxy があれば8080番ポートを使用してアクセスすることはないのですが、指定は必須のようですので忘れずに。

db では image: mysql とすることで、最近リリースされた最新バージョン5.7の公式イメージが落ちてきます。パスワードの指定は必須ですので忘れないようにしてください。

data というコンテナを busybox というイメージで一つ立てます。WordPress で使う /var/www/html と MySQL で使う、/var/lib/mysql をマウントするようにします。wordpress: db: ともに volumes_from: で data を指定することにより、データの永続化、ポータビリティーが保てるようになります。

さて、ここで以下のコマンドを叩けば MySQL や busybox のイメージを落としてきてから、3つのコンテナが順に立ち上がり、WordPress が無事起動するはずです。（dataコンテナについては立ち上がった後にすぐに停止しますが）

```shell-session:
[docker-op@docker_compose_wordpress]$ docker-compose up -d
（出力略）

[docker-op@docker_compose_wordpress]$ docker ps -a
（出力略：WordPress、MySQL、busybox、nginx、nginx-genの5つのプロセスが立ち上がっているはず）
```

ブラウザにて `http://wp.XXXXXXX.org` にアクセスして、以下の見慣れた画面が出れば成功です。

![011.png](https://qiita-image-store.s3.amazonaws.com/0/104477/c076c8c7-b8f9-5732-0e31-d863d39bed94.png)


# データのバックアップ、リストア

data コンテナを別に立ち上げたので、データのバックアップやリストアが容易にできます。先ほど立ち上げたdocker-compose.ymlのディレクトリに移動してから、3つのコンテナを停止し、一時的にバックアップ専用コンテナ（busybox）を立ち上げてバックアップやリストアを行います。

```shell-session:
（3コンテナの停止）
[docker-op@docker_compose_wordpress]$ docker-compose stop

（WordPressバックアップ）
[docker-op@docker_compose_wordpress]$ docker run --rm \
--volumes-from wordpress_data_1 \
-v $(pwd):/backup busybox \
tar cvf /backup/backup_html.tar /var/www/html

（MySQLバックアップ）
[docker-op@docker_compose_wordpress]$ docker run --rm \
--volumes-from wordpress_data_1 \
-v $(pwd):/backup busybox \
tar cvf /backup/backup_mysql.tar /var/lib/mysql

（WordPressリストア）
[docker-op@docker_compose_wordpress]$ docker run --rm \
--volumes-from wordpress_data_1 \
-v $(pwd):/backup busybox \
tar xvf /backup/backup_html.tar

（MySQLリストア）
[docker-op@docker_compose_wordpress]$ docker run --rm \
--volumes-from wordpress_data_1 \
-v $(pwd):/backup busybox \
tar xvf /backup/backup_mysql.tar

（3コンテナの再開）
[docker-op@docker_compose_wordpress]$ docker-compose start
```

なんか、ややこしいですよね。。。バックアップやリストアでなぜ`docker run`なのか？　とか、後半の部分とか。私も正直完全には理解してませんし、上手く書けないので他の方のエントリなどを参考ください。

[DockerとData Volume Containerのお話](http://qiita.com/kxphotographer/items/4788a25d9ebe6a434e46)

あと、これは Docker に限った話ではありませんが、tarの結合や展開はかなりCPUを使ったり、メモリを消費したりします。Dockerを使って複数の環境を入れている場合などは、この作業が他の環境に影響を及ぼすことを考慮する必要があると思います。Swapを食いつぶして全環境が無反応になったりすると泣けてしまいますので。。。

ということで、かなりごった煮の投稿となってしまいました。すいませんでした。