cakephp1.3で構築しているアプリケーションがあり、それを動かすためにphp5.4を使用する必要があります
php5.4はサポートが切れております
また、cakephp1.3を使用しているのはほんの一部のサイトだけなので、基本は最新のphpで動作させたいです
そこで、Dockerでphp-fpm5.4のコンテナを作成し、cakephp1.3のサイトではコンテナのphpを使用し、それ以外のサイトではすでにサーバーインストール済の最新のphpを使用することとしました
(dockerコンテナにはapacheとmariadbは入れず、同一サーバー内のホスト上にインストールされているものを使用します)
現在のホスト環境
webサーバーは現在下記の通り構築されています
OS:AlmaLinux9
Apache2.4
mariadb11.4
php8.3
cakephp1.3(動かない)
ここにDockerをインストールし、php5.4のコンテナを作成します
Dockerのバージョンは27.0.3です
やりたいことの構成図
・WebサーバーとDockerホストは同一サーバーです
・cakephp1.3は/var/www/html/testで使用します、ここにアクセスするときだけコンテナのphp-fpm5.4を使用します
・上記以外のサイトではwebサーバー内のphp8.3を使用します
Docker構築
Dockerインストール
Dockerのリポジトリを追加してインストールします
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Dockerの起動・自動起動設定をします
# systemctl start docker # systemctl enable docker
Docker imageの取得
php-fpm5.4のイメージをDocker Hubから取得します
公式のphp-fpmのイメージを取得したかったですが、さすがにサポート切れなので配布していません
今回はexozet/php-fpm:5.4というイメージを使わせていただくことにしました
コマンドでイメージを取得します
# docker pull exozet/php-fpm:5.4
Dockerの作業用ディレクトリ作成
ディレクトリ構成は下記のようにします
docker-compose.ymlやDockerfileってなんぞやは後で説明します
/etc/docker
- docker-compose.yml
/php-fpm
- Dockerfile
- php.ini
# mkdir /etc/docker # mkdir /etc/docker/php-fpm
Dockerfileの作成
Dockerfileは、取得したイメージにカスタマイズを加えて自分でイメージを再作成します
# vi /etc/docker/php-fpm/Dockerfile FROM exozet/php-fpm:5.4 RUN echo -e "\n\ alias ll='ls -la --color'\n\ " >> /root/.bashrc RUN rm /bin/sh && ln -s /bin/bash /bin/sh ENV TZ='Asia/Tokyo' COPY php.ini /usr/local/etc/php/
先ほどDockerHubで取得したイメージのリポジトリ:タグ名を指定しています
FROM exozet/php-fpm:5.4
下記はコンテナ内でlsコマンドを使用したかったので入れています
RUN echo -e “\n\
alias ll=’ls -la –color’\n\
” >> /root/.bashrc
タイムゾーンを指定します
ENV TZ=’Asia/Tokyo’
Dockerfileと同ディレクトリに保存しているphp.iniをコンテナの/usr/local/etc/php/にコピーします
COPY php.ini /usr/local/etc/php/
php.iniの作成
コンテナで使用するphp.iniを作成します
各数値は必要に応じて変更してください
# /etc/docker/php-fpm/php.ini post_max_size = 5M upload_max_filesize = 5M memory_limit = 256M date.timezone = Asia/Tokyo
docker-compose.ymlの作成
docker-compose.ymlにはコンテナを起動するための情報(ポートやボリュームのマッピング情報等)やDockerイメージをビルドするための情報(DockerFileのパス指定等)を記載します
# vi /etc/docker/docker-compose.yml services: app: build: context: ./php-fpm # Dockerfileの場所 dockerfile: Dockerfile image: php54:5.4 # 作成するイメージのリポジトリ:タグ名(任意の名前でよい) ports: - 9001:9000 # 使用するホストサーバーのポート:コンテナのポート extra_hosts: - host.docker.internal:host-gateway # ホストサーバーのデータベースとの接続に必要 volumes: - /var/www/html/test:/var/www/html/test
portsでホストサーバーのポートを9000にしなかったのは、別のアプリケーションで使用するためです
そのため9001にしていますが、9000が空いている場合は9000でよいと思います
host.docker.internal:host-gatewayはコンテナ⇒ホストサーバーへの接続に使用します
ホストサーバー⇒コンテナへは上記に記載したポートの紐づけで接続できますが、
コンテナ⇒ホストサーバーは別で設定が必要です
アクセス先にlocalhostや127.0.0.1を指定しても接続できません
「host.docker.internal:host-gateway」と指定してあげることで、「host.docker.internal」でホストサーバーへ名前解決できるようになります
固定IPアドレスをコンテナに設定したりする必要はありません
余談ですが、下記の場合コンテナ作成の際にエラーが発生するのでご注意ください
・インデントがずれている
・「Version」を宣言する
※以前は文頭で「Version」を宣言する必要がありましたが、現在のバージョンでは不要になっています
コンテナ作成
まずdocker-compose.ymlのあるディレクトリに移動します
# cd /etc/docker
コマンドでコンテナをビルドします
# docker compose up --build -d
-dオプションをつけないと、プロンプトが返ってこずフリーズしたように見えたので付けました
docker compose コマンドを「docker-compose」と記述するとエラーになります
この記述は旧バージョンのもので、今はハイフン必要ないみたいです
カスタマイズされたイメージとコンテナが作成されますので確認します
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE php54 5.4 7566beabffff 2 weeks ago 1.07GB ← カスタマイズしたイメージ exozet/php-fpm 5.4 ← DockerHubで取得したオリジナルのイメージ
# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bfeb51586b1c php54:5.4 "php-fpm" 22 hours ago Up 22 hours 0.0.0.0:9001->9000/tcp, :::9001->9000/tcp docker-app-1
無事作成できました
ちなみに、コンテナを停めたくなった時は下記のコマンドで停まります
# docker container stop [コンテナ名]
docker container lsで確認したコンテナ名は「bfeb51586b1c」でしたので本環境では下記の通りです
docker container stop bfeb51586b1c
dockerコンテナに入ってコマンド操作する場合は下記コマンドを実行します
# docker exec -it [コンテナ名] bash
コンテナ名は「bfeb51586b1c」でしたので本環境では下記の通りです
docker exec -it bfeb51586b1c bash
プロンプトが下記の通り変わります
せっかくなので、docker-compose.ymlでマウントしたドキュメントルートを表示してみます
root@bfeb51586b1c:/usr/src/app# ll /var/www/html/test/ total 24 drwxr-xr-x 6 48 48 160 Jul 2 15:58 . drwxr-xr-x 8 48 48 249 Jul 5 14:50 .. -rw-r--r-- 1 48 48 41 Jun 14 16:41 .gitignore -rw-r--r-- 1 48 48 145 Jul 2 15:58 .htaccess -rw-r--r-- 1 48 48 67 Jun 14 16:41 .travis.yml -rw-r--r-- 1 48 48 1055 Jun 14 16:41 README drwxr-xr-x 13 48 48 195 Jul 2 15:57 app drwxr-xr-x 6 48 48 159 Jul 2 16:46 cake -rw-r--r-- 1 48 48 1848 Jun 14 16:41 index.php -rw-r--r-- 1 48 48 23 Jun 20 15:04 info.php drwxr-xr-x 2 48 48 19 Jun 17 13:47 plugins drwxr-xr-x 3 48 48 20 Jun 17 13:47 vendors
設定どおりマウントできていますね
apache設定変更
コンテナを作成しましたので、/var/www/html/testをコンテナのphp-fpm5.4を使用するように設定変更します
参考までに、cakephpのドキュメントルートは「app/webroot」です
# vi /etc/httpd/conf.d/test.conf <Directory /var/www/html/test/app/webroot> DirectoryIndex index.php Options FollowSymLinks <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9001" </FilesMatch> </Directory>
ホストサーバー⇒コンテナへの接続を「SetHandler “proxy:fcgi://127.0.0.1:9001″」で指定しています
docker-compose.ymlで、ホストサーバーのマウント先ポートを9001で設定したためです
httpdを再起動します
# systemctl restart httpd
cakephpのデータベース接続先変更
cakephpでデータベース接続をしているphpファイルを探し、その接続先を変更します
例としてdatabase.phpの接続先変更します
# vi /var/www/html/test/app/config/database.php class DATABASE_CONFIG { var $default = array( 'driver' => 'mysqli', 'persistent' => false, 'host' => 'localhost', 'port' => '3306', 'login' => 'test', 'password' => 'password', 'database' => 'test', 'prefix' => '', 'encoding' => 'utf8' ); }
「’host’ => ‘localhost’,」となっていますがコンテナ⇒ホストサーバーへはlocalhostや127.0.0.1では接続できないという話を先ほどしました通り、これでは接続ができません
「host.docker.internal」に変更します
# vi /var/www/html/test/app/config/database.php class DATABASE_CONFIG { var $default = array( 'driver' => 'mysqli', 'persistent' => false, 'host' => 'host.docker.internal', ← 変更 'port' => '3306', 'login' => 'test', 'password' => 'password', 'database' => 'test', 'prefix' => '', 'encoding' => 'utf8' ); }
webサイト接続
まずは/var/www/htmlがphp8.3で表示されることを確認します
phpinfoを表示するtest.phpを作成します
# vi /var/www/html/test.php <?php phpinfo(); ?>
https://[サーバー名]/test.phpに接続します
バージョンが8.3.xと表示されればphp8.3で表示出来ています
最後に/var/www/html/testがphp-fpm5.4で表示されることを確認します
先ほど同様にドキュメントルートにinfo.phpを表示するphpを置いて使用しているバージョンを確認してもよいのですが、
サイト自体が正しく表示されることも確認したいので「https://[サーバー名]/test/」にアクセスします
サイトが表示できたら、開発ツールを起動(Chromeの場合はF11)します
ネットワークタブをクリックした上、F5でページをリロードします
表示されているページで使用しているphpファイル(本サイトではindex.php)を名前からクリックし、応答ヘッダーを確認します
「X-Powered-By」に使用しているphpのバージョンが5.4.xと表示されていればコンテナのphpを使用して表示出来ていることがわかります
コメント