รัน PHP 5 บน Ubuntu 18.04 ด้วย Docker

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

ข้อมูลจาก Docker Hub

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

ข้อมูลจาก Docker Hub

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

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.