PlusMagi's Blog By Pitt Phunsanit Docker,PHP สร้าง Custom PHP 8.5 Development Environment บน Alpine ด้วย mlocati และ Xdebug

สร้าง Custom PHP 8.5 Development Environment บน Alpine ด้วย mlocati และ Xdebug

ในบทความนี้เราจะมาแชร์วิธีการสร้าง 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 ได้อย่างอิสระ

อ่านเพิ่มเติม

Tags: