PHP: Supported Versions を見てみると、現在サポートされているPHPのバージョンは、7.2系統、7.1系統、7.0系統、5.6系統の4種類であることが分かります。PHP: Downloads においても、この4種類のそれぞれの最新バージョンがダウンロードできるようになっています。(PHP: Releases ではこれ以外のバージョンがダウンロードできます)。
本ページでは、Docker を使って、それぞれの系統の最新バージョンを実行する方法について説明します。
目次
前提
- 既に Docker が導入済みであることを前提とします。
- Windows 10 での Docker 導入手順については、以下のページを参照してください(残念ながら、Windows 10 Home は対象外になります)。
- WSL を使ったターミナルでの操作を行いますが、素の Linux やMac, PowerShell でもやることはほとんど同じはずです。
- 今回の作業は
C:\Users\foo\work
で行います。
作業
1. 作業用ディレクトリに移動する
今回、C:\Users\foo\work
というディレクトリで作業しますので、ターミナルでここに移動しておきます。
cd /mnt/c/Users/foo/work
※ これは WSL を使っている場合のパスになります。他の環境を使っている場合は、その環境に合わせたパスに変更して実行してください。
2. 実行するPHPのファイルを準備する
今回実行する PHPのファイルは以下の内容とし、main.php というファイル名でカレントディレクトリ直下に保存しておきます。
main.php
<?php
echo 'Current PHP version: ' . phpversion() . PHP_EOL;
実行されているPHPのバージョンを表示しているだけの内容になっています。
ディレクトリとファイルの状態は以下のようになります。
/mnt/c/Users/foo/work/
└ main.php
3. Docker Hub で PHP の公式ページを眺める
次に、Docker Hub で PHP が公式に公開しているレポジトリページを眺めます。
どんなタグがあるか見ておきましょう。
サポート中のバージョンの中で、それぞれ最新バージョンが使えることが分かります。
「Run a single PHP script」という項目には、特定のPHPファイルを実行するコマンド例が載っています。これを参考にすると良さそうです。
4. PHP 7.2系統の最新バージョンで実行する
本ページでは、PHP 7.2系として「7.2.7-cli」というタグを使うことにします。
ここにあるように、「7.2-cli」「7-cli」「cli」など、同様の Dockerfile を使うタグが多数存在しています。「同じ Dockerfile を使う」ということは、「どれでも同じイメージである」ということです。お好みのタグを使って頂いて構いません。
- 「7.2-cli」であれば、常に 7.2系統内での最新バージョンとなるようです。
- 「7-cli」であれば、常に 7系統での最新バージョンになるようです。
- 「cli」であれば、常に PHPの最新バージョンになるようです。
「7.2.7-cli」タグが適切なイメージであるかを確認する
今選んだ「7.2.7-cli」というタグが、どんな内容のイメージなのか? PHP 7.2.7 が本当に使えるのか? などを調べるため、その下にある「7.2/stretch/cli/Dockerfile」というリンクをクリックして、使用される Dockerfile を見てみます。
最初のところで、「FROM debian:stretch-slim」とありますが、これは Debian という Linuxディストリビューションの最新版である Stretch のイメージが利用されていることが分かります。Docker Hub で debian 公式レポジトリページ を見ると、「stretch-slim」というタグがあり、そこにも Dockerfile のリンクがありますので中身を確認することができます。
更に下の方を見ていくと、「ENV PHP_VERSION 7.2.7」とあったり、PHP のウェブサイトからソースコードを取得していたりしているのが分かります。
以降は画面は貼り付けませんが、ダウンロードした PHP 7.2.7 のソースコードをコンパイルしてインストールしているのが分かります。
ということで、「7.2.7-cli」タグがついているイメージは問題なさそうです。
この「7.2.7-cli」というタグ で、この main.php
を実行するには、以下のコマンドを実行します。
docker run -it --rm --name my-php-script \
-v C:\\Users\\foo\\work:/usr/src/myapp \
-w /usr/src/myapp \
php:7.2.7-cli \
php main.php
これは、先程見た library/php – Docker Hub の「Run a single PHP script」に書いてあったコマンドを参考にしています。
このコマンドを最初に実行する時は、必要なイメージのダウンロード処理も行われるため少し時間が掛かると思います。しかし、2回目以降はほとんど待たされることなくコマンドが完了するはずです。コンテナ型の仮想化環境は動作がとても速いのです。
このコマンドが正常に実行できれば、以下の結果が出力されるはずです。
Current PHP version: 7.2.7
コマンドの解説
docker run
コマンドの後ろで指定している項目について説明します。
- -it
-i
オプションと-t
オプションをまとめています。- 今回のように、コンテナ内でコマンドを実行するような場合はこの2つを合わせて指定します。
- –rm
- 既にこのコンテナが存在していたら自動的に削除します。
- –name my-php-script
- コンテナに名前を割り当てます。
- 分かりやすくするために、明示的に名前を指定しているだけなので、必須ではないですし、どんな名前でもよいです。
- -v C:\\Users\\foo\\work:/usr/src/myapp
-v {ホスト側のパス}:{コンテナ側のパス}
と指定することにより、コンテナ側のパスに、ホスト側のパスをマウントします。- -w /usr/src/myapp
- コンテナ内における作業ディレクトリを指定します。コンテナに何かコマンドを実行させる場合は、ここで指定してたディレクトリにいる状態でコマンドを実行することになります。
- php:7.2.7-cli
- コンテナ生成の元になるイメージを指定しています。
- php main.php
- コンテナ内で実行するコマンドを指定しています。
少し補足すると、-v
と -w
オプションで同じパスを指定することによって、ホスト側のカレントディレクトリにそのままいるような状態でコマンドが実行できるようにしています。コマンドの最後の部分で単に「main.php」と指定するだけで済んでいるのはそのためです(カレントディレクトリに main.php が存在していることになるため)。/usr/src/myapp
というディレクトリは、この対応付けを仲介するために使われているだけなので、ここを例えば /tmp/myapp
としても問題ありません(どこでもいいわけではありませんが)。
シェルスクリプトの利用
このコマンドを毎回入力するのが面倒な場合は、シェルスクリプトにしてもよいでしょう。これなら、跡で別のタグを指定する場合も、このファイル内のタグ部分を変更するだけで対応できます。
例えば、docker-run-php.sh
という名前で以下の内容のファイルを作成します。
docker-run-php.sh
#!/bin/sh
set -eux
docker run -it --rm --name my-php-script \
-v C:\\Users\\foo\\work:/usr/src/myapp \
-w /usr/src/myapp \
php:7.2.7-cli \
php main.php
このファイルに実行権限を与えてから実行しましょう。
chmod u+x docker-run-php.sh
./docker-run-php.sh
5. PHP 7.1系統の最新バージョンで実行する
PHP 7.1系では「7.1.19-cli」というタグを使うことにします。
実行するコマンドは以下になります。
docker run -it --rm --name my-php-script \
-v C:\\Users\\foo\\work:/usr/src/myapp \
-w /usr/src/myapp \
php:7.1.19-cli \
php main.php
このコマンドを実行すると、必要なイメージがダウンロードされるわけですが、先程 PHP 7.2系統の場合と重複するイメージがあるため、その差分のダウンロードだけで済みます。
コマンドが成功すれば以下の出力が得られるでしょう。
Current PHP version: 7.1.19
6. PHP 7.0系統の最新バージョンで実行する
PHP 7.0系では「7.0.30-cli」というタグを使うことにします。
実行するコマンドは以下になります。
docker run -it --rm --name my-php-script \
-v C:\\Users\\foo\\work:/usr/src/myapp \
-w /usr/src/myapp \
php:7.0.30-cli \
php main.php
コマンドが成功すれば以下の出力が得られるでしょう。
Current PHP version: 7.0.30
7. PHP 5.6系統の最新バージョンで実行する
PHP 5.6系では「5.6.36-cli」というタグを使うことにします。
実行するコマンドは以下になります。
docker run -it --rm --name my-php-script \
-v C:\\Users\\foo\\work:/usr/src/myapp \
-w /usr/src/myapp \
php:5.6.36-cli \
php main.php
コマンドが成功すれば以下の出力が得られるでしょう。
Current PHP version: 5.6.36
8. 必要なくなったイメージを削除しておく
必要なくなったイメージは、docker rmi
コマンドで削除しておきましょう。
似たツール
複数のバージョンのPHPを使い分けたい場合、phpenv というツールも有名です。このツールであれば、最新バージョン以外のPHPバージョンも使うことができます。
当たり前ですが、目的によって使うツールを選びましょう。docker で使えるバージョンでよいのであれば、docker を使ったほうがラクな気はします。
おわりに
docker を使うといいところは、docker の使い方さえ知っていれば、PHPだろうが他のソフトウェアだろうが、同じような操作で扱えるところです。動作も速いですし、ローカルな環境を汚しません。