プログラミング

Docker を使って特定のバージョンのPHPコマンドを実行する方法

投稿日:2018年7月20日 更新日:

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 は対象外になります)。
docker

WSL の docker client から、Docker for Windows の docker daemon を使う手順

2018.07.19
  • 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 が公式に公開しているレポジトリページを眺めます。

どんなタグがあるか見ておきましょう。

サポート中のバージョンの中で、それぞれ最新バージョンが使えることが分かります。

library/php – Docker Hub

Run a single PHP script」という項目には、特定のPHPファイルを実行するコマンド例が載っています。これを参考にすると良さそうです。

Run a single PHP script
Run a single PHP script

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だろうが他のソフトウェアだろうが、同じような操作で扱えるところです。動作も速いですし、ローカルな環境を汚しません。

参考

📂-プログラミング

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

JavaScript

WebSocket を使ったサンプルプログラムを作りました

目次1. はじめに2. スクリーンショット3. 動作4. 大まかな動作イメージ 1. はじめに WebSocket を使ったサンプルページを作りました。Node.js を使っています。 ソースコードは …

web development

Web Development for Beginners を読む:レッスン3

目次1. はじめに2. Lesson 3: Creating Accessible WebpagesTools to useScreen readersContrast checkersLightho …

Milkcocoa のチュートリアルを試す

Milkcocoa のチュートリアルをやってみました。 目次Milkcocoa とは?チュートリアル1. アカウント登録する2. ログインする3. アプリを作成する4. スマートフォン側のWebページ …

Homestead + Xdebug + PhpStorm でリモートデバッグ環境をつくる

目次1. はじめに1. Homestead とは?2. Xdebug とは?3. PhpStorm とは?2. 今回の環境3. Homestead 側の設定4. Windows側の設定1. PHPの導 …

プログラミング

アルゴリズムの計算量

アルゴリズムの計算量について説明しています。