Docker Hub の PHP イメージ

Docker Hub の PHP イメージ

August 22, 2020
Misc
Docker, PHP

ポータブルな PHP 実行環境が欲しくて Docker Hub の PHP イメージを眺めるメモ。

https://hub.docker.com/_/php

CLI で実行するサンプル #

docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:7.4-cli php my-script.php

my-script.php は以下の通り。

<?php
echo "hello\n";

実行結果。

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:7.4-cli php my-script.php 
hello

インストール済みのモジュールや phpinfo() を確認する #

php -m
php -i

Extensions をインストールするには以下らへんが利用できるらしい。必要になった時のためにメモだけ。

  • docker-php-ext-configure
  • docker-php-ext-install
  • docker-php-ext-enable

例えば GD extension をインストールしたイメージを用意するには以下のような Dockerfile を用意すれば良いと。

FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

PECL extensions をインストールする場合はこう。

FROM php:7.4-cli
RUN pecl install redis-5.1.1 \
    && pecl install xdebug-2.8.1 \
    && docker-php-ext-enable redis xdebug

php.ini ファイル #

$PHP_INI_DIR/php.ini にある。同様に、

  • $PHP_INI_DIR/php.ini-development
  • $PHP_INI_DIR/php.ini-production

も同梱されている。 php-ini を上書きするか、これらをベースにして $PHP_INI_DIR/conf.d/ 以下に突っ込めばカスタマイズ可能。

イメージの種類 #

4つある。

  • php:<version>-cli
  • php:<version>-apache
  • php:<version>-fpm
  • php:<version>-alpine

Web サーバーサイドやるならば apache or fpm の2択。ただし fpm の方は Nginx などの Reverse Proxy を置いてあげる必要ある。

PHP 学習用のイメージ&実行方法はこれだ! #

文法や言語仕様を確認するなら CLI で良さそう。

docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:7.4-cli php my-script.php

Web サーバーサイドの場合は Apache を使う。カレントディレクトリをコンテナ側の Apache ドキュメントルートに配備します。

docker run -p 80:80 -v "$PWD":/var/www/html php:7.4-apache

確認。

$ curl http://localhost/my-script.php
hello

良さそう。

良さそうなので ~/.bash_profile に関数登録しておいた。

function php-cli {
  docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:7.4-cli php "$@"
}

function php-apache {
  docker run -p 80:80 -v "$PWD":/var/www/html php:7.4-apache
}