PHP ที่อยู่ใน repository ดีฟอลต์ของ Ubuntu 18.04 พร้อมให้ใช้คำสั่ง apt install คือเวอร์ชัน 7.2
แต่บางครั้งเราจำเป็นต้องรันโปรแกรมที่พัฒนาด้วย PHP เวอร์ชันเก่า เช่น 5 เนื่องด้วยเหตุผลบางประการ เช่น โปรแกรมนั้นเรียกใช้ฟังก์ชันแบบเก่า ที่ถูกยกเลิก (deprecated) ไปแล้วใน PHP เวอร์ชันใหม่ๆ ที่พบบ่อยคือเรียกใช้ฟังก์ชัน mysql_query() เพื่อเชื่อมต่อกับ MySQL Database
วิธีการหนึ่งที่ทำได้คือใช้ docker รัน php image เวอร์ชันที่ต้องการ ลองมาดูวิธีการใช้ docker เพื่อรัน php เวอร์ขัน 5 กัน ทั้งแบบ Command Line และแบบ FPM
ในที่นี้จะใช้ Docker Official Repository ของ PHP ซึ่งมี image ให้เลือกหลายเวอร์ชัน เราสามารถเลือกรันได้ โดยการระบุ tag ต่อท้าย php: เช่น php:5 คือรัน image เวอร์ชัน 5
รัน Docker PHP Command Line
ใช้คำสั่ง docker run ระบุชื่อ image เป็น php:5 ซึ่งถ้าดูข้อมูลบน Docker Hub แล้ว จะเป็นการรัน image แบบ cli โดยเวอร์ชันที่ได้จะเป็น 5.6.37
5.6.37-cli-stretch, 5.6-cli-stretch, 5-cli-stretch, 5.6.37-stretch, 5.6-stretch, 5-stretch, 5.6.37-cli, 5.6-cli, 5-cli, 5.6.37, 5.6, 5
ใช้คำสั่ง docker run ระบุชื่อ image และออปชันต่างๆ ตามด้วยคำสั่ง php -v เพื่อแสดงข้อมูลเวอร์ชันของ php
alice@ubuntu-1804:~$ docker run -it --rm \
php:5 \
php -v
PHP 5.6.37 (cli) (built: Jul 21 2018 10:06:59)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
คำอธิบายออปชันของคำสั่ง docker run
-i รันแบบ interactive
-t จัดการเรื่อง pseudo-TTY
–rm ลบ container โดยอัตโนมัติ หลังออกจากโปรแกรม
php:5 ระบุชื่อ image และ tag ที่ต้องการรัน ในที่นี้คือรัน PHP 5 เวอร์ชันล่าสุด
php -v รันคำสั่ง php ระบุออปชัน -v เพื่อแสดงข้อมูลเวอร์ชัน
สร้างไฟล์ php สำหรับการทดสอบ
alice@ubuntu-1804:~$ vi phpversion.php
<?php
echo phpversion() . "\n";
ถ้าเราต้องการรันไฟล์ที่เขียนนี้ ด้วย PHP 5 สามารถทำได้โดยระบุออปชัน -v และ -w เพิ่มเติม
alice@ubuntu-1804:~$ docker run -it --rm \
-v "$PWD":/usr/src/myapp \
-w /usr/src/myapp \
php:5 \
php phpversion.php
5.6.37
คำอธิบายออปชันเพิ่มเติม
-v ทำการ mount volume โดยในตัวอย่างด้านบนจะ mount พาธ $PWD หรือไดเรกทอรีปัจจุบันที่เก็บไฟล์ php ที่จะรัน เข้ากับพาธ /usr/src/myapp ใน container
-w ระบุ working directory ที่อยู่ใน container
ก็จะได้ผลลัพธ์เป็นเวอร์ชัน 5 ตามที่เราต้องการ
รัน Docker PHP 5 FPM
การรันแบบ FPM สามารถทำได้โดยระบุชื่อ image เป็น php:5-fpm ซึ่งถ้าดูข้อมูลบน Docker Hub แล้ว จะเป็นการรัน image แบบ fpm เวอร์ชันที่ได้จะเป็น 5.6.37
5.6.37-fpm-stretch, 5.6-fpm-stretch, 5-fpm-stretch, 5.6.37-fpm, 5.6-fpm, 5-fpm
ใช้คำสั่ง docker run ระบุชื่อ image เป็น php:5-fpm เพื่อรัน PHP FPM
alice@ubuntu-1804:~$ docker run --rm -p 9005:9000 \ -v /var/www/html:/var/www/html \ php:5-fpm [27-Jul-2018 16:21:47] NOTICE: fpm is running, pid 1 [27-Jul-2018 16:21:47] NOTICE: ready to handle connections
คำอธิบายออปชันเพิ่มเติม
-p 9005:9000 ระบุ publish พอร์ตรันอยู่ใน container (9000) ให้รันบน host (9005)
-v ทำการ mount volume ระหว่าง container กับ host
สำหรับการทดสอบการทำงาน php-fpm เพื่อความง่ายในที่นี้ จะใช้คำสั่ง apt install เพื่อติดตั้ง nginx ทดสอบ
alice@ubuntu-1804:~$ sudo apt install -y nginx
แก้ไขไฟล์คอนฟิก nginx เพื่อระบุว่าไฟล์ .php ให้ส่งไปรันที่พอร์ต 9005
alice@ubuntu-1804:~$ sudo vi /etc/nginx/sites-enabled/default
...
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9005;
}
...
รีสตาร์ตเซอร์วิส หลังการแก้ไขไฟล์คอนฟิก
alice@ubuntu-1804:~$ sudo systemctl restart nginx
ทดลองสร้างไฟล์ index.php เพื่อแสดงข้อมูลจากฟังก์ชัน phpinfo()
alice@ubuntu-1804:~$ sudo vi /var/www/html/index.php
<?php
phpinfo();
ตัวอย่างผลลัพธ์ของการเปิดบน browser