【開発環境 #5】PHP開発環境の構築【WSL2,Docker】

今回はDockerでPHPの開発環境を構築します。

環境
Windows
10 home (20H2)
WSL
2
Ubuntu
20.04 LTS
Docker Desktop for Windows
3.5.2 (66501)

Docker イメージの選定

Docker Hubへアクセスし、使用したいイメージ名を検索します。

  1. Docker Hubの上部検索フォームで「php」と検索
  2. 検索結果からphp✓Official Imageを選択
  3. タブメニューのTagsをクリックし任意のバージョンを選択する
    1. 今回はapache
  4. 画面に表示されているphp:apacheが使用する<イメージ:タグ(バージョン)>になります

ディレクトリ構造

WSL2のUbuntuでの構成は以下になります。/home/dev/phpを開発ディレクトリとします。

home/
`-- dev/
   `-- php/

コンテナの作成と起動

Windows TerminalでUbuntuに接続し、以下のコマンドを実行します。

$ pwd
/home/dev/php

$ docker run --name php -p 8080:80 -d php:apache

Unable to find image 'php:apache' locally
apache: Pulling from library/php
......
......

コンテナの作成と起動に成功しました。コマンドの簡単な解説は以下となります。docker runコマンドの詳細やその他のオプションは公式サイトに詳しいです。

--name php
コンテナの名前
-p 8080:80
localhost:8080のアクセスをコンテナのポート80に繋げる
-d
デタッチドモード。コンテナをバックグラウンドで稼働させ続ける

コンテナイメージとコンテナの確認

$ docker images

REPOSITORY      TAG          IMAGE ID       CREATED         SIZE
php             apache       b4e8e213b0ec   5 minutes ago      477MB
$ docker ps

CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                               NAMES
4b075fb8fa1c   php:apache   "docker-php-entrypoi…"   1 minutes ago   Up 1 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   php

コンテナの作成と起動、バックグラウンドでの実行が確認できました。

ブラウザでアクセスする

webブラウザでhttp://localhost:8080へアクセスしてみます。ファイルを何も用意していないので、404 Not Foundとなりますが、Apache/2.4.51 (Debian) Server at localhost Port 80と表示がされ、Apacheが動いていることが確認できます。

コンテナを停止させる

$ docker stop php

コンテナを破棄する

$ docker rm php
php

Docker ビルド

さて、簡単にPHPの実行環境が構築できましたが。次は、公式に用意されたイメージを使用するのではなく、自身で開発したファイルを含んだDockerイメージをつくります。

ビルドコンテキスト

Ubuntuの/home/dev/phpビルドコンテキストとします。最終的に以下の構成になります。

home/dev/php/
|-- Dockerfile
`-- index.php
Dockerfile
FROM php:apache

COPY ./index.php /var/www/html/index.php
index.php
<?php

echo 'HELLO WORLD';

Dockerイメージをつくる

先ほどつくったDockerfileでDockerイメージを作ります。Windows TerminalでUbuntuに接続します。

$ pwd
/home/dev/php

$ docker build -t my-php:hello .

[+] Building 0.4s (7/7) FINISHED
 => [internal] load build definition from Dockerfile
 ......
 => => naming to docker.io/library/my-php:hello

作成したイメージを確認してみます。

$ docker images

REPOSITORY      TAG          IMAGE ID       CREATED              SIZE
my-php          hello        a134aff7ebe1   About a minute ago   477MB
php             apache       b4e8e213b0ec   2 days ago           477MB

コンテナの作成と起動

では、作成(ビルド)したイメージからコンテナの作成と起動をしてみます。

$ docker run --name my-php -p 8080:80 -d my-php:hello

ec0e79ad79e5.....

ブラウザでアクセスする

webブラウザでhttp://localhost:8080へアクセスしてみます。
HELLO WORLD(index.phpの内容)が表示され、ファイルがコンテナにコピーされていることが確認できました。必要なくったコテンナを停止削除しておきます。

ディレクトリのマウント

開発環境の構築とファイルのコピーができるようになりました。ですが、完成ファイルのみのコピーだけでは実用的ではありません。次は、ホスト側のディレクトリをコンテナ内のディレクトリにマウントし、ホスト側での編集作業(開発中のコード)をコンテナから参照できるようにします。

ビルドコンテキスト

Ubuntuの/home/dev/phpビルドコンテキストとします。最終的に以下の構成になります。ホスト側のsrcをコンテナのApache公開ディレクトリである/var/www/htmlへマウントします。

home/dev/php
|-- docker/
|   |-- Dockerfile
|   `-- php.ini
`-- src/
    `-- index.php

今回はPHPのバージョンを指定してみます。

docker/Dockerfile
FROM php:7.4.27-apache

COPY ./php.ini /usr/local/etc/php/php.ini
src/index.php
<?php

echo 'HELLO WORLD';

php.iniの内容は省略します。

ビルド

$ pwd
/home/dev/php

$ docker build -t my-php:hello ./docker

[+] Building 0.4s (7/7) FINISHED
 => [internal] load build definition from Dockerfile
 ......
 => => naming to docker.io/library/my-php:hello

コンテナの作成と起動

では、イメージからコンテナの作成と起動をしてみます。

$ docker run -p 8080:80 -v ~/php/src/:/var/www/html -d --name my-php my-php:hello

0ec6b5aa4.....

ブラウザでアクセスする

webブラウザでhttp://localhost:8080へアクセスしてみます。
HELLO WORLD(index.phpの内容)が表示されました。

新規ファイルを作成

home/dev/php/srctest.phpというecho 'test';と表示だけするPHPファイルを新規作成しhttp://localhost:8080/test.phpへアクセスしてみます。

test(test.phpの内容)と表示され、home/dev/php/srcでの開発作業が反映されているのが確認できました。

終わりに

駆け足ではありましたがコンテナの作成や起動はできるようになりました。

ドキュメント

Dockerやオプションなどの詳細は以下のリンクが参考になります。