ข้อมูลที่อยู่ใน 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 และควรเลือกใช้แบบไหนในสถานการณ์ใด

