Docker応用チュートリアル：WordPress

## 概要

Docker Compose を使い、WordPress を実行します。

## 0. 用語説明とセットアップ

`Docker Compose`(コンポーズ)は、複数のコンテナを使うアプリケーションを、定義・実行するツールです。

Docker Compose のセットアップは、root 権限で次のコマンドを実行します。

```sh
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

実行後、バージョン番号が表示されるのを確認します。

```console
$ docker-compose version
docker-compose version 1.13.0, build 1719ceb
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
```

## 1. docker-compose.yml ファイルの準備

Docker Compose は、 `docker-compose.yml` という名称の YAML 形式のファイルを通し、サービス（コンテナ）を定義します。どのようなイメージを元に実行するか、どのポートを使うか、あるいは、ボリュームやネットワークを定義できます。

まず、作業用ディレクトリを作成し、移動します。

```console
$ mkdir wordpress
$ cd wordpress
```

エディタを開き `docker-compose.yml` ファイルを作成します。このファイルは「プロジェクトの定義ファイル」とも呼びます。Docker Compose では、デフォルトでディレクトリ名（この例では `wordpress` ）が該当します（`-p` オプションを指定し、ディレクトリ名以外にも変更できます）。

```console
$ vi docker-compose.yml
```

ファイルの中身は次のようにします。

```yaml
version: '3.1'

services:

  wordpress:
    image: wordpress
    ports:
      - 80:80
    environment:
      WORDPRESS_DB_PASSWORD: example

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
```

ここではサービス(services)として `wordpress` と `mysql` の２つのコンテナを定義しています。

## 2. 必要なイメージのダウンロード

`docker-compose pull` を実行すると、`docker-compose.yml` に含まれるサービスが必要なイメージを一括ダウンロードします。

```console
$ docker-compose pull
```

`docker images` コマンドを実行すると、必要なイメージがダウンロードされているのが分かります。

```console
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           latest              ca96afcfa242        7 days ago          406MB
mysql               5.7                 e799c7f9ae9c        2 weeks ago         407MB
```


## 3. WordPress の実行

サービスを実行するには `docker-compose up -d` コマンドを実行します。`up` は `docker-compose.yml` ファイルに記述している全てのサービスを起動し、`-d` はデタッチド・モード（バックグラウンドで実行）します。

まず `mysql` サービスのみ実行します。

```console
$ docker-compose up -d mysql
Creating network "wordpress_default" with the default driver
Creating wordpress_mysql_1 ...
Creating wordpress_mysql_1 ... done
```

サービスが稼働しているかどうかは `docker-compose ps` コマンドで確認します。

```console
$ docker-compose ps
      Name                    Command             State    Ports
------------------------------------------------------------------
wordpress_mysql_1   docker-entrypoint.sh mysqld   Up      3306/tcp
```

`Up` であれば、正常起動しています。

ログ（標準出力）を `docker-compose logs -f` コマンドで確認します。特にエラーがなければ `Ctrl-C` を入力して、中断します。

MySQL の起動を確認した後、WordPress コンテナを起動します（WordPressコンテナは、MySQL データベースに接続できないと起動中止してしまうため、あえてこの手順にしています）。

```console
$ docker-compose up -d
wordpress_mysql_1 is up-to-date
Creating wordpress_wordpress_1 ...
Creating wordpress_wordpress_1 ... done
```

そして、サービスの稼働状況を確認します。

```console
$ docker-compose  ps
        Name                       Command               State          Ports
-------------------------------------------------------------------------------------
wordpress_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp
```

`Wordpress` コンテナのログを確認し、正常起動していることを確認します。

```console
$ docker-compose logs -f wordpress
Attaching to wordpress_wordpress_1
(省略)
wordpress_1  | [Thu May 25 04:32:07.734697 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
```

ブラウザから `http://<IPアドレス>/` にアクセスし、WordPress の画面が表示されるのを確認します。


## 4. WordPress の停止と再起動

停止は `docker-compose stop` です。

```console
$ docker-compose stop
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_mysql_1 ... done
$ docker-compose ps
        Name                       Command               State    Ports
-----------------------------------------------------------------------
wordpress_mysql_1       docker-entrypoint.sh mysqld      Exit 0
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Exit 0
```

再起動するには、実行中であれば `docker-compose restart`、今回のように停止中であれば `docker-compose start` を実行します。

```console
$ docker-compose start
Starting mysql ... done
Starting wordpress ... done
$ docker-compose ps
        Name                       Command               State          Ports
-------------------------------------------------------------------------------------
wordpress_mysql_1       docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp
```

## 5. WordPress の削除

サービスを削除（使用していたコンテナの削除）は `docker-compose rm` または `docker-compose down` です。

```console
$ docker-compose down
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_mysql_1 ... done
Removing wordpress_wordpress_1 ... done
Removing wordpress_mysql_1 ... done
Removing network wordpress_default
```

```console
$ docker-compose ps
Name   Command   State   Ports
------------------------------
```