docker-composeでwordpress環境をサクッと構築する

## 環境
OSX El Capitan
docker Version 1.13.1 

## Docker for Macをインストールする
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

## <i class="fa fa-wordpress"></i> wordpress用のディレクトリを作る
```
好きな名前のディレクトリを作る
$ mkdir { my-wordpress-dir-name }

ディレクトリに移動する
$ cd { my-wordpress-dir-name } 
```


## docker-composeの準備をする

### docker-compose.ymlをつくる

```yaml:公式のdocker-compose.yml
version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     image: wordpress:latest
     depends_on:
       - db
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
```

### container名をつける

```
  db:
    image: mysql:5.7
    container_name: {my-container-name-db}

-略-

  wordpress:
    image: wordpress:latest
    container_name: {my-container-name}
```
上記のようにすることで任意のcontainer名がつけられる。
何も指定しないとwp_wordpress_1・wp_db_1などという名前にされてしまってわかりづらくなるので、指定するのがおすすめ。
dbとWordPressで別々のcontainerが必要になるので、dbの方は末尾に`-db`をつけるなどして区別すると良い。

同様にしてnetwork名も明示的につけると良い。

```
    networks:
      - {my_wordpress_network}
```

### 開発を行うディレクトリをcontainerに同期する
Dockerでは、ローカルPCのディレクトリをcontainer内のディレクトリに同期（マウント）できる。このときマウントされる領域を volume と呼ぶ。

ローカル環境でwordpressを編集しながらcontainerに同期させるためには、以下のように記述する。

```
    volumes:
      - "$PWD:/var/www/html"
      - "$PWD/.docker/backup:/tmp/backup"
      - "$PWD/.docker/log:/tmp/log"
```

### アクセスポートを変更する
デフォルトで`"8000:80"`になっているので、すでに`localhost:8000`を使っている場合は変更する。
ポートが重複しているとbuild時にエラーが出てbuildが止まる。
buildが途中で止まってしまったときは、妙なcontainerが出来ていたりするので<a href="#notification">下記</a>を参照にしてまっさらにしてやり直す。


### 環境変数は.envにまとめて読み込む
以下のように記述することで外部の.envファイルを読み込むようにできる。

```
    env_file: .env
```

全体のサンプルは下記。

```yaml:おれおれdocker-compose.yml
version: "2"
services:
  wordpress:
    image: wordpress:latest
    container_name: "{my-container-name}"
    volumes:
      - "$PWD:/var/www/html"
      - "$PWD/.docker/backup:/tmp/backup"
      - "$PWD/.docker/log:/tmp/log"
    ports:
      - {"my-port-number"}
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: "db:3306"
    networks:
      - {my_wordpress_network}
    env_file: .env

  db:
    image: mysql:5.7
    container_name: "{my-container-name-db}"
    volumes:
      - "db-data:/var/lib/mysql"
    networks:
      - {my_wordpress_network}
    env_file: .env

volumes:
  db-data:

networks:
  {my_lwordpress_network:}
```

```yaml:.envのサンプル
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=admin
WORDPRESS_DB_PASSWORD=pass

MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=admin
MYSQL_PASSWORD=pass
```

## docker-compose.ymlを使ってbuildする
### buildのコマンドを叩く

```
// imageを呼び出してcontainerをbuildする
$ docker-compose up -d
```

こんな感じのメッセージが出て、wordpressがbuildされる。

```
Creating network "{my-network-name}" with the default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
efd26ecc9548: Pull complete
a3ed95caeb02: Pull complete
...
Digest: sha256:34a0aca88e85f2efa5edff1cea77cf5d3147ad93545dbec99cfe705b03c520de
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
efd26ecc9548: Already exists
a3ed95caeb02: Pull complete
589a9d9a7c64: Pull complete
...
Digest: sha256:ed28506ae44d5def89075fd5c01456610cd6c64006addfe5210b8c675881aff6
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1
Creating my_wordpress_wordpress_1
```

### imageが作られたことを確認する

```
// image一覧を見る
$ docker image ls
```

<img width="637" alt="スクリーンショット 2017-02-26 4.57.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/184044d4-c183-e5e9-2258-f5b08693cea5.png">
※わたしはwordpress 4.7.2-php7.1-apacheも使っているため3つあります。

### containerが立ち上がったことを確認する

```
// 起動しているcontainerの一覧を見る
$ docker container ls
```

起動していないcontainerも含めて一覧を見るコマンドはこちら。意図したcontainerが立ち上がっていなかったら、このコマンドでbuildが失敗していないか確認する。

```
$ docker container ls -a
```
<img width="969" alt="スクリーンショット 2017-02-26 4.57.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/65dc37e4-3310-fe97-837f-41ff9cb2cafe.png">

## <i class="fa fa-book"></i> localhost:8000にアクセスして確認する
`localhost:{設定したアクセスポート番号}`をURLに入力してアクセスすると、WordPressの初期設定画面が出てくる。
<img width="347" alt="スクリーンショット 2017-02-23 14.10.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/8bcd697f-2352-790f-c05c-871268e7d2d2.png">

:dancer_tone5:  何て簡単なのでしょう...！  :dancer_tone5:

## <i class="fa fa-trash" id="notification"></i> buildに失敗したとき
### 関連するcontainerを停止した上に削除する

```
// buildしたcontainerを停止した上で削除する
$ docker-compose down -v
```

### 失敗したconatainerとnetworkが残っていないか確認する

```
// 起動していないcontainerも含めて一覧で見る
$ docker container ls -a


// 存在するnetworkのlistを見る
$ docker network ls
```

何らかの原因で`docker-compose down -v`しても失敗したcontainerや不要なnetworkを削除できないときは、以下のコマンドで対処する。

1.不要なcontainerが存在するが、起動はしていなかった場合

```
// 起動していないcontainerを一括削除する
$ docker container prune
```

2.不要なcontainerが存在し、起動している場合

```
// containerを停止する
$ docker stop {containerのハッシュ値}

// 対象のcontainerを削除する
$ docker rm {containerのハッシュ値}
```
3.不要なnetworkが残っている場合

```
// networkを削除する
$ docker network rm {networkのハッシュ値}
```

## <i class="fa fa-book"></i> 参考にさせていただいた記事
https://docs.docker.com/compose/wordpress/
https://tech.recruit-mp.co.jp/infrastructure/post-11266/
http://qiita.com/muk-ai/items/3350122d9e09473723c6