Docker คืออะไร
แพ็กโปรแกรมพร้อมทุกอย่างที่มันต้องใช้ให้รันได้เหมือนกันทุกเครื่อง จบปัญหา "เครื่องผมรันได้นะ"
- Image = แม่พิมพ์ (อ่านอย่างเดียว) ส่วน Container = ของที่ถูกปั๊มจากแม่พิมพ์แล้วกำลังรันอยู่
- Container เบากว่า VM มาก เพราะ ใช้ kernel ร่วมกับเครื่องหลัก ไม่ต้องบูต OS ใหม่
- ข้อมูลใน container หายเมื่อลบ container ข้อมูลที่ต้องเก็บถาวรต้องใส่ใน Volume
ทำไมต้องรู้เรื่องนี้
ปัญหาคลาสสิก: โค้ดรันบนเครื่องเราได้ แต่ขึ้น server แล้วพัง เพราะ Node คนละเวอร์ชัน, ขาด library หรือ config ไม่ตรง Docker แก้ปัญหานี้ด้วยการ แพ็กโปรแกรม + runtime + library + config รวมเป็นก้อนเดียว แล้วรันก้อนนั้นที่ไหนก็ได้ผลเหมือนกัน
Container ต่างจาก Virtual Machine ยังไง
- จำลองเครื่องทั้งเครื่อง มี OS ของตัวเอง
- ขนาดหลาย GB, บูตเป็นนาที
- แยกขาดจากกันสูงมาก
- เหมาะกับ: รันคนละ OS, งานที่ต้องแยกขาดจริงๆ
- แยกแค่ process และไฟล์ ใช้ kernel ร่วมกับเครื่องหลัก
- ขนาดหลักสิบ–ร้อย MB, เริ่มในไม่กี่วินาที
- รันได้หลายสิบตัวบนเครื่องเดียว
- เหมาะกับ: deploy เว็บ / API / service
3 คำที่ต้องรู้
"สูตร" บอกวิธีสร้าง image ทีละขั้น เช่น เริ่มจาก Node 22 → copy โค้ด → ติดตั้ง package
ผลลัพธ์ที่ build จาก Dockerfile อ่านอย่างเดียว เก็บไว้ใน registry อย่าง Docker Hub หรือ ghcr.io
image ที่ถูกสั่งรันแล้ว จะสร้างกี่ตัวจาก image เดียวกันก็ได้ ลบทิ้งแล้วสร้างใหม่ได้ตลอด
ตัวอย่าง Dockerfile ของแอป Node
# 1) เริ่มจาก image ที่มี Node ติดตั้งไว้แล้ว
FROM node:22-bookworm-slim
WORKDIR /app
# 2) ติดตั้ง package ก่อน (ใช้ cache ได้ถ้า package.json ไม่เปลี่ยน)
COPY package*.json ./
RUN npm ci --omit=dev
# 3) ค่อย copy โค้ด
COPY . .
# 4) ไม่รันด้วย root เพื่อความปลอดภัย
USER node
EXPOSE 3000
CMD ["node", "server.js"]คำสั่งที่ใช้บ่อย
docker build -t myapp . # สร้าง image ชื่อ myapp จาก Dockerfile ในโฟลเดอร์นี้
docker run -d -p 3000:3000 myapp # รันแบบเบื้องหลัง เปิดพอร์ต 3000
docker ps # ดู container ที่รันอยู่
docker logs -f <id> # ดู log แบบ real-time
docker compose up -d # รันหลาย service ตามไฟล์ docker-compose.ymlเก็บข้อมูลยังไงไม่ให้หาย
Container ถูกออกแบบให้ ทิ้งได้ ทุกครั้งที่ deploy เวอร์ชันใหม่ container เก่าจะถูกลบแล้วสร้างใหม่ ไฟล์ที่เขียนไว้ข้างในจะหายไปด้วย
- 1
กำหนด Volume — ผูกโฟลเดอร์บนเครื่องจริงเข้ากับโฟลเดอร์ใน container เช่น
./data:/data - 2
ให้แอปเขียนข้อมูลลง
/dataเท่านั้น — เช่นไฟล์ SQLite หรือไฟล์ที่ผู้ใช้อัปโหลด - 3
Backup โฟลเดอร์
./data— container จะถูกลบหรือสร้างใหม่กี่รอบ ข้อมูลก็ยังอยู่
ทบทวน
VM ต้องจำลองฮาร์ดแวร์และบูต OS ของตัวเอง ส่วน container เป็นแค่ process ที่ถูกแยกพื้นที่ไว้บน kernel เดียวกัน จึงเริ่มได้ในไม่กี่วินาที
ตอน deploy container เก่าถูกลบ ไฟล์ที่อยู่ข้างในจึงหายไปด้วย ต้องเก็บไฟล์ฐานข้อมูลไว้ในโฟลเดอร์ที่ mount เป็น Volume เช่น /data