Named Volumes
Named volume คืออะไร?
หัวข้อที่มีชื่อว่า “Named volume คืออะไร?”Named volume คือหน่วยพื้นที่จัดเก็บที่ Docker สร้างและจัดการแทนคุณ Docker เก็บข้อมูล volume ไว้ในไดเรกทอรีของตัวเอง (โดยทั่วไปคือ /var/lib/docker/volumes/ บน Linux) คุณอ้างถึง volume ด้วยชื่อ — ไม่ใช่ด้วย host path
เนื่องจาก Docker เป็นเจ้าของตำแหน่งที่จัดเก็บ named volumes จึง:
- ทำงานได้เหมือนกันบน Linux, macOS และ Windows
- รอดจาก
docker rm— volume แยกจาก container - สามารถแชร์ระหว่าง container หลายตัวพร้อมกันได้
- เป็นวิธีที่แนะนำในการเก็บข้อมูล application ใน production
การจัดการ volumes
หัวข้อที่มีชื่อว่า “การจัดการ volumes”สร้าง volume
หัวข้อที่มีชื่อว่า “สร้าง volume”docker volume create mydataแสดงรายการ volumes ทั้งหมด
หัวข้อที่มีชื่อว่า “แสดงรายการ volumes ทั้งหมด”docker volume lsผลลัพธ์ที่คาดหวัง:
DRIVER VOLUME NAMElocal mydataตรวจสอบรายละเอียด volume
หัวข้อที่มีชื่อว่า “ตรวจสอบรายละเอียด volume”docker volume inspect mydata[ { "CreatedAt": "2024-06-01T10:00:00Z", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/mydata/_data", "Name": "mydata", "Scope": "local" }]Mountpoint คือที่ที่ Docker เก็บข้อมูลจริงบน host คุณแทบไม่จำเป็นต้องเข้าถึงโดยตรง — Docker ซ่อนรายละเอียดนั้นไว้
ลบ volume
หัวข้อที่มีชื่อว่า “ลบ volume”docker volume rm mydataไม่สามารถลบ volume ได้ขณะที่ container กำลังใช้งานอยู่ ลบ container ก่อน หรือใช้ docker volume prune เพื่อลบ volumes ที่ไม่ได้ใช้ทั้งหมดในครั้งเดียว
การ mount volume เข้า container
หัวข้อที่มีชื่อว่า “การ mount volume เข้า container”มีสองรูปแบบ syntax ทั้งสองเทียบเท่ากัน — ใช้แบบไหนก็ได้ที่คุณอ่านง่ายกว่า
Short -v syntax:
docker run -d --name myapp -v mydata:/app/data myimageLong --mount syntax (ชัดเจนและแนะนำสำหรับ scripts):
docker run -d --name myapp \ --mount type=volume,source=mydata,target=/app/data \ myimageถ้า volume mydata ยังไม่มีอยู่ Docker จะสร้างให้อัตโนมัติเมื่อคุณรัน container
ข้อมูลคงอยู่ข้ามการสร้าง container ใหม่
หัวข้อที่มีชื่อว่า “ข้อมูลคงอยู่ข้ามการสร้าง container ใหม่”คุณสมบัติสำคัญของ named volume: คุณสามารถลบ container และสร้างใหม่ได้ ข้อมูลทั้งหมดที่เขียนลง volume ยังคงอยู่ครบถ้วน
# รัน container และเขียนข้อมูลdocker run --name writer -v mydata:/app/data alpine sh -c "echo 'persistent' > /app/data/file.txt"
# ลบ containerdocker rm writer
# สร้าง container ใหม่ mount volume เดิมdocker run --rm -v mydata:/app/data alpine cat /app/data/file.txt# Output: persistentฝึกปฏิบัติ
หัวข้อที่มีชื่อว่า “ฝึกปฏิบัติ”snippet ด้านล่างรัน container เขียนข้อมูลลง named volume ลบ container แล้ว mount volume เดิมใน container ใหม่เพื่อพิสูจน์ว่าข้อมูลรอดมาได้
# 1. Create a named volume
docker volume create demo-vol
# 2. Write data into the volume via a container
docker run --rm -v demo-vol:/data alpine sh -c "echo 'data survives!' > /data/message.txt"
# 3. Read it back from a completely new container
docker run --rm -v demo-vol:/data alpine cat /data/message.txt
# 4. Inspect the volume
docker volume inspect demo-vol
# 5. Clean up
docker volume rm demo-volข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Named volume | Docker จัดการ path ให้ ย้าย host ได้ backup ง่ายด้วย throwaway container | เข้าถึงข้อมูลตรงจาก host filesystem ไม่ได้ ต้องผ่าน container เสมอ |
| Bind mount | เห็นและแก้ไขไฟล์ตรงจาก host ได้ทันที | ผูกกับ path เฉพาะของ host เครื่องนั้น ย้ายข้าม environment ยาก |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- ใช้ bind mount แทน named volume สำหรับข้อมูลฐานข้อมูลใน production ทำให้ portability หายไป
- รัน
docker rm -vหรือdocker compose down -vโดยไม่ตั้งใจ แล้วข้อมูลใน volume หายทั้งหมด - ไม่มีแผนสำรองข้อมูลสำหรับ volume เลย คิดว่า “volume คงอยู่ตลอดไป” แล้วไม่เคย backup
- คิดว่าข้อมูลใน volume จะรอดจาก
docker system prune -a --volumesโดยไม่ตรวจสอบก่อนรัน
💡 ตัวอย่างจากของจริง
official Postgres image บน Docker Hub แนะนำให้ mount named volume ที่
/var/lib/postgresql/dataเป็น pattern มาตรฐานสำหรับ production เพื่อให้ข้อมูลฐานข้อมูลรอดจากการอัปเดต image หรือสร้าง container ใหม่