【 Docker環境構築 】PHP5.3 + Apache + PostgreSQL9.3

2022/03/14

大人の事情で PHP5.3 + Apache + PostgreSQL9.3 というレガシーなWEBアプリを改修する作業が発生しました。

PHP5.3 はすでに EOL(保守終了製品)を迎えているため、セキュリティホールが修正されておりません。プロダクションで使い続けるには大変よろしくありません。

Dockerで上記の環境を構築をしたのですが、このぐらい古い PHP を入れるとなるとネットの情報も少なく、いろいろ躓きました。

今時、PHP5.3 や PostgreSQL なんて使わないと思いますが、エンジニアをやっていると、こういう環境での開発作業もあったりします。

そんなわけで今回は Dcoker でレガシーな環境(PHP5.3 + Apache + PostgreSQL9.3)を構築した話をエントリーします。

 

やること

今回、レガシーなWEBアプリをローカルで構築するために Docker で以下の環境構築をする必要がありました。

  • DockerでPHP5.3 + Apache + PostgreSQL9.3の構築
  • html の拡張子で PHP を実行
  • PHPショートタグを有効

それでは順に説明をしていきます。

 

INDEX

 

1)DockerでPHP5.3 + Apache + PostgreSQL9.3の構築

Docker での PostgreSQL の構築は以下をご参照ください。

docker-compose.yml はこれをそのまま利用します。

あとは Dockerfile に PHP5.3 をインストールする記述をします。

ただ、Docker Hub にあるPHP のイメージは 5.6 までしかありません。

PHP5.3 をインストールするには CentOS6.9 で yum install php すると上手くいきます。

これは RedHat は未だに PHP5.3 をサポートしているからです。

ただ、ここでまた問題点が出てきます。

2020年11月30日をもって CentOS6 系のサポートが終了しました。

これにより、yum のリポジトリなどがすべてアーカイブに移動してしまっています。

ですので、そのまま yum install するとこけます。

yum リポジトリがアーカイブされているので、参照先を書き換えてあげる必要があります。

以上を踏まえた DockerFile が以下になります。


FROM centos:6.9

ENV PHP_VERSION 5.3.3

# 2020年11月30日 CentOS6系 のすべてのサポートが終了
# yum のリポジトリなどがすべてアーカイブに移動しているため
# デフォルトのままだとリポジトリが見つからずにエラーとなる
# yumリポジトリがアーカイブされているので、参照先を書き換える。
RUN sed -i "s|#baseurl=|baseurl=|g" /etc/yum.repos.d/CentOS-Base.repo \
  && sed -i "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-Base.repo \
  && sed -i "s|http://mirror\.centos\.org/centos/\$releasever|http://vault\.centos\.org/centos/6.9|g" /etc/yum.repos.d/CentOS-Base.repo

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd \
        zip \
        unzip \
        git \
        httpd && \
    yum clean all

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD:ローカルのファイルをDockerコンテナ内にコピーする
ADD php.ini /usr/local/etc/php/
ADD httpd.conf /etc/httpd/conf/httpd.conf

# Apache2の起動
CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

 

【 DockreFileで使う命令文 】

DockerFileで使う命令文 解説
FROM イメージを作るときに使うベースのイメージ名を書く
 
ex) ubuntu 14.04 のイメージを使う
FROM ubuntu:14.04
RUN イメージ作成時に実行するコマンドを書く
 
ex) update 後に apache2 をインストール
RUN apt-get update
RUN apt-get install apache2 -y
EXPOSE 指定のポートを外部に公開する
 
ex) 80番ポートを外部に公開する
EXPOSE 80
ENV 環境変数の設定
 
ex) PHPのバージョン指定
ENV PHP_VERSION 5.3.3
ADD ホスト側にあるファイルをイメージにコピーする
 
ex) ホスト側にある httpd.conf をコンテナ側にコピー
ADD httpd.conf /etc/httpd/conf/httpd.conf
CMD コンテナ作成時に実行されるコマンドを指定
 
ex) Apache2の起動
CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

 

2)html の拡張子で PHP を実行

今回のプロジェクトで作業するレガシーなWEBアプリですが、拡張子 html で PHP のスクリプトを実行させていました。

コンテナにコピーさせる httpd.conf(Dockerfileと同じ階層) の末尾に以下を追記します。


:
# 拡張子htmlでもphpを実行させる
<IfModule mime_module>
   AddType application/x-httpd-php .html
</IfModule>

 

3)PHPショートタグを有効

PHP における ショートタグ とは <?php って書くのを <? で書けるようにすることです。

echo するなら <?= という書き方ができます。

本来なら php.ini で short_open_tag = On と記述してあげると有効になるみたいです。

僕がやった場合、上記のやり方では動かなかったので httpd.conf に以下を追記することで動くようになりました。


: ※省略
# PHPショートタグ
php_flag short_open_tag on

PHP ショートタグをオンにすると、以下のような xml などの記述があった場合に、PHPの構文と勘違いされ、エラーが発生してしまいます。
なので、あまりよくないと言われています。


<?xml version="1.0" encoding="UTF-8" ?>

 

4)Dockerを実行してみる

 
まずは、コンテナ起動。


$ docker-compose up -d —build

 

実例

次にコンテナのOSとPHPのバージョンを確認してみます。


# WEBサービスにアクセス
$ docker-compose exec web bash

# OSとバージョンの確認
$ cat /etc/*release

# PHPのバージョン確認
$ php -v

 

実例

 
ブラウザを開いて http://localhost/db-test.html にアクセスします。

以下のような画面になればOKです。

 
次回から PostgreSQL の DB の永続化する場合は docker-compose.yml の postgres サービスにある volumes の設定を以下のように変更してください。


:
    volumes:
      # SAMPLE用 DBテーブル
      #- ./docker/initdb:/docker-entrypoint-initdb.d
      # PostgreSQLの永続化(利用する場合は上のSAMPLEをコメントアウトする)
      - /tmp/postgresql-data:/var/lib/postgresql/data:z
:

 
以上です。

Docker学習 おススメ教材(by Udemy)
動画でプログラミング学習!ドットインストール、Schoo、Udemyのどれがいい?
 
Udemyを使ったLaravel学習方法

ゼロからはじめる Dockerによるアプリケーション実行環境構築

コンテナの実行方法を学び、Ruby on RailsやDjangoといったWebアプリケーションフレームワークを使用した環境構築について学びます。Docker MachineやSwarmといったDocker関連技術についても学びます。
4.2(3552)

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-環境構築