跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

Best Practices สำหรับ Docker ใน PHP Development

บทความนี้กล่าวถึงแนวทางปฏิบัติที่ดีที่สุดในการใช้ Docker สำหรับพัฒนาแอปพลิเคชัน PHP โดยเน้นที่การสร้าง Image ที่มีขนาดเล็กและปลอดภัยด้วยเทคนิค Multi-Stage Build...

Best Practices สำหรับ Docker ใน PHP Development

มาถึงบทที่ 9 ของซีรีส์ Docker สำหรับนักพัฒนา PHP กันแล้วครับ ในบทนี้เราจะมาพูดถึงแนวทางปฏิบัติที่ดีที่สุด (Best Practices) ในการใช้ Docker เพื่อพัฒนาแอปพลิเคชัน PHP ของเราให้มีประสิทธิภาพ ปลอดภัย และง่ายต่อการดูแลรักษามากขึ้น ซึ่งเป็นสิ่งสำคัญมากเมื่อเราเริ่มใช้งาน Docker ในสภาพแวดล้อมจริงจัง

ในบทก่อนหน้านี้ เราได้เรียนรู้เรื่อง Docker Networks ซึ่งเป็นพื้นฐานสำคัญในการเชื่อมต่อ Container ต่างๆ ให้ทำงานร่วมกันได้ ในบทนี้เราจะเน้นไปที่การปรับปรุง Image และ Container ของเราให้ดีที่สุดครับ

Multi-Stage Builds: สร้าง Image ที่เล็กและเบา

Multi-Stage Builds คือเทคนิคการสร้าง Docker Image ที่ช่วยให้เราสามารถลดขนาดของ Image ได้อย่างมาก โดยการแบ่งกระบวนการสร้าง Image ออกเป็นหลายๆ Stage แต่ละ Stage จะมีหน้าที่เฉพาะ เช่น Stage แรกใช้สำหรับการ Compile โค้ด Stage ที่สองใช้สำหรับการติดตั้ง Dependencies และ Stage สุดท้ายใช้สำหรับการ Copy ไฟล์ที่จำเป็นไปยัง Image สุดท้าย

ทำไมต้องใช้ Multi-Stage Builds?

  • ลดขนาด Image: Image ที่มีขนาดเล็กกว่าจะดาวน์โหลดและ Deploy ได้เร็วกว่า
  • เพิ่มความปลอดภัย: Image ที่มีขนาดเล็กกว่ามักจะมีช่องโหว่น้อยกว่า เพราะมี Libraries และ Tools น้อยกว่า
  • ลดความซับซ้อน: แยกขั้นตอนการ Build ออกเป็นส่วนๆ ทำให้ Dockerfile อ่านง่ายและแก้ไขได้ง่าย

ตัวอย่างการใช้งาน Multi-Stage Builds ใน PHP

สมมติว่าเรามีแอปพลิเคชัน PHP ที่ต้องใช้ Composer ในการจัดการ Dependencies เราสามารถใช้ Multi-Stage Builds เพื่อสร้าง Image ที่มีเฉพาะไฟล์ PHP และ Dependencies ที่จำเป็นเท่านั้น โดยไม่ต้องรวม Composer เข้าไปใน Image สุดท้าย

# Stage 1: Build Stage (ใช้สำหรับ Compile และติดตั้ง Dependencies)
FROM composer:latest AS composer

WORKDIR /app

COPY composer.json composer.lock ./

RUN composer install --no-dev --optimize-autoloader

# Stage 2: Production Stage (สร้าง Image สุดท้าย)
FROM php:8.1-fpm-alpine

WORKDIR /var/www/html

# Copy ไฟล์ PHP จาก Stage 1
COPY --from=composer /app ./

# Copy ไฟล์ Configuration และ Assets อื่นๆ
COPY . ./

# ติดตั้ง PHP Extensions ที่จำเป็น
RUN docker-php-ext-install pdo pdo_mysql

# กำหนด User และ Group (จะกล่าวถึงในหัวข้อถัดไป)
USER www-data:www-data

EXPOSE 9000

CMD ["php-fpm"]

คำอธิบาย:

  • FROM composer:latest AS composer: เริ่มต้น Stage แรกโดยใช้ Image composer:latest จาก Docker Hub และตั้งชื่อ Stage นี้ว่า composer
  • WORKDIR /app: กำหนด Working Directory ใน Container เป็น /app
  • COPY composer.json composer.lock ./: Copy ไฟล์ composer.json และ composer.lock ไปยัง Working Directory
  • RUN composer install --no-dev --optimize-autoloader: ติดตั้ง Dependencies โดยไม่รวม Development Dependencies และ Optimize Autoloader
  • FROM php:8.1-fpm-alpine: เริ่มต้น Stage ที่สองโดยใช้ Image php:8.1-fpm-alpine ซึ่งเป็น Image PHP ที่มีขนาดเล็ก
  • COPY --from=composer /app ./: Copy ไฟล์จาก Stage แรก (composer) ไปยัง Working Directory ใน Stage ที่สอง
  • COPY . ./: Copy ไฟล์ PHP และ Assets อื่นๆ จาก Host Machine ไปยัง Working Directory
  • RUN docker-php-ext-install pdo pdo_mysql: ติดตั้ง PHP Extensions ที่จำเป็น
  • USER www-data:www-data: กำหนด User และ Group ที่ใช้รัน Process (จะกล่าวถึงในหัวข้อถัดไป)
  • EXPOSE 9000: เปิด Port 9000 สำหรับ PHP-FPM
  • CMD ["php-fpm"]: กำหนด Command ที่ใช้รัน Container

ด้วย Multi-Stage Builds เราสามารถสร้าง Image ที่มีขนาดเล็กกว่าเดิมได้อย่างมาก โดยไม่ต้องรวม Composer และ Development Dependencies เข้าไปใน Image สุดท้าย

Non-Root User: ป้องกัน Container จากการถูกโจมตี

โดยปกติแล้ว Container จะรันด้วย User root ซึ่งมีความเสี่ยงด้านความปลอดภัย หาก Container ถูกโจมตี Hacker อาจสามารถเข้าถึง Host Machine ได้ด้วยสิทธิ์ root

ทำไมต้องใช้ Non-Root User?

  • ลดความเสี่ยงด้านความปลอดภัย: Hacker จะไม่สามารถเข้าถึง Host Machine ได้ด้วยสิทธิ์ root
  • เพิ่มความน่าเชื่อถือ: Container ที่รันด้วย Non-Root User จะมีความน่าเชื่อถือมากกว่า

วิธีการใช้งาน Non-Root User ใน Dockerfile

FROM php:8.1-fpm-alpine

# สร้าง User และ Group
RUN addgroup -g 1000 www-data && \
    adduser -u 1000 -D -G www-data www-data

# กำหนด Ownership ของ Directory
RUN chown -R www-data:www-data /var/www/html

# กำหนด User และ Group ที่ใช้รัน Process
USER www-data:www-data

WORKDIR /var/www/html

COPY . ./

EXPOSE 9000

CMD ["php-fpm"]

คำอธิบาย:

  • RUN addgroup -g 1000 www-data && adduser -u 1000 -D -G www-data www-data: สร้าง Group ชื่อ www-data ด้วย Group ID 1000 และสร้าง User ชื่อ www-data ด้วย User ID 1000 และเพิ่ม User นี้เข้าไปใน Group www-data
  • RUN chown -R www-data:www-data /var/www/html: กำหนด Ownership ของ Directory /var/www/html ให้กับ User www-data และ Group www-data
  • USER www-data:www-data: กำหนด User และ Group ที่ใช้รัน Process เป็น www-data

การรัน Container ด้วย Non-Root User เป็นแนวทางปฏิบัติที่ดีที่ช่วยเพิ่มความปลอดภัยให้กับแอปพลิเคชันของเรา

Security Considerations: ความปลอดภัยที่ต้องคำนึงถึง

นอกจากการใช้ Non-Root User แล้ว ยังมี Security Considerations อื่นๆ ที่เราต้องคำนึงถึงในการใช้ Docker สำหรับ PHP Development

  • Update Image อย่างสม่ำเสมอ: อัปเดต Base Image (เช่น php:8.1-fpm-alpine) เป็นเวอร์ชันล่าสุดเสมอ เพื่อให้ได้รับ Security Patches และ Bug Fixes
  • ใช้ Verified Images: เลือกใช้ Images จาก Official Repositories หรือ Repositories ที่ได้รับการ Verified จาก Docker Hub
  • Scan Image เพื่อหา Vulnerabilities: ใช้ Tools เช่น docker scan หรือ Clair เพื่อ Scan Image หาช่องโหว่ด้านความปลอดภัย
  • จำกัด Resources: กำหนด Resource Limits (CPU, Memory) ให้กับ Container เพื่อป้องกัน Denial-of-Service Attacks
  • ใช้ Secrets Management: จัดการ Secrets (เช่น Password, API Key) อย่างปลอดภัย โดยใช้ Docker Secrets หรือ Tools อื่นๆ เช่น HashiCorp Vault
  • Monitor Container Logs: ตรวจสอบ Container Logs อย่างสม่ำเสมอ เพื่อตรวจจับกิจกรรมที่น่าสงสัย

การคำนึงถึง Security Considerations เหล่านี้ จะช่วยให้เราสร้างและ Deploy แอปพลิเคชัน PHP ด้วย Docker ได้อย่างปลอดภัยยิ่งขึ้น

สรุป

ในบทนี้เราได้เรียนรู้เกี่ยวกับ Best Practices สำหรับ Docker ใน PHP Development ซึ่งประกอบด้วย Multi-Stage Builds, Non-Root User, และ Security Considerations การนำแนวทางเหล่านี้ไปปรับใช้ จะช่วยให้เราสร้าง Image ที่มีขนาดเล็ก ปลอดภัย และง่ายต่อการดูแลรักษา

ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการ Deploy แอปพลิเคชัน PHP ด้วย Docker ซึ่งเป็นขั้นตอนสุดท้ายในการนำแอปพลิเคชันของเราไปใช้งานจริง

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务