ExzLearn

Docker คืออะไร

แพ็กโปรแกรมพร้อมทุกอย่างที่มันต้องใช้ให้รันได้เหมือนกันทุกเครื่อง จบปัญหา "เครื่องผมรันได้นะ"

พื้นฐาน 4 นาที อัปเดต 25 ต.ค. 2569
สรุปใน 30 วินาที
  • Image = แม่พิมพ์ (อ่านอย่างเดียว) ส่วน Container = ของที่ถูกปั๊มจากแม่พิมพ์แล้วกำลังรันอยู่
  • Container เบากว่า VM มาก เพราะ ใช้ kernel ร่วมกับเครื่องหลัก ไม่ต้องบูต OS ใหม่
  • ข้อมูลใน container หายเมื่อลบ container ข้อมูลที่ต้องเก็บถาวรต้องใส่ใน Volume

ทำไมต้องรู้เรื่องนี้

ปัญหาคลาสสิก: โค้ดรันบนเครื่องเราได้ แต่ขึ้น server แล้วพัง เพราะ Node คนละเวอร์ชัน, ขาด library หรือ config ไม่ตรง Docker แก้ปัญหานี้ด้วยการ แพ็กโปรแกรม + runtime + library + config รวมเป็นก้อนเดียว แล้วรันก้อนนั้นที่ไหนก็ได้ผลเหมือนกัน

Container ต่างจาก Virtual Machine ยังไง

🖥️ Virtual Machine
  • จำลองเครื่องทั้งเครื่อง มี OS ของตัวเอง
  • ขนาดหลาย GB, บูตเป็นนาที
  • แยกขาดจากกันสูงมาก
  • เหมาะกับ: รันคนละ OS, งานที่ต้องแยกขาดจริงๆ
📦 Container
  • แยกแค่ process และไฟล์ ใช้ kernel ร่วมกับเครื่องหลัก
  • ขนาดหลักสิบ–ร้อย MB, เริ่มในไม่กี่วินาที
  • รันได้หลายสิบตัวบนเครื่องเดียว
  • เหมาะกับ: deploy เว็บ / API / service

3 คำที่ต้องรู้

🧾 Dockerfile

"สูตร" บอกวิธีสร้าง image ทีละขั้น เช่น เริ่มจาก Node 22 → copy โค้ด → ติดตั้ง package

💿 Image

ผลลัพธ์ที่ build จาก Dockerfile อ่านอย่างเดียว เก็บไว้ใน registry อย่าง Docker Hub หรือ ghcr.io

▶️ Container

image ที่ถูกสั่งรันแล้ว จะสร้างกี่ตัวจาก image เดียวกันก็ได้ ลบทิ้งแล้วสร้างใหม่ได้ตลอด

วงจรชีวิต
1เขียน Dockerfileสูตร
2docker buildได้ Image
3docker pushขึ้น registry
4docker runได้ Container

ตัวอย่าง Dockerfile ของแอป Node

dockerfile
# 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"]

คำสั่งที่ใช้บ่อย

bash
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. 1

    กำหนด Volume — ผูกโฟลเดอร์บนเครื่องจริงเข้ากับโฟลเดอร์ใน container เช่น ./data:/data

  2. 2

    ให้แอปเขียนข้อมูลลง /data เท่านั้น — เช่นไฟล์ SQLite หรือไฟล์ที่ผู้ใช้อัปโหลด

  3. 3

    Backup โฟลเดอร์ ./data — container จะถูกลบหรือสร้างใหม่กี่รอบ ข้อมูลก็ยังอยู่

ทบทวน

ทบทวน 1
ทำไม container ถึงเริ่มทำงานได้เร็วกว่า VM มาก?
ทบทวน 2
Deploy เวอร์ชันใหม่แล้วข้อมูลผู้ใช้ในฐานข้อมูล SQLite หายหมด สาเหตุที่น่าจะเป็นที่สุดคือ?
#docker#container#devops