Bind Mount vs Volume ใช้แบบไหนดีกว่าในสถานการณ์ใด?

Docker มี 2 วิธีหลักในการเชื่อม Filesystem ของ Host เข้ากับ Container ได้แก่ Volume และ Bind Mount สองวิธีนี้ดูคล้ายกันแต่มีจุดประสงค์และเหมาะสมกับงานต่างกันอย่างชัดเจน

Volume คืออะไร?

Volume คือ Storage ที่ Docker จัดการเองทั้งหมด เก็บไว้ที่ /var/lib/docker/volumes/ บน Host โดยอัตโนมัติ

# ใช้ Volume
docker run -v my-volume:/app/data my-app

Bind Mount คืออะไร?

Bind Mount คือการชี้ Directory หรือไฟล์จาก Host โดยตรงเข้าไปใน Container คุณต้องระบุ Path เต็มๆ บน Host

# ใช้ Bind Mount
docker run -v /home/user/myapp:/app my-app

# หรือใช้ --mount syntax
docker run --mount type=bind,source=/home/user/myapp,target=/app my-app

เปรียบเทียบโดยตรง

หัวข้อ Volume Bind Mount
ใครจัดการ Docker จัดการเอง คุณระบุ Path เอง
Path บน Host Docker กำหนดให้ ระบุเองได้ทุก Path
Portability ✅ เอาไปใช้ครั้งหน้าได้ ❌ ขึ้นกับโครงสร้าง Host
เหมาะกับ Dev ปานกลาง ✅ ดีมาก (live reload)
เหมาะกับ Production ✅ ดีที่สุด ปานกลาง
Performance ✅ ดีกว่าบน Mac/Windows ช้ากว่าบน Mac/Windows
Backup ✅ ง่ายกว่า จัดการเอง

เมื่อไหรใช้ Bind Mount?

Bind Mount เหมาะสุดสำหรับการพัฒนา (Development) เพราะเพียงแก้ไขโค้ดในเครื่อง Container จะเห็นผลทันทีโดยไม่ต้อง rebuild Image:

# Dev workflow: mount โค้ดจาก Host เข้าไปใน Container
docker run -d \
  --name my-node-app \
  -v $(pwd):/app \
  -p 3000:3000 \
  node:20-alpine \
  npm run dev

เมื่อแก้ไขไฟล์ในเครื่อง App ใน Container จะเห็นการเปลี่ยนแปลงทันที (ถ้าใช้ร่วมกับ nodemon หรือ Hot Reload)

เมื่อไหรใช้ Volume?

Volume เหมาะสำหรับข้อมูลที่ต้องคงอยู่ (Persistent) และไม่เกี่ยวกับโครงสร้าง Directory ของ Host:

# Production: ใช้ Volume สำหรับฐานข้อมูล
 docker run -d \
  --name postgres-prod \
  -v pg-data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:16

ใช้ทั้งสองพร้อมกันใน Container เดียว

สามารถใช้ทั้งสองพร้อมกันได้ เช่น Bind Mount โค้ด และ Volume สำหรับฐานข้อมูล:

docker run -d \
  --name my-app \
  -v $(pwd)/src:/app/src \
  -v app-data:/app/data \
  my-app

สรุป: เลือกใช้แบบไหน?

สถานการณ์ แนะนำ
พัฒนา (Dev) ต้องการแก้โค้ดแล้วเห็นผลทันที Bind Mount
จัดเก็บ Database บน Production Volume
แชร์ Config ไฟล์เข้า Container Bind Mount (แบบ read-only)
เก็บไฟล์ Upload จาก User Volume
ข้อมูลที่ต้อง Backup/Restore ง่าย Volume

โดยสรุป: Volume สำหรับ Production และข้อมูลถาวร ส่วน Bind Mount สำหรับ Development และการส่ง Config ไฟล์เข้า Container