เรียนรู้วิธีการย้ายข้อมูลออกจาก Docker Volume มาเก็บไว้เป็นไฟล์บีบอัด (.tar.gz) อย่างเป็นระบบ ตั้งแต่พื้นฐานไปจนถึงการเขียนสคริปต์อัตโนมัติด้วย Cronjob พร้อมคำอธิบายแต่ละบรรทัดโค้ด
ข้อมูลใน Volume อาจหายได้หากเกิดความเสียหายของเครื่อง การสำรองข้อมูลไว้ข้างนอกจึงเป็นสิ่งจำเป็น
ใช้เพียงคำสั่งพื้นฐาน Linux ที่มีมาให้อยู่แล้ว เช่น docker run, tar ที่ทุกคนสามารถเข้าใจได้
ตั้งค่าครั้งเดียว สคริปต์จะสำรองข้อมูลให้คุณทุกวันผ่าน Cronjob ไม่ต้องกังวลลืมสำรองข้อมูลอีกต่อไป
Docker ไม่มีคำสั่ง docker backup โดยตรง เราจึงต้องใช้เทคนิคที่เรียกว่า "Temporary Container Pattern" ซึ่งคือการสร้าง Container ขึ้นมาหนึ่งตัวเพื่อทำหน้าที่ "แพ็กของ" ส่งออกมาที่เครื่องเรา หลังจากทำงานเสร็จแล้ว Container นี้จะถูกลบทิ้งทันที
เรานำ Volume ที่ต้องการสำรองข้อมูล ไปเสียบ (mount) เข้ากับ Container ชั่วคราว ซึ่ง Volume นี้จะปรากฏเป็นโฟลเดอร์ภายใน Container
เรานำโฟลเดอร์ในเครื่องปัจจุบันของเรา ไปเสียบไว้ที่ Container เดียวกัน ซึ่งโฟลเดอร์นี้จะเป็นที่เก็บไฟล์ Backup ที่สร้างออกมา
สั่งรันคำสั่ง tar บีบอัดไฟล์ใน Container เพื่อบันทึกผลลัพธ์ลงในโฟลเดอร์ที่เชื่อมมาจากเครื่อง Host ของเรา
ใช้สำหรับทดสอบหรือทำเพียงครั้งคราวผ่านหน้าจอ Terminal เหมาะสำหรับ Backup ครั้งเดียวหรือทดลองว่าทำงานได้หรือไม่
# สำรองข้อมูล Docker Volume ด้วยคำสั่ง Manual
docker run --rm \
-v my_data_volume:/data \
-v $(pwd):/backup \
ubuntu \
tar cvzf /backup/backup_$(date +%Y%m%d).tar.gz /data
บอกให้ Docker ลบ Container นี้ทิ้งทันทีที่ทำงานเสร็จสิ้น เพื่อไม่ให้รกพื้นที่เครื่องด้วย Container ที่ไม่ได้ใช้งาน
เชื่อม Volume ที่ชื่อ my_data_volume เข้ากับ Container ที่ path /data เพื่อเข้าถึงข้อมูล
$(pwd) คือคำสั่งที่แสดงโฟลเดอร์ปัจจุบันของเรา จะถูกเชื่อมเข้า Container ที่ /backup เพื่อรับไฟล์ Backup
c = create, v = verbose, z = gzip, f = file สร้างไฟล์ .tar.gz บีบอัดข้อมูล
เหมาะสำหรับการตั้งค่าทิ้งไว้ (Cronjob) เพื่อให้เครื่องสำรองข้อมูลให้เราเองทุกวัน โดยอัตโนมัติ
#!/bin/bash # ============================================ # Docker Volume Automated Backup Script # ============================================ # --- 1. ตั้งค่าการ Backup ตรงนี้ --- VOLUME_NAME="my_app_data" BACKUP_DIR="./docker_backups" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") FILENAME="backup_${VOLUME_NAME}_${TIMESTAMP}.tar.gz" # --- 2. สร้างโฟลเดอร์เก็บไฟล์หากยังไม่มี --- mkdir -p "$BACKUP_DIR" echo "🚀 กำลังเริ่มสำรองข้อมูล $VOLUME_NAME..." # --- 3. รัน Docker Container สำรองข้อมูล --- docker run --rm \ -v "$VOLUME_NAME":/source_data:ro \ -v "$(pwd)/$BACKUP_DIR":/backup_dest \ alpine \ tar -czf "/backup_dest/$FILENAME" -C /source_data . # --- 4. ตรวจสอบผลลัพธ์ --- if [ $? -eq 0 ]; then echo "✅ สำเร็จ! ไฟล์เก็บไว้ที่: $BACKUP_DIR/$FILENAME" echo "📊 ขนาดไฟล์: $(du -h $BACKUP_DIR/$FILENAME | cut -f1)" else echo "❌ เกิดข้อผิดพลาดในการ Backup" exit 1 fi
สร้างไฟล์: nano docker-backup.sh แล้ววางโค้ดด้านบนลงไป
ให้สิทธิ์รัน: chmod +x docker-backup.sh เพื่อให้ไฟล์สามารถรันได้
ตั้งเวลา (Cronjob): crontab -e แล้วเพิ่ม 0 3 * * * /path/to/docker-backup.sh (สำรองทุกวันตี 3)
1. สร้าง Volume ใหม่ขึ้นมารองรับ
docker volume create my_restored_data
💡 คำอธิบาย: สร้าง Volume ใหม่ชื่อ my_restored_data เพื่อรองรับการกู้คืนข้อมูล
2. แตกไฟล์ .tar กลับเข้าไปใน Volume
docker run --rm \ -v my_restored_data:/data \ -v $(pwd):/backup \ alpine \ sh -c "cd /data && tar xzf /backup/YOUR_BACKUP_FILE.tar.gz --strip 1"
💡 --rm ลบ Container หลังเสร็จงาน
💡 xzf แตกไฟล์ .tar.gz (x = extract, z = gzip, f = file)
💡 --strip 1 ลบ path แรกออก เพื่อให้ไฟล์อยู่ที่ root ของ /data
3. ตรวจสอบว่าข้อมูลกลับมาแล้ว
docker run --rm -v my_restored_data:/data alpine ls -la /data
💡 คำอธิบาย: รัน Container ชั่วคราวเพื่อดูรายการไฟล์ใน Volume ว่าข้อมูลกลับมาครบหรือไม่
หากแอปพลิเคชันมีการเขียนไฟล์ตลอดเวลา (เช่น Database) แนะนำให้สั่ง docker stop ชั่วคราวก่อน เพื่อให้ได้ข้อมูลที่นิ่งที่สุดและไม่เสียหาย
อย่าเก็บไฟล์ backup ไว้ในเครื่องเดียวกับเครื่องที่รัน Docker เพราะหากเครื่องเสีย คุณจะเสียทั้งแอปและไฟล์สำรองไปพร้อมกัน ควรใช้ rsync หรือ cloud storage
ควรเก็บ Backup หลายวัน หรือหลายสัปดาห์ เผื่อกรณีพบว่าไฟล์ Backup ล่าสุดเสียหาย หรือต้องการกู้คืนไปยังช่วงเวลาที่ต้องการ
อย่าลืมทดสอบการ Restore จาก Backup ทุกเดือน เพื่อมั่นใจว่าไฟล์ Backup ใช้งานได้จริง ไม่สูญหายหรือเสียหายโดยที่ไม่รู้ตัว