2022/03/14
大人の事情で PHP5.3 + Apache + PostgreSQL9.3 というレガシーなWEBアプリを改修する作業が発生しました。
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(Docker Compose)で PostgreSQL + pgAdmin を構築
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"]
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
なので、あまりよくないと言われています。
<?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
:
以上です。
Udemyを使ったLaravel学習方法
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。