IntelliJ + Dockerでローカル環境を極力汚さずPHP+MySQL開発環境を構築する

# 概要
PHP + MySQL の環境を docker-compose で構築し、IntelliJ上でdockerに接続してPHPUnitをする手順を記載してます。
Docker上に構築した実行環境を使うようにすることで、いちいちローカルにPHPやMySQLをインストールしなくてもよくなるようになり、ローカル環境の汚染を防ぐことができ、「案件によって使うMySQLのバージョンが異なるせいで毎回再インストールしないといけないんだよぉ」みたいな煩わしさから解放されます。

かつ、ローカルに環境を構築していた時と同様にIDEからサクっとテストを走らせることができるため、なんかハッピーなアレになれます。多分。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/b6426736-c103-9b2d-8c4c-009e57232855.png)


# 実行環境

* Windows 10 64bit
* IntelliJ Ultimate Edition 2021.1
* Docker Desktop v20.10.5

今回はWindowsで構築したけど、Macでも普通にできるはず。

# 前提
* DockerやIntelliJ はインストール済

# IntelliJ のプラグインのインストール
以下をインストールしておきます。

* PHP
* PHP Docker
* PHP Remote Interpreter 
* PHPUnit Enhancement
* Docker

とりあえずトライ＆エラーで入れたプラグインなんで、いくつか不要なものもあるのかも。

# Dockerfileなどの作成
以下のフォルダ構成にします。

```
<Root>
・ local // Docker環境用
├ php
│ ├ php.ini
│ └ Dockerfile
└ mysql // 最終的にデータファイルが入る
・ src　// ソースファイル
・ docker-compose.yml
```

```dockerfile:local/php/Dockerfile
FROM php:7.2-fpm
RUN apt-get update
RUN apt-get install -y vim git zip unzip
RUN docker-php-ext-install pdo_mysql
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY php.ini /usr/local/etc/php/
```

```ini:local/php/php.ini
date.timezone = "Asia/Tokyo"
```

```yml:docker-compose.yml
version: '3'
services:
  # Webサーバーとして動かす場合（今回はユニットテスト書くのが目的なのでこの部分は割愛）
  # nginx:
  #  image: nginx:latest
  #  ports:
  #    - 8080:80
  #  volumes:
  #    - ./local/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
  #    - ./src:/var/www/html
  #  depends_on:
  #    - php
  php:
    build: ./local/php
    volumes:
      - ./src:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    ports:
      - 13306:3306
    volumes:
      - ./local/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    container_name: mysqldb

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    ports:
      - 8888:80
    depends_on:
      - db
```

これらのイメージ＆コンテナを作成しておき、 phpにCLIで入って、 `composer install` をやっておきます。

# IntelliJの設定
## Dockerの設定
File -> Settings にてSettingsダイアログを出し、 Build, Execution, Deployment -> Dockerを選択します。
ひとつDockerのサービスを作成しておけばOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/eff52133-91e7-3a08-5c07-32ef4a72f738.png)

## PHPの設定

Languages & Frameworks -> PHP を選択し、CLI Interpreter の「...」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/a77de903-a964-a371-906c-69c3c6c3251f.png)

CLI Interpreters から設定を作成し、「From Docker, Vagrant, VM, WSL, Remote...」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/e71092ff-6948-2c23-3989-c98cbea5adcc.png)

Docker Composeを選択し、実行サービス（今回の例だとphp)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/a13160c8-abd2-e366-4d92-d2b30959d942.png)

最初の設定のは不要な場合は削除しちゃいます。

## PHPUnitの設定
Languages & Frameworks -> PHP -> Test Frameworks を選択し、CLI Interpreter に、上記で作成したインタプリタを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/ddea9b0f-bcb2-c8ef-4dd0-d947aea334c5.png)

## テストの設定
最後に、 実行の設定を行います。

Run / Debug Configurationsから、PHPUnitのを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/2007f8c3-6af9-e4ca-478a-b0bd06f58db1.png)

あとはいつも通りの感じでテストを起動すると、IntelliJ は自動的にDocker上の実行環境を使ってテストを行い、MySQLにも接続するテストが実行できます。

# まとめ
いい時代になりましたねぇ。Docker便利。
そのうちGoやJavaやFlutterとかも同様のやり方でできないか調べたい