Backup และ Restore Docker Volume อย่างถูกวิธี

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 ด้วยไฟล์เดียว