เข้าใจ Dockerfile และ Docker Compose

Dockerfile

ไฟล์ข้อความธรรมดาที่ใช้เป็นชุดคำสั่งสำหรับสร้าง Docker Image โดยอัตโนมัติ ซึ่ง Docker Image เป็นเหมือนแม่แบบ (template) ที่เก็บแอปพลิเคชัน การตั้งค่า และสภาพแวดล้อมที่จำเป็นทั้งหมดไว้ในตัว เมื่อมีคำสั่งใน Dockerfile เอนจินของ Docker จะอ่านคำสั่งเหล่านั้นทีละบรรทัดเพื่อสร้าง Image ใหม่ และจาก Docker Image นี้ เราก็จะสามารถสร้าง Docker Container เพื่อรันแอปพลิเคชันได้ 

  • บอกว่าควรใช้ Image พื้นฐานอะไร (เช่น FROM node:18)
  • คัดลอกไฟล์โค้ดของแอปพลิเคชันเข้าไปใน Image (เช่น COPY . .)
  • ติดตั้งไลบรารีหรือ Dependencies ที่จำเป็น (เช่น RUN npm install)
  • ระบุคำสั่งที่จะใช้รันแอปพลิเคชันเมื่อ Container ทำงาน (เช่น CMD ["npm", "start"])
Dockerfile เป็นเหมือน สูตรการทำอาหาร ที่บอกรายละเอียดทุกขั้นตอน ตั้งแต่ส่วนผสมไปจนถึงวิธีปรุง เพื่อให้ได้ "จานอาหาร" ที่พร้อมเสิร์ฟ ซึ่งก็คือ Docker Image นั่นเอง
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
EXPOSE 80

Dockerfile

<!DOCTYPE html>
<html lang="th">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello World</title>
</head>
<body>
  Hello World
</body>
</html>

index.html

อธิบายการทำงาน

  • FROM nginx:alpine: คำสั่งนี้จะดึง Nginx Image เวอร์ชัน alpine ซึ่งมีขนาดเล็กและเหมาะสำหรับการใช้งานทั่วไป
  • COPY index.html /usr/share/nginx/html/: Nginx จะ serve ไฟล์ HTML จากไดเร็กทอรี /usr/share/nginx/html/ ดังนั้นคำสั่งนี้จึงทำหน้าที่ คัดลอกไฟล์ index.html ของเราไปไว้ในตำแหน่งนั้น เพื่อให้ Nginx สามารถแสดงผลได้
  • EXPOSE 80: คำสั่งนี้จะเปิดพอร์ต 80 ซึ่งเป็นพอร์ตมาตรฐานของ HTTP เพื่อให้ผู้ใช้งานสามารถเข้าถึง Nginx ได้

Docker Compose

เครื่องมือที่ช่วยจัดการและรัน แอปพลิเคชันที่มีหลายส่วนประกอบ (Multi-container Application) ให้ทำงานพร้อมกันได้อย่างง่ายดาย โดยใช้ไฟล์ YAML เพียงไฟล์เดียว

โดยปกติแล้ว แอปพลิเคชันที่ซับซ้อนมักจะประกอบด้วยหลายส่วน เช่น:

  • เว็บเซิร์ฟเวอร์ (เช่น Nginx)
  • แอปพลิเคชัน Backend (เช่น Node.js)
  • ฐานข้อมูล (เช่น MongoDB หรือ PostgreSQL)

Docker Compose จะทำให้คุณสามารถกำหนดค่าและจัดการทั้งหมดนี้ใน ไฟล์ docker-compose.yml เพียงไฟล์เดียว ทำให้คุณสามารถสั่งให้ส่วนประกอบทั้งหมดทำงานพร้อมกันด้วยคำสั่งง่าย ๆ เพียงคำสั่งเดียว เช่น docker-compose up แทนที่จะต้องรันแต่ละ Container แยกกัน