Worpdressのイメージを使わずにWordpressのDocker環境を立てる 

DockerでWordpressの環境を作ることになったのですが、イメージを使わずに立てるまでに結構手こずったので備忘録として残そうと思います。
あくまでも自分の記録なので、もっと簡単にできるよとか間違ってるよとかあるかもしれません。
#環境
 - Mac Mojave 10.14.6
 - docker desktop 2.3.0.3

#最終的な目的
##実現したい条件
 - nginx+php+mysqlの環境
 - http://localhost:8080 にアクセスしてwordpressの管理画面にアクセスできる
 - データベースを永続化（コンテナを削除してもデータベースの中身が消えない）


##各コンテナのバージョン
 - nginx 1.12.2
 - php 7.2
 - mysql 5.6
 - wordpress 5.4.2

##ファイル構成
```
├── docker-compose.yml
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
└── www
    └── html
        └── [wordpressのファイル]
```

#手順
1.nginx+php環境を構築
2.mysqlを追加
3.wordpressを追加、設定

##1.nginx+php環境を構築
各コンテナを作成するためのファイルを作成します。
最初に構築するファイルは次の通りです。

```
├── docker-compose.yml
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
└── www
    └── html
        └── index.php
```

###docker-compose.yml

```docker-compose.yml
version: '3'
services:
 nginx:
  image: nginx:1.12.2
  ports:
   - 8080:80
  volumes:
   - ./www/html:/var/www/html
   - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
 
 php:
  build: ./php
  volumes:
   - ./www/html:/var/www/html
```

###nginx/default.conf
http://localhost:8080 にアクセスしたときに、index.phpも表示されるように記述を追加します。


```:nginx/default.conf
server {
    listen       80;
    server_name  localhost;
    root   /var/www/html;
    # ここにindex.phpを追加
    index  index.html index.htm index.php;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # phpが動くようにコメントアウトを外す
    location ~ \.php$ {
        root           /var/www/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_intercept_errors on;
    }

}
```

###php/Dockerfile
`docker-compose.yml`に直接imageで指定しても良いのですが、後ほどmysql追加の際に記述を追加するため、Dockerfileを作成しています。

```:php/Dockerfile
FROM php:7.2-fpm
```

###www/html/index.php

```www/html/index.php
<?php
  phpinfo();
```

###コンテナ起動
cdコマンドで作業ディレクトリに移動し、以下のコマンドを使用します

```
// docker-compose.ymlで記述したコンテナをインストール
$ docker-compose up -d

// コンテナが作成・起動しているか確認(-aをつけることで起動していないコンテナも表示可能)
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
0aed3ada6a01        docker_wp_php       "docker-php-entrypoi…"   19 seconds ago      Up 17 seconds       9000/tcp               task4_wp
b698e1032798        nginx:1.12.2        "nginx -g 'daemon of…"   19 seconds ago      Up 17 seconds       0.0.0.0:8080->80/tcp   docker_wp_nginx_1

```
http://localhost:8080 にアクセスしてphpinfoが表示されていれば成功です。


##2.mysqlを追加
ファイル構成に追加・変更はありませんが、mysql追加にあたって`php/Dockerfile`と`docker-compose.yml`に記述の追加があります。

###php/Dockerfile

```:php/Dockerfile

FROM php:7.2-fpm

// 以下2行を追加
RUN apt-get update
RUN docker-php-ext-install pdo_mysql mysqli
```

###docker-compose.yml

```docker-compose.yml
version: '3'
services:
 nginx:
  image: nginx:1.12.2
  ports:
   - 8080:80
  volumes:
   - ./www/html:/var/www/html
   - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
 
 php:
  build: ./php
  container_name: "task4_wp"
  volumes:
   - ./www/html:/var/www/html
 
 // 以下mysqlの記述を追加
 db:
  image: mysql:5.6
  ports:
   - 3306:3306
  environment:
   MYSQL_DATABASE: wordpress
   MYSQL_ROOT_PASSWORD: root
   MYSQL_USER: user
   MYSQL_PASSWORD: password
  volumes:
   - wp_db:/var/lib/mysql

volumes:
 wp_db:

```

`MYSQL_USER`と`MYSQL_PASSWORD`は後ほどmysqlにログインするときに使うユーザーを設定しています。
`MYSQL_DATABASE`はwordpressを入れたときに使うデータベースです。
また、データベースの中身は`www/html`のようにマウントするのではなく、volumeとしてファイル外に置いています。

###コンテナを再起動

```
// さっき作成したコンテナを停止、削除
$ docker-compose down

// docker-compose.ymlで記述したコンテナを起動
$ docker-compose up -d

// コンテナが作成・起動しているか確認
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9e9d13e9441f        nginx:1.12.2        "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:8080->80/tcp     docker_wp_nginx_1
19451d8dfd82        docker_wp_php       "docker-php-entrypoi…"   3 minutes ago       Up 3 minutes        9000/tcp                 docker_wp_php_1
7f37f92bed6a        mysql:5.6           "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp   docker_wp_db_1
```
http://localhost:8080 にアクセスすると、さっきと同じようにphpinfoが表示されていると思います。
表面上は変わりませんが、STATUSがUPになっていたら起動成功です。

##3.wordpressを追加、設定

最後にwordpressを入れます。
wordpressは以下のページからダウンロードできます。
https://ja.wordpress.org/download/
`/www/html/index.php`は削除してから、解凍して`wordpress/`の中身をコピーして、`www/html/`にコピーします。
###ファイル構成

```
├── docker-compose.yml
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
└── www
    └── html
        └── [wordpressのファイル]
```

http://localhost:8080 にアクセスすると、以下のような画面になります。
![スクリーンショット 2020-09-29 20.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481714/6ce4aea4-2cbf-29df-b6ce-4b2bd26f894a.png)
データベースの登録。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_481714_d321077c-de34-778b-145c-429722abf7c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481714/68e51cdb-5db6-4522-0d80-08423e74f3da.png)
インストール。
![スクリーンショット 2020-09-29 21.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481714/9d47e62f-bf9a-1789-d19d-31ec83ed9102.png)
サイトの情報と管理者のユーザー情報を入力。
![スクリーンショット 2020-09-28 14.26.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481714/70ef4969-2082-bf0d-1f27-a5583b90590f.png)
ログインユーザーを登録したので、ログイン。
![スクリーンショット 2020-09-29 21.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481714/f37b91f7-493c-51e9-66da-819c281bffab.png)

wordpressの管理画面に到達です。
![スクリーンショット 2020-09-29 21.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481714/703f6834-29a6-87ab-7b72-bd3a87dbc079.png)


#ひっかかったところ

####volumesの理解
今回書いたコードにもコンテナ内外の両方に記述があります。
内部のvolumesはコンテナとローカルでファイルを共有するのためだと理解していたのですが、外部の方は記述の仕方も少し違っていますし、そもそもフォルダの位置指定されてなくない？マウントのためじゃないのか……？と疑問に思いつつも、使わないならいいかと放置していました。反省。
こちらの記事が分かりやすかったです。
[Docker、ボリューム(Volume)について真面目に調べた](https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32)

#よく使ったコマンド
```
$ docker-compose up -d
// 今いるフォルダ直下にあるdocker-compose.ymlをバックグラウンドで実行

$ docker-compose stop
// docker-compose.ymlに書いてあるコンテナを停止する

$ docker-compose start
// コンテナを起動する

$ docker-compose down
// コンテナの停止→削除
$ docker-compose down --rmi all -v
// docker-compose.ymlに記述のあるコンテナ、イメージ、作ったボリュームまで全部消える

$ docker exec -it [コンテナID] /bin/bash
// コンテナにログイン（コンテナIDは`docker ps`で確認できる）

$ docker ps
// 起動中のコンテナを一覧で表示
$ docker ps -a
// 起動してないコンテナも含めて全部表示

$ docker images
// イメージを一覧で表示

$ docker rm [コンテナID]
// コンテナを削除する。稼働中のコンテナを削除しようとするとエラーが出る
$ docker rm [コンテナID] -f
// コンテナを削除する。動いていても強制的に削除する

$ docker rmi [イメージID]
// イメージを削除する。コンテナがあるとエラーが出る
$ docker rmi [イメージID] -f
// イメージを削除する。コンテナがあっても強制的に削除する
```