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 ที่เราสร้างขึ้นครับ