Dockerインストール -> Docker ComposeでWordPressローカルで動かしてMySQLに外から接続したり、編集を外からしたり。(Mac)

色々とうまくいかなかったのでメモを残します。

# WordPressをdocker-composeで動かすまで
## Dockerのインストール
下記URLからアプリをダウンロードしてインストール
https://www.docker.com/get-started

Dockerのアイコンが上のバーに出てくるのでdocker.hubのアカウントでログイン
![スクリーンショット 2020-05-13 10.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636715/6c95c69c-3f15-bed9-3e30-c91b8c53cf3f.png)

UIでDockerの状況をお手軽に見れるので結構便利

## docker-composeの導入
下記ドキュメントを参考にcurlで導入したが、なぜか動かなかった
http://docs.docker.jp/compose/install.html

```
curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```

どうやらバージョンが古かったようなので、下記URLを元に最新のstable版のdocker-composeを指定。
https://github.com/docker/compose/releases

```
curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```

これでチュートリアルに記載されているyamlを指定して動くようになった
[参考]http://docs.docker.jp/compose/wordpress.html
（ローカルのMySQLとポートが被ると嫌なのでローカルの33060ポートを利用して外から確認するため、dbのportsに記述を追記してある）

```
$ docker-compose up -d
Creating my-wordpress_db_1 ... done
Creating my-wordpress_wordpress_1 ... done
```

```yaml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - "./.data/db:/var/lib/mysql"
    ports:
      - "33060:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

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

試しに動かして見ると正常に動作することを確認できた
http://localhost:8000/

## ローカルからMySQLの中身を確認する
外からDBに接続したいのでMacにMySQLを入れる。
[参考]https://brew.sh/index_ja

```
$ brew update
$ brew install mysql
```

接続を試みるが失敗する

```
$ mysql -u root -p -h 127.0.0.1 -P 33060
Enter password:
ERROR 2007 (HY000): Protocol mismatch; server version = 11, client version = 10
```

余談だが、hostはlocalhostではなく127.0.0.1を指定しなければならないらしい
[参考]https://teratail.com/questions/139019

原因はbrew installでインストールされたMySQLのバージョンが8系だったことのようだった

```
$ mysql --version
mysql  Ver 8.0.19 for osx10.13 on x86_64 (Homebrew)
```

なので下記記事を参考にローカルマシンのMySQLを5.7系へ変更した
https://qiita.com/t_oginogin/items/76ca2b6ce18d53988dc3

```
$ brew search mysql@5.7
==> Formulae
mysql@5.7
$ brew install mysql@5.7
（中略）
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have mysql@5.7 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"

For pkg-config to find mysql@5.7 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"


To have launchd start mysql@5.7 now and restart at login:
  brew services start mysql@5.7
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/mysql@5.7/bin/mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql@5.7/5.7.29: 319 files, 235.4MB
```

とりあえずインストールはできたみたい。
ただ、mysqlコマンドは依然8系を利用していた

```
$ brew services
Name      Status  User  Plist
mysql     started hoge /Users/hoge/Library/LaunchAgents/homebrew.mxcl.mysql.plist
mysql@5.7 stopped
$ brew services stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
$ brew services start mysql@5.7
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
$ mysql --version
mysql  Ver 8.0.19 for osx10.13 on x86_64 (Homebrew)
```

mysqlコマンドが指す設定を8系から5.7にしたいので、以下の処理をした

```
$ mv /usr/local/var/mysql/ /usr/local/var/mysql_80
$ brew unlink mysql
Unlinking /usr/local/Cellar/mysql/8.0.19... 88 symlinks removed
$ brew link mysql@5.7 --force
Linking /usr/local/Cellar/mysql@5.7/5.7.29... 87 symlinks created

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
```

なんか出てたけど気にせず進める。
MySQLのバージョンの確認

```
$ brew services stop mysql@5.7
Stopping `mysql@5.7`... (might take a while)
==> Successfully stopped `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
$ brew services
Name      Status  User Plist
mysql     stopped
mysql@5.7 stopped
$ brew services start mysql@5.7
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.13 (x86_64) using  EditLine wrapper
```

mysqlコマンドのバージョンが5.7に切り替わったっぽいので、接続を試みる。

```
$ mysql -u root -p -h 127.0.0.1 -P 33060
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.30 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
```

繋がった、よかった。

## WordPressをローカルで編集する

ただ、このままだとWordPressを外から開発しづらいので、外からマウンドできるような設定にする

```yaml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - "./.data/db:/var/lib/mysql"
    ports:
      - "33060:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - "$PWD/wordpress:/var/www/html"
    links:
      - db
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress
```

volumesにローカルでダウンロードしたWordPressを指定する
最新のWordPressのダウンロードは以下でささっと。

```
$ curl -LO https://ja.wordpress.org/latest-ja.zip && unzip latest-ja.zip
```

ローカルの編集がすぐにdockerに反映されるので、サーバ上で開発しているような感覚でできてかなり楽でした。

## ログを後からgrepしたい気がしたけど、とりあえず参考になりそうなリンクを見つけてお終い

このままだとエラーが起きた時に開発しづらいなと思ったので、logファイルの特定をしようと思ったが、そんなファイルはなかった
[参考]https://qiita.com/tily/items/adb433505da6c7812725

/var/log/apache2/access.logが/dev/stdoutに出力されていて、docker内部には残っっていないので、どうしようか悩み中。。。

以下を参考にローカルに落とす仕組みを作りたいけど、今の所困っていないので、その設定はまた今度にする。
[参考]https://hacknote.jp/archives/26996/

（追記）
以下のようにアクセスログを外にマウントすればいいのでは？と実験してみたらいい感じに全部ログに落ちたので、取り急ぎはこんな感じで中身を確認するためのログを落とすことにする。

```
    volumes:
      - "$PWD/wordpress:/var/www/html"
      - "$PWD/access.log:/var/log/apache2/access.log"
```

## 終わりに
Dockerで実際にWordPressを開発するまでの流れの知識が散り散りになっていたので、これを機にまとめました。