0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-07-05

初めに

続き[2/2]

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

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

環境設定

VSCodeにてDockerコンテナを使って開発環境を構築する。メリットとしては以下のことを想定している。

  • 環境がコンテナ内に制限され独立しており、開発者間の差異を防止しやすい
  • ホストとなるPCには言語等をインストールする必要がない
  • 複数のバージョンやOSの違いをコンテナを用意するだけで再現できる
  • 最終実行環境に近い状態で動作確認ができる

PHP開発用コンテナ

VSCodeにて、PHPおよびMySQLが動く環境をDockerコンテナで作り、デバッグできる環境を整える一連の設定などを解説する。MySQLは以前に解説したDockerCompose版1を使ってもいいが、独立した環境とするために専用のものを用意する。また、VSCodeとDockerとの相性でBindMountしたWindowsファイルシステムにソースを配置すると、、、途轍もなく、物凄く、耐えられないほどに、実行がおそくなるので、Volume専用のコンテナを用意する。また、フェイクメールサーバも用意してメール発信のコードも実行できるようにする。よって、コンテナを4つ準備して使用する。ボリューム用コンテナは作成後は起動しないので、下記の概要図では省略してある。
php-dvl-env.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拡張を有効化する

上記スクリプトで利用できる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を利用する。

実行

起動

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

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

image.png

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

image.png

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

image.png

設定

起動直後のワークスペースの状態:

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

image.png

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

image.png

ターミナルを開いて、レポジトリをクローン。

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

設定ファイルを更新。

code /opt/conf/etc_apache2_sites-enabled_webapp.conf

DocumentRoot /home/www/public_html
=> DocumentRoot /home/dvlusr/dolibarr/htdocs

Apacheに設定を適用。

apachectl graceful

接続

Apache

Smtp4dev

メール確認画面 http://localhost:25080/
image.png
*上記はテストしたメールが入っている状態。

MySQL

MySQL-WorkBench localhost:23306 mysql/mysql
image.png

image.png

デバッグ・ステップ

長くなってきたので、続きは別記事とする。

親記事:WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)

  1. 開発環境用MySQL+Admin

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?