ในบทความนี้เราจะมาแชร์วิธีการสร้าง Custom Dockerfile สำหรับ PHP 8.5 บนพื้นฐานของ Alpine Linux ที่ออกแบบมาเพื่อการพัฒนาเว็บแอปพลิเคชันและ WordPress โดยเฉพาะ โดยเลือกใช้เครื่องมือยอดนิยมอย่าง install-php-extensions ของคุณ mlocati เพื่อจัดการติดตั้ง PHP Extensions และ Xdebug ได้อย่างรวดเร็ว สะอาดหมดจด และแยกไฟล์คอนฟิก Xdebug ออกมาเป็นสัดส่วน พร้อมใช้งานร่วมกับสถาปัตยกรรมแบบ Sidecar ครับ
โครงสร้างโปรเจกต์ (Project Structure)
โครงสร้างโฟลเดอร์ฝั่ง PHP (language_php_8_5_dev) จะประกอบไปด้วยไฟล์จำเป็นสำหรับการ Build และรันเซอร์วิส ดังนี้ครับ
/Users/common/Docker/
├── .env <-- ไฟล์ตั้งค่าส่วนกลาง
.
└── language_php_8_5_dev
├── build.sh <-- สคริปต์อัตโนมัติสำหรับ Build และรัน
├── docker-compose.yml <-- ไฟล์สำหรับรัน PHP-FPM เชื่อมต่อเครือข่ายกลาง
├── Dockerfile <-- พิมพ์เขียวสร้าง Image
├── install-extensions.sh <-- สคริปต์ติดตั้ง Extension ต่าง ๆ
└── xdebug.ini <-- ไฟล์ตั้งค่า Xdebug แยกต่างหาก
ชุดไฟล์ตั้งค่าหลัก
Dockerfile
ใช้ Base Image จาก PHP 8.5-FPM บน Alpine, เรียกใช้งานสคริปต์ติดตั้ง Extension, และคัดลอกไฟล์คอนฟิก Xdebug เข้าไปในระบบ
FROM php:8.5-fpm-alpine
COPY install-extensions.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/install-extensions.sh && install-extensions.sh
# คัดลอกไฟล์ xdebug.ini แยกต่างหากไปยังโฟลเดอร์คอนฟิกของ PHP
COPY xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
WORKDIR /var/www/html
install-extensions.sh
สคริปต์อัจฉริยะที่จัดการดาวน์โหลดตัวช่วยติดตั้ง, ติดตั้ง System Utilities และ PHP Extensions ที่จำเป็นทั้งหมด (เช่น bcmath, exif, gd, intl, mysqli, opcache, pdo_mysql, zip, xdebug) พร้อมทั้งทำความสะอาดไฟล์ขยะในตัว
#!/bin/sh
set -eo pipefail
echo "==> Downloading install-php-extensions helper..."
curl -sSLf -o /usr/local/bin/install-php-extensions \
https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions
chmod +x /usr/local/bin/install-php-extensions
echo "==> Installing system utilities..."
apk add --no-cache bash git curl unzip
echo "==> Installing PHP Extensions for WordPress & Development..."
install-php-extensions \
bcmath \
exif \
gd \
intl \
mysqli \
opcache \
pdo_mysql \
zip \
xdebug
echo "==> Cleaning up installer..."
rm -f /usr/local/bin/install-php-extensions
echo "==> PHP Extensions and Xdebug installed successfully."
xdebug.ini
ไฟล์แยกสำหรับการตั้งค่า Xdebug ช่วยให้จัดการพารามิเตอร์และโหมดการดีบักได้อย่างเป็นระเบียบ
zend_extension=xdebug
xdebug.mode=debug,develop
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.discover_client_host=0
xdebug.log=/tmp/xdebug.log
build.sh
สคริปต์สั่งการแบบสะดวก (Convenience Script) ช่วยตรวจสอบ/สร้าง Docker Network (magi), จัดการ Build Docker Image พร้อมใส่ Tag ทั้ง 8.5 และ latest, และสั่งรันคอนเทนเนอร์ขึ้นมาทำงานอัตโนมัติ
#!/usr/bin/env bash
set -eo pipefail
if ! docker network inspect magi >/dev/null 2>&1; then
docker network create magi
echo "Created network: magi"
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "${SCRIPT_DIR}"
IMAGE_NAME="language_php_8_5_dev"
IMAGE_VERSION="8.5"
echo "==> Building Docker image: ${IMAGE_NAME}:${IMAGE_VERSION} and latest..."
docker build \
-t "${IMAGE_NAME}:${IMAGE_VERSION}" \
-t "${IMAGE_NAME}:latest" \
.
echo "==> Build completed successfully!"
echo "==> Starting PHP-FPM container via Docker Compose..."
docker compose up -d
echo "==> PHP service is up and running!"
docker-compose.yml
ไฟล์สำหรับรันเซอร์วิส PHP-FPM แยกออกมาเป็นอิสระ เพื่อให้สามารถนำไปจับคู่ใช้งานร่วมกับ Sidecar อื่นๆ (เช่น Nginx Reverse Proxy หรือ MariaDB) ผ่านเครือข่ายกลาง magi ได้อย่างยืดหยุ่น
services:
php:
image: language_php_8_5_dev:8.5
container_name: serv_php_8_5_fpm
restart: unless-stopped
env_file:
- ../.env
volumes:
- ./src:/var/www/html
networks:
- magi
networks:
magi:
name: magi
external: true
วิธีการใช้งาน
เมื่อเตรียมไฟล์ทั้งหมดครบถ้วนแล้ว สามารถเปิด Terminal แล้วสั่งรันผ่านสคริปต์ build.sh ได้ทันที ระบบจะจัดการ Build Image และรันคอนเทนเนอร์ให้เสร็จสรรพ
cd /Users/common/Docker/language_php_8_5_dev
chmod +x build.sh
./build.sh
จุดเด่นของแนวทางนี้
- รวดเร็วและเบาสบาย
เลือกใช้ Alpine Linux เป็นฐาน ทำให้ขนาดอิมเมจเล็กและบูตขึ้นมาทำงานได้อย่างรวดเร็ว - ไม่ต้องคอมไพล์เองให้วุ่นวาย
การใช้install-php-extensionsช่วยลดปัญหาเรื่องการจัดการ Library Dependencies ที่ซับซ้อน (เช่น libpng, freetype, icu) - แยกไฟล์คอนฟิกเป็นระเบียบ
การแยกxdebug.iniออกมาต่างหากทำให้ปรับแต่งค่าดีบักได้ง่ายและสะอาดตาขึ้น - พร้อมดีบักโค้ดทันที
เปิดใช้งานโหมดdebug,developพร้อมล็อกไฟล์ไว้ที่/tmp/xdebug.logเรียบร้อย รองรับการเชื่อมต่อกับ VS Code หรือ PhpStorm ทันที - Flexible Sidecar Support
ออกแบบให้ตัว PHP เป็น Runtime พื้นฐานที่แยกส่วนออกจาก Web Server และ Database ทำให้สามารถนำไปจับคู่รันร่วมกับ Sidecar ตัวอื่น ๆ ผ่านเครือข่ายmagiได้อย่างอิสระ
อ่านเพิ่มเติม