Magento2 Docker開発環境の構築

# Docker-compose for Magento2, Varnish5, Redis5, MySQL5.7 

ここでは、最新の(Magento2.3.3)の開発環境の構築について説明します。

### アカウントの取得

Magentoをインストールする為には、Magentoの[Developperサイトにサインアップ](https://developer.magento.com/)して、アカウントを作成する必要があります。

サインアップが出来たらマーケットプレイスのサイトにアクセスしてサインインします。また、そこから以下URLに移動するとアクセスキーの取得・表示が行えますのでここで表示されたキーを控えます。

https://marketplace.magento.com/customer/accessKeys/

```
Public Key: インストール時に Username として使用します。
Private Key: インストール時に Password として使用します。
```

### Dockerファイルのダウンロード（もしくはクローン）
Docker for Mac を使っている場合は、ファイル共有が遅くなるので、Vagrantを用意して立ち上げてください。以下リポジトリのREADMEに立ち上げ方を記述してあります。また、Dockerの構成に必要な一連のファイルも以下のリポジトリにまとめてありますので、クローンするかダウンロードして展開します。

httpdの種類別に２つ作成してあります。nginxの方が新しくよりチューンナップされていてお勧めです。

(Nginx Version) MailCatcher でMagentoから送信したメールが確認できます。
https://github.com/bluemooninc/magento2nginx

(Apache Version)少し古いですが、Redis,Varnishなど設定が載っています。
https://github.com/bluemooninc/magento-docker-base

```text
git clone git@github.com:bluemooninc/magento-docker-base.git
cd magento-docker-base
docker-compose up
```
どちらもクローンした後に docker-compose で構成をビルドします。
Docker for macintosh を使用している場合は、アンインストールしてVagrantにすることを強くお勧めします。（Mac,Docker間のファイル共有のスピードに問題があり、symfonyベースのプロジェクトは特に遅くなることが確認されています。）

### Magento2のインストール

Composer を使用してMagentoのインストールを行います。

```text
docker exec -it apache2 bash
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition /var/www/html/magento
Username: [YOUR-PUBLIC-KEY]
Password: [YOUR-PRIVATE-KEY]
```

### データベースの作成

Dockerのビルドが完了したら http://localhost:8085/ で phpMyAdmin にアクセスする事ができるので、SQLコマンドにて以下の通りのデータベースを作成します。

```text
CREATE DATABASE magento DEFAULT CHARACTER SET utf8mb4;
```

### Magentoのセットアップ

#### ブラウザからのインストール
dockerが立ち上がっていれば、localhostにアクセスすればセットアップが始まります。環境のチェックから始まり、Databaseの設定は localhost や 127.0.0.1 でなく docker のコンテナ名で指定する事に留意してください。docker-composer に記載してあるコンテナ名 ( mysql_host ) で指定します。最後まで進むと、Successの表示とともに管理者のアカウント設定情報が表示されますのでメモします。
<img width="594" alt="スクリーンショット 2019-11-04 11.33.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40217/3650f8f1-e706-321a-d39c-41aab61a7522.png">


#### コマンドラインからのインストール
Magentoの作業フォルダに移動して、セットアップを行います。

```
cd magento

bin/magento setup:install \
--base-url=http://localhost \
--db-host=mysql_host \
--db-name=magento \
--db-user=root \
--db-password=root \
--admin-firstname=admin \
--admin-lastname=admin \
--admin-email=admin@admin.com \
--admin-user=admin \
--admin-password=admin123 \
--language=en_US \
--currency=USD \
--timezone=America/Chicago \
--use-rewrites=1

## セットアップが完了すると以下の様にURLが表示されます。
¥[SUCCESS]: http://localhost/magento/
¥[SUCCESS]: http://localhost/magento/admin_?????
```

### Cronのインストール

Cronの実行を予定しているのであればインストールします。

```
# cronをインストール
php bin/magento cron:install
# 確認
crontab -e

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly
#~ MAGENTO START f37deed947b2ea951ad6f939b8ab752bc79587e3d77f40d06f20f0657c98e94d
* * * * * /usr/local/bin/php /var/www/html/magento/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/magento/var/log/magento.cron.
* * * * * /usr/local/bin/php /var/www/html/magento/update/cron.php >> /var/www/html/magento/var/log/update.cron.log
* * * * * /usr/local/bin/php /var/www/html/magento/bin/magento setup:cron:run >> /var/www/html/magento/var/log/setup.cron.log
#~ MAGENTO END f37deed947b2ea951ad6f939b8ab752bc79587e3d77f40d06f20f0657c98e94d

```

### インデックスの貼り直し

インデックスを貼り直すメッセージが表示された場合に実行します。

```
php bin/magento indexer:reindex
```

### Redisによるキャッシング

Magentoのコンフィグセッティングにて追加します。

```
docker exec -it apache2 bash
cd magento
bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-server=redis_host
```

#### Redisのモニタリング

```text
docker exec -it redis_host bash
redis-cli monitor
```

#### Trouble shooting

```text
An error has happened during application run. See exception log for details.
```

もしブラウザで上記のメッセージが表示された場合はキャッシュをクリアする事で正常に動作させる事ができます。

```text
redis-cli flushall
```

### Varnishのモニタリング

Varnishの状況を確認する為にモニタリングを実行します。

```text
docker exec -it varnish bash
varnishstat
```

以上で、各種ミドルウェアの設定を行いローカルで開発する環境が整います。
Varnish,Redisは開発ではなくても良いですができるだけ本番に近い環境で開発する事で、色々な気づきもあると思います。

## コマンドメモ

コンテンツの吐き出し、キャッシュクリア、Diのコンパイルコマンドメモです。徐々に解説を更新していく予定です。

```
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy
php bin/magento setup:static-content:deploy ja_JP
php bin/magento cache:flush;
php bin/magento cache:clean
```
## サンプルデータのデプロイ

Magento2 には、レッスン用のサンプルデータをデプロイする仕組みが備わっています。最初に管理者としてのオペレーションに慣れる為に、以下リポジトリにあるドキュメントを参照してデプロイします。

https://github.com/magento/magento2-sample-data

Composerでインストールすれば、サンプルデータのデプロイ設定も登録されていますので、以下コマンドで実行可能です。

```
cd magento
# サンプルデータ取得
php bin/magento sampledata:deploy
# 取得したサンプルデータでセットアップを実行
php bin/magento setup:upgrade
```
### メモリの確認
composer はメモリが少なくてエラーとなる場合があります。php.iniを編集してメモリが確保されたか確認しながら適切な設定をします。デフォルトは128Mですが、上限エラーを回避して行った結果1Gでは足りず2G割り当てました。

```
## メモリの確認
php -i | grep memory_limit
## php.iniの場所確認
php -r "echo phpinfo();" | grep "php.ini"
```

# デバッグのオン・オフ
magentoの反応が重いと感じたのでデバッグモードをオフにしてみます。

```
# デバッグオフ
php bin/magento setup:config:set --enable-debug-logging=false && php bin/magento cache:flush
# デバッグオン
php bin/magento setup:config:set --enable-debug-logging=true && php bin/magento cache:flush
```
# メール送信

localhostからメールを送るには、MailCatcherを利用します。php.iniのsendmail_pathに設定して利用します。

```
## 設定例
sendmail_path = /usr/bin/env catchmail --smtp-ip smtp --smtp-port 1025
```