跳到主要内容

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

系统指南 内容已审核

Dockerfile คืออะไร? สร้าง Dockerfile แรกสำหรับ PHP

Dockerfile คืออะไร? สร้าง Dockerfile แรกสำหรับ PHP

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

Dockerfile คืออะไร?

Dockerfile เปรียบเสมือน "พิมพ์เขียว" หรือ "สูตรอาหาร" ที่บอก Docker ว่าจะสร้าง Image อย่างไร ภายใน Dockerfile จะประกอบไปด้วยชุดคำสั่ง (instructions) ที่ Docker จะอ่านและ execute เพื่อสร้าง Image ตามที่เราต้องการ

คิดง่ายๆ ว่า ถ้าเราต้องการทำอาหาร Dockerfile ก็เหมือนกับสูตรอาหารที่บอกว่าต้องเตรียมวัตถุดิบอะไรบ้าง (เช่น PHP version, extension ที่ต้องติดตั้ง), ต้องทำอะไรบ้าง (เช่น copy ไฟล์ source code, set permission) และสุดท้ายอาหาร (Image) ที่ได้จะมีหน้าตาเป็นอย่างไร

ทำไมต้องมี Dockerfile?

การใช้ Dockerfile ช่วยให้เราสามารถสร้าง Image ที่มีสภาพแวดล้อม (environment) ที่เหมือนกันได้ทุกครั้ง ไม่ว่าเราจะสร้าง Image บนเครื่องไหน หรือบน Server ไหนก็ตาม ทำให้มั่นใจได้ว่าแอปพลิเคชัน PHP ของเราจะทำงานได้อย่างถูกต้องและสม่ำเสมอ

นอกจากนี้ Dockerfile ยังช่วยให้เราสามารถ version control การเปลี่ยนแปลงของ environment ได้ด้วย ทำให้เราสามารถย้อนกลับไปใช้ environment เวอร์ชั่นเก่าได้หากมีปัญหาเกิดขึ้น

คำสั่งพื้นฐานใน Dockerfile ที่ควรรู้

ใน Dockerfile มีคำสั่ง (instruction) มากมายให้เราเลือกใช้ แต่ในบทนี้เราจะมาเรียนรู้คำสั่งพื้นฐานที่จำเป็นสำหรับการสร้าง Image สำหรับแอปพลิเคชัน PHP กันก่อนครับ

  • FROM: กำหนด Base Image ที่เราจะใช้ในการสร้าง Image ของเรา Base Image คือ Image ที่มี OS และ software พื้นฐานที่เราต้องการอยู่แล้ว เช่น PHP, Ubuntu, Alpine Linux เป็นต้น
  • WORKDIR: กำหนด Working Directory ภายใน Container ที่เราจะทำงานด้วย คำสั่งนี้จะเหมือนกับการใช้ cd ใน terminal
  • COPY: คัดลอกไฟล์หรือ directory จากเครื่อง host (เครื่องที่เรากำลังสร้าง Image) ไปยัง Container
  • RUN: Execute คำสั่งต่างๆ ภายใน Container คำสั่งนี้มักใช้ในการติดตั้ง packages, libraries หรือ execute script ต่างๆ
  • CMD: กำหนดคำสั่งที่จะ execute เมื่อ Container เริ่มทำงาน มีได้เพียงคำสั่งเดียวเท่านั้น
  • EXPOSE: บอก Docker ว่า Container นี้จะเปิด port อะไรให้ภายนอกสามารถเข้าถึงได้

สร้าง Dockerfile แรกสำหรับ PHP

เราจะมาลองสร้าง Dockerfile ง่ายๆ สำหรับแอปพลิเคชัน PHP กันครับ สมมติว่าเรามีไฟล์ index.php ที่มี code ดังนี้:

<?php
  echo "Hello, Docker!";
?>

เราจะสร้าง Dockerfile ที่มีเนื้อหาดังนี้:

FROM php:8.2-apache

WORKDIR /var/www/html

COPY index.php .

EXPOSE 80

CMD ["apache2-foreground"]

เรามาดูกันว่าแต่ละบรรทัดใน Dockerfile หมายถึงอะไร:

  • FROM php:8.2-apache: ใช้ Image php:8.2-apache เป็น Base Image ซึ่งเป็น Image ที่มี PHP 8.2 และ Apache web server ติดตั้งไว้เรียบร้อยแล้ว
  • WORKDIR /var/www/html: กำหนด Working Directory เป็น /var/www/html ซึ่งเป็น directory ที่ Apache ใช้ในการ serve ไฟล์
  • COPY index.php .: คัดลอกไฟล์ index.php จากเครื่อง host ไปยัง Working Directory ใน Container (/var/www/html)
  • EXPOSE 80: บอก Docker ว่า Container นี้จะเปิด port 80 ให้ภายนอกสามารถเข้าถึงได้
  • CMD ["apache2-foreground"]: กำหนดคำสั่งที่จะ execute เมื่อ Container เริ่มทำงาน ในที่นี้คือ apache2-foreground ซึ่งจะรัน Apache web server ใน foreground

คำอธิบายเพิ่มเติม:

  • FROM: เราเลือก php:8.2-apache เพราะเป็น Image ที่มี PHP และ Apache ติดตั้งพร้อมใช้งาน ทำให้เราไม่ต้องติดตั้งเอง
  • WORKDIR: โดยปกติ Apache จะ serve ไฟล์จาก /var/www/html ดังนั้นเราจึงกำหนด Working Directory เป็น directory นี้
  • COPY: เราคัดลอก index.php ไปยัง Container เพื่อให้ Apache สามารถ serve ไฟล์นี้ได้
  • EXPOSE: Apache web server จะ listen บน port 80 ดังนั้นเราจึง expose port 80
  • CMD: การรัน apache2-foreground จะทำให้ Apache ทำงานต่อเนื่องไปเรื่อยๆ ถ้า Apache หยุดทำงาน Container ก็จะหยุดทำงานด้วย

การจัดโครงสร้างไฟล์และโฟลเดอร์

เพื่อให้การจัดการโปรเจ็กต์ง่ายขึ้น เราควรจัดโครงสร้างไฟล์และโฟลเดอร์ให้เป็นระเบียบ ตัวอย่างเช่น:

my-php-app/
├── Dockerfile
└── index.php

โดยที่ Dockerfile และ index.php อยู่ใน directory เดียวกัน (my-php-app)

สรุป

ในบทนี้เราได้เรียนรู้เกี่ยวกับ Dockerfile ซึ่งเป็นหัวใจสำคัญของการสร้าง Docker Image สำหรับแอปพลิเคชัน PHP ของเรา เราได้เรียนรู้คำสั่งพื้นฐานใน Dockerfile เช่น FROM, WORKDIR, COPY, RUN, CMD และ EXPOSE พร้อมทั้งได้ลองสร้าง Dockerfile ง่ายๆ สำหรับแอปพลิเคชัน PHP

ในบทถัดไป เราจะมาเรียนรู้วิธีการ Build Docker Image จาก Dockerfile ที่เราสร้างขึ้นครับ

Office.in.th Custom Service

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

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

查看软件开发服务