Docker内PHP開発環境(2022年水無月)[1/2]

# 初めに
[続き[2/2]](https://qiita.com/CinTAKE/items/f9a7a9791234d71f7aaa)

いつも読んでくださる皆様、ありがとうございます。

やっと時間がとれ、開発環境の整備編にとりかかれた。
まずは、PHPの開発環境を整える。

# 環境設定
VSCodeにてDockerコンテナを使って開発環境を構築する。メリットとしては以下のことを想定している。
- 環境がコンテナ内に制限され独立しており、開発者間の差異を防止しやすい
- ホストとなるPCには言語等をインストールする必要がない
- 複数のバージョンやOSの違いをコンテナを用意するだけで再現できる
- 最終実行環境に近い状態で動作確認ができる

## PHP開発用コンテナ
VSCodeにて、PHPおよびMySQLが動く環境をDockerコンテナで作り、デバッグできる環境を整える一連の設定などを解説する。MySQLは以前に解説したDockerCompose版[^1]を使ってもいいが、独立した環境とするために専用のものを用意する。また、VSCodeとDockerとの相性でBindMountしたWindowsファイルシステムにソースを配置すると、、、途轍もなく、物凄く、耐えられないほどに、実行がおそくなるので、Volume専用のコンテナを用意する。また、フェイクメールサーバも用意してメール発信のコードも実行できるようにする。よって、コンテナを４つ準備して使用する。ボリューム用コンテナは作成後は起動しないので、下記の概要図では省略してある。
![php-dvl-env.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/122e3747-d76b-ecf6-f54c-ae7abfec69cf.png)

### データVolume用
　単なるデータコンテナとして使うため、最軽量のLinuxの一つ「busybox」を利用。他のコンテナにマントする領域をmkdirし、読み書きパーミッションを0777に設定しておく。

### MySQL実行用
　多くのホスティングサービスで利用されているMySQL5.7の公式イメージを利用。データ領域は上記のコンテナをマウントし、データの永続性を担保する。ホストのファイルシステムにバインドマウントしたり、データコンテナにマウントしていないDockerのボリュームは基本的にリードオンリーであり、変更できたように見えても、再起動すると元に戻ってしまうため、この方式で環境構築する。

### PHP実行用
　当初はCentOS7を基に、Apache＋MySQLクライアント＋PHP / Python / NodeJS / Javaなどの複数バージョン、およびImageMagic/GhostScriptなどのよく使いそうなライブラリを入れたコンテナイメージを作っていたが、CentOSの先行きも不安であり、バージョン更新の激しいPHPにCentOSがまったく対応できず、RemiやSCLOなど標準外のリポジトリを多用することになって無理することが多いため、今回は公式にPHPのDockerイメージとして公開されているDebian版を利用した。その昔は、インストールにものすごく苦労したが、今はものすごく簡単になっている。

#### パッケージやPHP拡張のインストール
　debianなので、おなじみのapt-get install ... で各種パッケージを入れる。この辺りは、Dockerfile.dvlを見て解析していただきたい。PHP系は、専用のコマンドが /usr/local/bin に用意されていて、以下にその内の2つを示す。
- docker-php-ext-install　 ＝＞ PHP拡張をインストールする
- docker-php-ext-enable　　＝＞ PHP拡張を有効化する
:::note info 
上記スクリプトで利用できるPHP拡張は以下のもの：
bcmath bz2 calendar ctype curl dba dom enchant exif ffi fileinfo filter ftp gd gettext gmp hash iconv imap intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer xml xmlreader xmlwriter xsl zend_test zip
:::
　phpの構築や動作検証などに必要な開発ツール類をインストールし、メールサーバとして、下記のフェイクメールサーバへリレーするようにpostfixを設定する。(chrootを適切に設定しないとそのままでは動かない)　PHPの拡張機能としては、gd pdo pdo_mysql calendar intl imap zip などをインストールする。
　最後に忘れてならないのが、Debug/Step実行用のXDEBUGのインストールであり、設定用ファイルもひな形を用意する。

### フェイクメールサーバ
　STARTTLSにも対応しているsmtp4devを利用する。

https://github.com/rnwood/smtp4dev

# 実行
## 起動

Dockerfile,docker-compose.yaml などの環境構築関連をVSCodeのワークスペース定義としてリポジトリにまとめてあるので、以下を参照していただきたい。

https://github.com/korabo/docker-components.git

上記の 「docker-components/VSCode/phpdev/」 の内容をコピー
VSCodeにて開き、左下の「リモートウィンドウを開く」ボタンを押す
出てきたリストから「Open Folder in Container...」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/81614a3d-6f1f-eb4a-e6b9-ba6273881914.png)

「.devcontainer」フォルダが見える場所を選択し「Open」ボタン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/a612f5ca-979f-850f-59ab-f7afbcf060c2.png)

これで、docker-composeが起動してコンテナがビルドされる
もし途中でエラーが発生する場合は、ログを確認して対処する
最後には4つのコンテナで構成される環境が起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/f2148040-0522-e1a7-1bbf-71b52138c7d6.png)

## 設定
起動直後のワークスペースの状態：
- /home/dvlusr (uid:gid=1000:1000) が開かれている
- PV_xxx はデータコンテナの永続領域へのリンク
- SH_xxx はホストPCとの共有領域へのリンク
- SH_opt_conf の下にApache/PHP/Postfixなどの設定ファイルがある
- Apache2.xが起動し、以下の２つのポートを開いている
    - port:80 => 28080 デフォルトのドキュメントルートは/home/www/public_html/
    - port:81 => 28081 デフォルトのドキュメントルートは/var/www/html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/aa5f9a13-d26d-10e4-5d7e-91d479a214d9.png)

下記の図では、dolibarrというOSS-ERPのソースをインストールし、DocumentRootを変更してある。

https://github.com/Dolibarr/dolibarr.git

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/bfc3fa7b-aaac-92a7-4823-f52455fc200c.png)

ターミナルを開いて、レポジトリをクローン。
```bash
git clone https://github.com/Dolibarr/dolibarr.git
```
設定ファイルを更新。
```bash
code /opt/conf/etc_apache2_sites-enabled_webapp.conf
```
DocumentRoot /home/www/public_html
＝＞       DocumentRoot /home/dvlusr/dolibarr/htdocs

Apacheに設定を適用。
```bash
apachectl graceful
```

## 接続
### Apache
- PHP設定確認(phpinfo)  http://localhost:28081/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/abc35f23-bfeb-a9c2-68d0-034815083bbe.png)

- Dolibarr確認 http://localhost:28080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/666df047-419b-ac2d-457a-9b70e0613e95.png)
＊上記はPHP拡張を補充する前のもの。現在のDockerfile.dvlでは必要なPHP拡張が追加されている。
### Smtp4dev
メール確認画面  http://localhost:25080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/0b4cb914-1b3a-937d-c8c5-3e4b6dced16a.png)
＊上記はテストしたメールが入っている状態。

### MySQL
MySQL-WorkBench  localhost:23306 mysql/mysql
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/e3f97d5d-7f18-954b-5902-705e2a87234c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/2ba947c2-097f-0fe8-18c9-ce6f82d77e22.png)

# デバッグ・ステップ
長くなってきたので、続きは別記事とする。

親記事：[WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1)

[^1]: [開発環境用MySQL+Admin](https://qiita.com/CinTAKE/items/8dd0e9f570c12caf1572)