Dockerを使用した複数のホストPHPバージョン

多くの場合、PHP開発者には、インタープリターのいくつかのバージョンでWebアプリケーションの動作をテストするタスクがあります。 さまざまな方法で解決できます。 1つのホストに異なるバージョンのPHPをインストールできますが、これにはライブラリの競合やその他の問題が伴います。 2番目の極端な方法は、異なる環境で複数の分離された仮想マシンを作成することですが、ここでは、ハードウェアリソースを過剰に使用し、作業環境を展開するために不必要な時間を浪費せずにはできません。 現時点では、この問題を解決する最も簡単な方法はDockerを使用することです。



画像



以下では、Nginx + PHP-FPMバンドルがスタックとして使用されるUbuntu 18の実用的なソリューションについて説明します。 このソリューションは簡単に拡張できます。PHP-FPMを使用したコンテナはメモリを300 MBしか使用せず、3つのコマンドで他のバージョンのインタープリターを使用してコンテナを追加できます(または、好みに応じて実行できます)。 このソリューションの2番目の利点は、インタープリターが異なるコンテナーに既に配置されているため、開発者がWebサーバーを切り替える必要がないことです(アプリケーションコードは同じです)。



追加:コメントから判断すると、一部の読者は、説明したソリューションがどのような場合に適しているか理解していませんでした。 したがって、次のすべてが開発者のワークステーションでの使用のみを目的としており、一部の予約があるステージサーバーにも適している可能性があることに注意してください。



それでは始めましょう...



1. Dockerをインストールする



sudo apt update sudo apt install ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce
      
      





2.必要なバージョンのPHPを使用してコンテナーをインストールします



作業環境を作成する例として、公式のPHP Dockerリポジトリの PHPバージョン7.1および7.2 が使用されました 。 同様に、イメージがある場合は、任意のバージョンのPHPをインストールできます。



 sudo docker pull php:7.1.25-fpm-stretch sudo docker create --name=fpm71 -p 127.0.0.1:9071:9000 -v /var/www:/var/www php:7.1.25-fpm-stretch sudo docker start fpm71 sudo docker pull php:7.2.13-fpm-stretch sudo docker create --name=fpm72 -p 127.0.0.1:9072:9000 -v /var/www:/var/www php:7.2.13-fpm-stretch sudo docker start fpm72
      
      





PHP-FPMはデフォルトでポート9000で実行されます。 イメージを作成するときに、9000番目のコンテナーポートを無料の9071および9072ホストマシンポートに公開しました(番号は非特権範囲から任意に取得されます)。 さらに、PHPを処理する要求をこれらのポート(Nginx仮想ホスト構成のfastcgi_passパラメーター)にプロキシします。



また、コンテナ内にプロジェクトディレクトリ(/ var / www)をスローする必要がありました。そうしないと、PHP-FPMはファイルが表示されないことを誓います(この瞬間をより良く/より正確にする方法を知っているなら、コメントを書いてください)。



コンテナが実行されており、ポートが正しく公開されていることを確認します。



 sudo docker ps -a sudo netstat -lpn
      
      







3.仮想ホストの環境をセットアップする



/ etc / hostsに行を追加します。

 127.0.0.1 project.local.php71 ### php 7.1 127.0.0.1 project.local.php72 ### php 7.2
      
      





プロジェクトのディレクトリを作成します。



 sudo mkdir -p /var/www/project.local echo '<?php phpinfo(); ?>' | sudo tee /var/www/project.local/index.php
      
      





プロジェクト(project.local)と仮想ホスト(project.local.php71 / 72)の名前を取りましたが、便利な名前を使用できます(仮想ホストの設定を忘れずに変更してください)。



最初に、phpinfoコマンドを1つだけインデックスファイルに追加しました。システムの状態を設定して確認した後、index.phpをプロジェクトで使用されているものに置き換える必要があります。



4. nginxをインストールし、仮想ホストを構成します



 sudo apt install nginx
      
      





最初の仮想ホストの説明を含むファイル/etc/nginx/sites-available/project.local.php71を作成します(PHP v.7.1でのプロジェクトの動作を確認するために使用されます)。



 server { listen 80; server_name project.local.php71; index index.php; root /var/www/project.local; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9071; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
      
      





同様に、2番目の仮想ホストの/etc/nginx/sites-available/project.local.php72ファイル:



 server { listen 80; server_name project.local.php72; index index.php; root /var/www/project.local; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9072; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
      
      





ここで、仮想ホストの上記の構成へのシンボリックリンクを作成し、Nginxをオーバーロードします。



 cd /etc/nginx/sites-enabled sudo ln -s ../sites-available/project.local.php71 sudo ln -s ../sites-available/project.local.php72 sudo systemctl reload nginx
      
      





5.チェック



 curl --silent http://project.local.php71/index.php | grep -o "PHP Version [0-9\.]\{1,\}" curl --silent http://project.local.php72/index.php | grep -o "PHP Version [0-9\.]\{1,\}"
      
      





その結果、PHPバージョンを取得する必要があります(異なるバージョンのインタープリターがphpinfoコマンドを処理した結果)。



これで、プロジェクトを/var/www/project.localフォルダーにアップロードするだけで、 http://project.local.php71の PHP 7.1インタープリターとhttp://project.local.php71の PHP 7.2で動作を確認できます。



追加資料

1. 完全なDocker実践ガイド



All Articles