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

