โดยค่าเริ่มต้น Docker จัดเก็บทุกอย่างใน "/var/lib/docker" ซึ่งอยู่บน Root Partition (/) เมื่อ Container โตขึ้น โฟลเดอร์นี้เต็มเร็ว หาก Server ช้า, บันทึกข้อมูลไม่ได้, หรือ Crash แบบสุ่ม อาจเพราะ Root Partition หมดพื้นที่ คู่มือนี้แนะนำวิธีย้าย Docker Volume (หรือ Data) ไป Partition อื่น และลดพื้นที่ใน Root Partition
ทำไมต้องย้าย Docker Volumes ไป Partition อื่น
Docker Containers มักสร้าง Persistent Data 量มาก ตามเวลา Data นี้กินพื้นที่ Root Partition การย้าย Docker Volumes ไป Partition อื่นช่วย:
- 釋放พื้นที่บน Root Filesystem
- ป้องกัน System Crash จาก Disk Exhaustion
- จัดเก็บ Application Data ใหญ่บน Dedicated Storage
- ปรับปรุง Storage Management ทั้งหมด
ตัวอย่าง Container Database เช่น MySQL หรือ PostgreSQL อาจจัดเก็บข้อมูล Gigabytes ภายใน Volumes การย้าย Volumes ไป Dedicated Partition ใหญ่ช่วยรักษาความเสถียรของระบบ
ค้นหา Docker Volume Directory
ก่อนย้าย Docker Volume ต้องค้นหาก่อนว่า Docker จัดเก็บที่ไหนในระบบ รันคำสั่งรายการ Docker Volumes ทั้งหมด:
docker volume ls

หลังระบุ Volume Name รันคำสั่ง Inspect Volume นั้น:
docker volume inspect volume_name
คำสั่งนี้แสดงรายละเอียด Volume ใน Output หา Field Mountpoint แสดง Directory ที่แน่นอนที่ Docker จัดเก็บ Volume Data

ย้าย Docker Data Root ทั้งหมด
วิธีหนึ่งย้าย Docker Data ไป Partition อื่น คือย้าย Docker Storage Directory ทั้งหมด รวม Volumes, Images, Containers, และ Logs วิธีนี้ Clean และ Safe ที่สุด หาก "/var/lib/docker" กำลังเต็ม
ก่อนอื่น หยุด Docker Service เพื่อไม่ให้ไฟล์เปลี่ยนระหว่าง Migration:
sudo systemctl stop docker
ต่อไป Copy Docker Data ด้วย rsync:
sudo rsync -avxP /var/lib/docker/ /path/to/new/partition/docker-data/
หมายเหตุ: เปลี่ยน "/path/to/new/partition/" เป็นพาธของ Partition ใหม่ที่ต้องการย้าย
คำสั่งนี้ Copy Docker Directory พร้อมรักษา Permissions และแสดง Progress ระหว่าง Transfer

อีกวิธี ใช้คำสั่งนี้ ซึ่งรักษา Docker Attributes เพิ่มเติม เช่น Hard Links, ACLs, และ Extended Attributes:
sudo rsync -aHAX --info=progress2 /var/lib/docker/ /mnt/docker-data/
Version นี้แนะนำสำหรับ Migration Docker Data เพราะรักษา Filesystem Metadata มากกว่า และให้ Overall Progress Indicator ชัดเจนกว่า
หลังจากนี้ เปลี่ยนชื่อ Old Data Directory เป็น Backup ก่อนลบ:
sudo mv /var/lib/docker /var/lib/docker.old
ตอนนี้ อัปเดต Docker Config โดยเปิด Daemon File:
sudo nano /etc/docker/daemon.json
เพิ่มเนื้อหาต่อไปในไฟล์นี้:
{ "data-root": "/path/to/new/partition/docker-data" }

สุดท้าย Restart Docker ด้วย sudo systemctl start docker หลังจากนี้ ยืนยัน Docker Data Directory ใหม่ด้วย:
docker info | grep "Docker Root Dir"

หากทุกอย่างปกติ ลบ Backup เก่า:
sudo rm -rf /var/lib/docker.old
ย้าย Docker Data ทั้งหมดด้วย Docker Desktop (GUI Method)
Docker Desktop อนุญาตย้าย Docker Data ทั้งหมดไป Partition อื่นด้วยการเปลี่ยน Disk Image Location ตัวเลือกนี้โอนทุกอย่างที่ Docker จัดเก็บ รวม Images, Containers, Volumes, และ Build Cache ไป Location ใหม่บนระบบ
ทำได้โดยเปิด Docker Desktop ไป Settings → Resources → Advanced หา Disk Image Location

คลิก Browse เลือกโฟลเดอร์บน Partition หรือ Drive ใหม่ที่ต้องการให้ Docker จัดเก็บ Data เช่น "/mnt/newdisk/docker-data" หลังเลือก Location ใหม่ คลิก Apply & Restart Docker Desktop จะ Restart และย้าย Docker Data ทั้งหมดไป Partition ที่เลือก

หมายเหตุ: นี้ย้าย Docker Data ทั้งหมด ปัจจุบันไม่มี GUI Option ย้าย Individual Volumes
ย้ายเฉพาะ Volume Data ที่ต้องการ
สามารถย้าย Docker Volume เฉพาะไป Partition อื่น และใช้กับ Container ผ่าน Host Bind Mount วิธีนี้ Simple, Safe, และ Backup ได้ง่าย ก่อนย้าย Volume หยุด Container ที่ใช้มัน:
docker stop container_name
หลังจากนี้ ใช้ rsync ย้าย Data ทั้งหมดไป Directory ใหม่อย่างปลอดภัย:
sudo rsync -a /var/lib/docker/volumes/my_volume/_data/ /data/docker/my_volume/
นี้จะ Copy ทุกอย่างจาก Old Volume ไป "/data/docker/my_volume"
แก้ไข "docker-compose.yml" ใช้ Bind Mount แทน Docker-managed Volume:
services: my_service: volumes: - /data/docker/my_volume:/container/path
แทนที่ /container/path ด้วย Path ภายใน Container ที่ Volume Mount เดิม แล้ว Redeploy Container:
docker-compose up -d
สรุป
การย้าย Docker Volumes หรือ Docker Data Directory ทั้งหมดไป Partition ใหญ่กว่า 釋放พื้นที่ Root Filesystem และรักษา Server Stable Containers ทำงานลื่นไหลต่อโดยไม่เสี่ยง Data Loss และ Storage Management ในอนาคตง่ายขึ้น
หากย้าย Docker Directory ทั้งหมดไม่ได้ ยังสามารถ Reclaim Space ด้วยวิธีอื่น เช่น Prune Unused Containers, Images, Networks, Caches ด้วย docker system prune หรือ Individual Prune Commands และใช้ Linux Bind Mounts ย้าย Directory ใหญ่โดยไม่ส่งผล Docker Runtime