WordPress 5.0+PHP7.2+MySQL5.7の動作環境Docker Composeで雑に試すには

# 概要

Docker Compose を使って、WordPress 5.0 の環境を素早く構築し（所要時間数分）、スムーズな動作確認や検証を行えるようにします。

# 背景

[WordPress](https://ja.wordpress.org/) の最新版 [WordPress 5.0 "Bebo"が2018年12月6日にリリース](https://wordpress.org/news/2018/12/bebo/)されました。新しいバージョンがリリースされたため、おそらく様々な企業・団体・個人において、変更箇所の確認や、動作確認、手順書の見直し、検証等が行われているものと予想されます。しかしながら、純粋にWordPressそのものの挙動を確認したい場合、ゼロからサーバを準備し、Apache、PHP、MySQL(mariadb)などをセットアップするのは手間がかかります。

Docker Composeを使えば、コマンド一つ（`docker-compose up`）で下図のような環境を自動構築・実行できるようにします。以下は WordPress および MySQL の公式 Docker イメージを使って、環境を構築する手順です。


![compose-fix.png](https://qiita-image-store.s3.amazonaws.com/0/13002/16ca9656-7bf6-8ff3-7883-d19da78526a9.png)


# 手順

## 1. Docker および Docker Compose セットアップ(Linux)

既に持っている場合は省略できます。

以下手順は Linux を想定していますが、macOS および Windows の場合は Docker for Mac および Docker for Windows をセットアップすると、Docker 本体(Docker Engineと `docker` CLI ）および Docker Oompose（ `docker-compose` CLI ）が自動的にセットアップされています。

### Docker のセットアップ

CentOS 7、最近の Debian や Ubuntu、Fedora では以下のコマンドを実行すると Docker Engine CE(Community Edigiton)の最新安定版を自動セットアップします。

```
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh ./get-docker.sh
```

CentOS 7 であれば、次のコマンドも実行しておきます。

```
# systemctl enable docker && systemctl start docker
```

systemd の設定で、サーバのブート時に Docker Engine の起動を有効にしつつ、さらに Docker を起動します。

正常に動作しているかどうかは、`docker version` コマンドを実行し、 `SERVER:` 以降が表示されるかどうか確認します。Docker Engineが起動していなければ、バージョンを返せません。以下は正常な例です。

```
# docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:22 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:19:08 2018
  OS/Arch:          linux/amd64
  Experimental:     false
  
```

### Docker Compose のセットアップ

Docker Compose は `docker-compose` という名称の CLI が必要です。これが Docker のコマンドライン・ツールとして Docker Engine と通信し、複数の Docker コンテナやネットワーク、ボリュームを、プロジェクトと呼ばれる単位でまとめて管理できます。

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

動作確認は、バージョン番号が表示されるかどうか確認しておきます。（Composeのバージョンによっては Compose ファイル形式のバージョンが異なり、同じ設定ファイルでも挙動が異なる場合が有り得ます。動作時には一応気に留める必要があります）

```
# docker-compose version
docker-compose version 1.23.1, build b02f1306
docker-py version: 3.5.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f  25 May 2017
```


## 2. プロジェクト用ディレクトリの作成と移動

```
$ mkdir wp5
$ cd wp5
```

ここでは `wp5` という名前のディレクトリを作成し、移動しました。Docker Compose でプロジェクト（コンテナ、ネットワーク、ボリュームを扱う範囲です）を扱うには、まず何らかのディレクトリを用意します。

## 3. Composeファイルの設置

ファイル名称 `docker-compose.yml` として、以下の Docker Compose 用ファイル（以下 Compose ファイル）を作成します。

```YAML
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
```

この例では、ホスト側のポート `8080` に対し、コンテナ内のポート `80` の割り当て（マッピング）をしています。

## 4. プロジェクトを起動します。

```
$ docker-compose up -d
```

## 5. ブラウザからアクセスします

`http://<ip>:8080/`

あとは、WordPress を操作可能です。言語の選択→管理画面のパスワード設定へと進みます（データベースに接続するための wp_config.php が自動作成されるため、データベース関連の設定は自動的に省略されています。MySQL のパスワードを確認するには docker-compose logs で `GENERATED ROOT PASSWORD:` と表示されている行を探します。これは今回はランダムなパスワードを自動生成するオプションをMySQLコンテナに対して有効にしているからです）。

今回は `8080` を割り当てていますが、ホスト側ではポートの重複はできませんので、もし重複するようであれば別ポートの指定が必要です。以下はホスト側でポート `9000` を使う例です。

```
    ports:
      - 9000:80
```

あるいは、ホスト側のポート `80` が空いていれば、そちらに割り当ても可能です。

```
    ports:
      - 80:80
```


## 6. 一時的な停止・再開

動いているものを停止するには、次のようにします。

```
$ docker-compose stop
```

再開は、つぎのようにします。

```
$ docker-compose start
```

## 7. 削除

```
$ docker-compose down -v
```

`-v` をつけ、今回の WordPress 用のコンテナ、ネットワーク、ボリュームを削除します。削除したデータは復旧できませんので、必要に応じて事前にバックアップ等をおとりください。

もし `-v` を付けて残ったままになれば、`docker volume prune` か `docker system prune --volume` で、あとから削除もできます。


# 参考

- library/wordpress - Docker Hub
  - https://hub.docker.com/_/wordpress/
- library/mysql - Docker Hub
  - https://hub.docker.com/_/mysql/