Docker Volume ที่เก็บข้อมูลสำคัญ เช่น Database หรือไฟล์ Upload จำเป็นต้องมีกลยุทธ์ Backup ที่ชัดเจน บทความนี้จะอธิบายวิธี Backup และ Restore Docker Volume หลายรูปแบบ ตั้งแต่แบบง่าย ไปจนถึงแบบอัตโนมัติ
วิธีที่ 1: Backup เป็น .tar.gz
วิธีนี้สร้าง Temporary Container ที่ Mount Volume แล้ว Compress เป็นไฟล์ .tar.gz ออกมาบน Host:
# Backup Volume ชื่อ "my-volume" เป็นไฟล์ backup.tar.gz
docker run --rm \
-v my-volume:/source \
-v $(pwd):/backup \
alpine \
tar czf /backup/backup.tar.gz -C /source .
อธิบายคำสั่ง:
--rm— ลบ Container อัตโนมัติหลังทำเสร็จ-v my-volume:/source— Mount Volume ที่ต้องการ Backup-v $(pwd):/backup— Mount Folder ปัจจุบันเป็นที่เก็บไฟล์tar czf— Compress เป็น .tar.gz
วิธีที่ 2: Restore จากไฟล์ .tar.gz
# Restore เข้า Volume ชื่อ "my-volume-restored"
docker run --rm \
-v my-volume-restored:/target \
-v $(pwd):/backup \
alpine \
tar xzf /backup/backup.tar.gz -C /target
สามารถ Restore เข้า Volume ชื่อเดิม หรือ Volume ใหม่ก็ได้
ตัวอย่างจริง: Backup MySQL Volume
# สมมติว่ามี MySQL Container ชื่อ "mysql-prod" ที่ใช้ Volume ชื่อ "mysql-data"
# 1. Backup Volume เป็นไฟล์
docker run --rm \
-v mysql-data:/source \
-v $(pwd):/backup \
alpine \
tar czf /backup/mysql-backup-$(date +%Y%m%d).tar.gz -C /source .
# 2. ไฟล์ที่สร้าง เช่น mysql-backup-20260327.tar.gz
ls -lh mysql-backup-*.tar.gz
ย้าย Volume ไปยัง Server อื่น
# บนเครื่องต้นทาง: Backup
docker run --rm \
-v my-volume:/source \
-v $(pwd):/backup \
alpine \
tar czf /backup/my-volume.tar.gz -C /source .
# ส่งไฟล์ไปยังเครื่องปลายทาง
scp my-volume.tar.gz user@server2:/tmp/
# บนเครื่องปลายทาง: Restore
docker volume create my-volume
docker run --rm \
-v my-volume:/target \
-v /tmp:/backup \
alpine \
tar xzf /backup/my-volume.tar.gz -C /target
ตั้ง Cron Job Backup อัตโนมัติ
สำหรับ Production Server ควรตั้ง Backup อัตโนมัติทุกวัน:
crontab -e
# เพิ่มบรรทัดนี้: Backup ทุกวันเวลา 01:00 น.
0 1 * * * docker run --rm -v mysql-data:/source -v /opt/backups:/backup alpine tar czf /backup/mysql-$(date +\%Y\%m\%d).tar.gz -C /source . >> /var/log/docker-backup.log 2>&1
# ลบ Backup เกิน 7 วัน
0 2 * * * find /opt/backups -name "mysql-*.tar.gz" -mtime +7 -delete
สรุปขั้นตอน Backup & Restore
| ขั้นตอน | คำสั่ง |
|---|---|
| Backup Volume | docker run --rm -v vol:/src -v $(pwd):/bak alpine tar czf /bak/backup.tar.gz -C /src . |
| Restore Volume | docker run --rm -v vol:/tgt -v $(pwd):/bak alpine tar xzf /bak/backup.tar.gz -C /tgt |
| ย้ายไป Server อื่น | Backup + scp + Restore |
| Backup อัตโนมัติ | Cron Job |
สรุป
การ Backup Docker Volume ไม่จำเป็นต้องติดตั้งอะไรเพิ่ม ใช้แค่ docker run พร้อมกับ Image เล็กอย่าง alpine ก็ทำ Backup/Restore ได้แล้ว แนะนำให้ตั้ง Cron Job Backup อัตโนมัติสำหรับทุก Production Server ที่ใช้ Docker Volume ที่สำคัญครับ
หมวดถัดไปจะเป็น Docker Compose — วิธีกำหนดและรัน Multi-Container App ด้วยไฟล์เดียว

