Docker Volume คืออะไร? เก็บข้อมูลไม่ให้หายเมื่อ Container ดับ

ข้อมูลที่อยู่ใน Container จะหายไปทันทีที่ลบ Container นั้น นี่คือสิ่งที่นักพัฒนาหลายคนเจอในตอนแรก Docker Volume คือวิธีแก้ปัญหานี้ ทำให้ข้อมูลอยู่รอดแม้ Container จะถูกลบ สร้างใหม่ หรืออัปเดตก็ตาม

ทำไมต้องใช้ Volume?

Container ใน Docker เป็น Stateless โดยธรรมชาติ หมายความว่าทุกอย่างที่เขียนลงใน Filesystem ของ Container จะหายไปเมื่อ Container ถูกลบ ซึ่งเป็นปัญหาสำหรับ:

  • ฐานข้อมูล (MySQL, PostgreSQL, MongoDB)
  • ไฟล์ Upload จากผู้ใช้
  • Log ไฟล์ของ Application
  • Config ไฟล์ที่ต้องการคงอยู่

Docker Volume ทำงานอย่างไร?

Volume คือ Directory พิเศษที่ Docker จัดการอยู่นอก Container Filesystem โดยเก็บไว้ที่ Host Machine (ปกติอยู่ที่ /var/lib/docker/volumes/) เมื่อ Container ถูกลบ ข้อมูลใน Volume ยังคงอยู่ครบ

สร้างและใช้ Volume

สร้าง Volume

docker volume create my-data

รัน Container พร้อม Volume

# แบบ -v (syntax เดิม)
docker run -d \
  --name my-mysql \
  -v my-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0

# แบบ --mount (อ่านง่ายกว่า แนะนำสำหรับงานใหม่)
docker run -d \
  --name my-mysql \
  --mount source=my-data,target=/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0

เมื่อลบ Container แล้วสร้างใหม่ ข้อมูล MySQL ยังคงอยู่ใน Volume my-data เหมือนเดิมทุกอย่าง

คำสั่งจัดการ Volume

# ดู Volume ทั้งหมด
docker volume ls

# ดูรายละเอียด Volume (รวมถึง path บน Host)
docker volume inspect my-data

# ลบ Volume
docker volume rm my-data

# ลบ Volume ที่ไม่มี Container ใช้งาน
docker volume prune

ตัวอย่างจริง: MySQL พร้อม Persistent Volume

# สร้าง Volume สำหรับข้อมูล MySQL
docker volume create mysql-data

# รัน MySQL Container
docker run -d \
  --name mysql-prod \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=MyStr0ngP@ss \
  -e MYSQL_DATABASE=myapp \
  -p 3306:3306 \
  mysql:8.0

# ทดสอบเชื่อมต่อ
docker exec -it mysql-prod mysql -uroot -p

# ลบ Container แล้วสร้างใหม่ — ข้อมูลยังอยู่ครบแน่นอน
docker rm -f mysql-prod
docker run -d \
  --name mysql-prod \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

แชร์ Volume ระหว่าง Container

Container หลายตัวสามารถเข้าถึง Volume เดียวกันได้ เหมาะสำหรับการแชร์ข้อมูลระหว่าง Service:

docker run -d --name app1 -v shared-data:/data my-app
docker run -d --name app2 -v shared-data:/data my-app-v2

คุณสมบัติของ Docker Volume

คุณสมบัติ รายละเอียด
Persistent ข้อมูลอยู่รอดเมื่อ Container ถูกลบ
Portable ย้าย Volume ไปใช้กับ Container อื่นได้ง่าย
Shareable Container หลายตัวอ่าน/เขียนพร้อมกันได้
Managed by Docker Docker จัดการ Path และ Permission ให้
Backup-friendly Backup/Restore ได้ง่าย

สรุป

Docker Volume คือวิธีมาตรฐานในการเก็บข้อมูลถาวรใน Docker จำเป็นอย่างยิ่งสำหรับจัดเก็บ Database, ไฟล์ Upload หรือ Config ที่ต้องการความถาวร บทความถัดไปจะอธิบายความแตกต่างระหว่าง Volume และ Bind Mount และควรเลือกใช้แบบไหนในสถานการณ์ใด