php-fpmだけDockerでコンテナ化したweb環境を構築する(cakephp1.3をDockerコンテナのphp-fpm5.4で動かす)

AlmaLinux9
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。

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のリポジトリを追加してインストールします

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Dockerの起動・自動起動設定をします

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# systemctl start docker
# systemctl enable docker
# systemctl start docker # systemctl enable docker
# systemctl start docker
# systemctl enable docker

Docker imageの取得

php-fpm5.4のイメージをDocker Hubから取得します
公式のphp-fpmのイメージを取得したかったですが、さすがにサポート切れなので配布していません
今回はexozet/php-fpm:5.4というイメージを使わせていただくことにしました

https://hub.docker.com/layers/exozet/php-fpm/5.4/images/sha256-5696015dd531ba8a548a0222c944318467324b992d0c7ea127c270ea06a12282?context=explore

コマンドでイメージを取得します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# docker pull exozet/php-fpm:5.4
# docker pull 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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# mkdir /etc/docker
# mkdir /etc/docker/php-fpm
# mkdir /etc/docker # mkdir /etc/docker/php-fpm
# mkdir /etc/docker
# mkdir /etc/docker/php-fpm

Dockerfileの作成

Dockerfileは、取得したイメージにカスタマイズを加えて自分でイメージを再作成します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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/
# 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/
# 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を作成します
各数値は必要に応じて変更してください

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# /etc/docker/php-fpm/php.ini
post_max_size = 5M
upload_max_filesize = 5M
memory_limit = 256M
date.timezone = Asia/Tokyo
# /etc/docker/php-fpm/php.ini post_max_size = 5M upload_max_filesize = 5M memory_limit = 256M date.timezone = Asia/Tokyo
# /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のパス指定等)を記載します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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
# 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
# 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.yamlのversionがobsoleteという警告がでるようになったので、不要になっていたのはいつからか調べた - @znz blog
docker compose が最近のバージョンで 'version' is obsolete という警告がでるようになったので、警告にしたがって単純に削除する前に、いつから意味がないものになっていたのかを調べました。


コンテナ作成

まずdocker-compose.ymlのあるディレクトリに移動します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# cd /etc/docker
# cd /etc/docker
# cd /etc/docker

コマンドでコンテナをビルドします

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# docker compose up --build -d
# docker compose up --build -d
# docker compose up --build -d

-dオプションをつけないと、プロンプトが返ってこずフリーズしたように見えたので付けました
docker compose コマンドを「docker-compose」と記述するとエラーになります
この記述は旧バージョンのもので、今はハイフン必要ないみたいです

カスタマイズされたイメージとコンテナが作成されますので確認します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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 image ls REPOSITORY TAG IMAGE ID CREATED SIZE php54 5.4 7566beabffff 2 weeks ago 1.07GB ← カスタマイズしたイメージ exozet/php-fpm 5.4 ← DockerHubで取得したオリジナルのイメージ
# docker image ls
REPOSITORY       TAG         IMAGE ID       CREATED       SIZE
php54            5.4         7566beabffff   2 weeks ago   1.07GB ← カスタマイズしたイメージ
exozet/php-fpm   5.4 ← DockerHubで取得したオリジナルのイメージ

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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 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 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

無事作成できました
ちなみに、コンテナを停めたくなった時は下記のコマンドで停まります

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# docker container stop [コンテナ名]
# docker container stop [コンテナ名]
# docker container stop [コンテナ名]

docker container lsで確認したコンテナ名は「bfeb51586b1c」でしたので本環境では下記の通りです
docker container stop bfeb51586b1c

dockerコンテナに入ってコマンド操作する場合は下記コマンドを実行します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# docker exec -it [コンテナ名] bash
# docker exec -it [コンテナ名] bash
# docker exec -it [コンテナ名] bash

コンテナ名は「bfeb51586b1c」でしたので本環境では下記の通りです
docker exec -it bfeb51586b1c bash

プロンプトが下記の通り変わります
せっかくなので、docker-compose.ymlでマウントしたドキュメントルートを表示してみます

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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」です

インストール - 1.3
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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>
# 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>
# 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を再起動します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# systemctl restart httpd
# systemctl restart httpd
# systemctl restart httpd

cakephpのデータベース接続先変更

cakephpでデータベース接続をしているphpファイルを探し、その接続先を変更します
例としてdatabase.phpの接続先変更します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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'
);
}
# 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' ); }
# 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」に変更します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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'
);
}
# 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' ); }
# 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を作成します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# vi /var/www/html/test.php
<?php
phpinfo();
?>
# vi /var/www/html/test.php <?php phpinfo(); ?>
# 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を使用して表示出来ていることがわかります

参考

AlmaLinux 9.1にDockerをインストールする
目次 はじめにDockerAlmalinux関連記事動作環境インストール方法Dockerのリポジトリからインストールするリポジトリの登録Docker Engineのインストール動作確認インストール後の設定非rootユーザ
【入門】Dockerログ(logsコマンド)の基本的な使い方と注意点 - カゴヤのサーバー研究室
Dockerを使っていて、ログを調べる必要性が生じるシーンも少なくはないでしょう。Dockerでは、コンテナのログを簡単にみられる機能(logsコマンド)も用意 Dockerを使っていて、ログを調べる必要性が生じるシーンも少なくはないでしょ...
DOCKERでPHPだけ動かす – arigato.es
【Docker】初心者はdocker-composeから始めた方がいいかもしれない説【チャーハン例えをお借りして】
個人開発なら使わなくてもいいけれど、 チーム開発ならぜひ使いたい便利ツールといえばやっぱり『Docker(ドッ…
【Docker】初めてのdockerでimageまで作成 - Qiita
ここを読んで覚えていったことを書いていってます!他参考サイト…
Dockerのイメージ/コンテナのライフサイクルと基本操作【初心者OK!Docker入門+応用シリーズ】 - Qiita
はじめに本記事は 「初心者OK!Docker入門+応用:ゼロからでも実務で使えるスキルが身に付ける」 のシリーズ記事の1つです。「初心者OK!Docker入門+応用:ゼロからでも実務で使えるスキ…
インストール - 1.3
Access host database from a docker container
If I have a mysql database running on some host machine, and that host is also running a docker container: How would I a...
docker-compose.yml ネットワーク周りの覚え書き - Qiita
概要Dockerコンテナ内からホストにアクセスする方法(Linux)docker-composeでコンテナのIPアドレスを固定する方法Dockerコンテナ内からホストにアクセスする方法(Lin…

コメント

タイトルとURLをコピーしました