Docker

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

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

หัวข้อVolumeBind Mount
ใครจัดการDocker จัดการเองคุณระบุ Path เอง
Path บน HostDocker กำหนดให้ระบุเองได้ทุก 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 บน ProductionVolume
แชร์ Config ไฟล์เข้า ContainerBind Mount (แบบ read-only)
เก็บไฟล์ Upload จาก UserVolume
ข้อมูลที่ต้อง Backup/Restore ง่ายVolume

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