Updated 2026

วิธีสำรองข้อมูล Docker Volume ฉบับสมบูรณ์ในหน้าเดียว

เรียนรู้วิธีการย้ายข้อมูลออกจาก Docker Volume มาเก็บไว้เป็นไฟล์บีบอัด (.tar.gz) อย่างเป็นระบบ ตั้งแต่พื้นฐานไปจนถึงการเขียนสคริปต์อัตโนมัติด้วย Cronjob พร้อมคำอธิบายแต่ละบรรทัดโค้ด

ป้องกันความเสี่ยง

ข้อมูลใน Volume อาจหายได้หากเกิดความเสียหายของเครื่อง การสำรองข้อมูลไว้ข้างนอกจึงเป็นสิ่งจำเป็น

ใช้งานง่าย

ใช้เพียงคำสั่งพื้นฐาน Linux ที่มีมาให้อยู่แล้ว เช่น docker run, tar ที่ทุกคนสามารถเข้าใจได้

อัตโนมัติ

ตั้งค่าครั้งเดียว สคริปต์จะสำรองข้อมูลให้คุณทุกวันผ่าน Cronjob ไม่ต้องกังวลลืมสำรองข้อมูลอีกต่อไป

Docker Volume Backup Illustration

1 แนวคิด: The Temporary Container Pattern

Docker ไม่มีคำสั่ง docker backup โดยตรง เราจึงต้องใช้เทคนิคที่เรียกว่า "Temporary Container Pattern" ซึ่งคือการสร้าง Container ขึ้นมาหนึ่งตัวเพื่อทำหน้าที่ "แพ็กของ" ส่งออกมาที่เครื่องเรา หลังจากทำงานเสร็จแล้ว Container นี้จะถูกลบทิ้งทันที

Docker Volume /data Temp Container ubuntu/alpine tar -czf backup.tar.gz Host PC /backup/ backup_20260208.tar.gz mount extract --rm (auto delete)
1

Mount Volume เข้า Container

เรานำ Volume ที่ต้องการสำรองข้อมูล ไปเสียบ (mount) เข้ากับ Container ชั่วคราว ซึ่ง Volume นี้จะปรากฏเป็นโฟลเดอร์ภายใน Container

2

Mount Host Folder เข้า Container

เรานำโฟลเดอร์ในเครื่องปัจจุบันของเรา ไปเสียบไว้ที่ Container เดียวกัน ซึ่งโฟลเดอร์นี้จะเป็นที่เก็บไฟล์ Backup ที่สร้างออกมา

3

รันคำสั่ง tar บีบอัดข้อมูล

สั่งรันคำสั่ง tar บีบอัดไฟล์ใน Container เพื่อบันทึกผลลัพธ์ลงในโฟลเดอร์ที่เชื่อมมาจากเครื่อง Host ของเรา

2 ทำด้วยคำสั่ง Manual

ใช้สำหรับทดสอบหรือทำเพียงครั้งคราวผ่านหน้าจอ Terminal เหมาะสำหรับ Backup ครั้งเดียวหรือทดลองว่าทำงานได้หรือไม่

backup_manual.sh
# สำรองข้อมูล 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
--rm Flag แรก

ลบ Container ทันทีเมื่อเสร็จ

บอกให้ Docker ลบ Container นี้ทิ้งทันทีที่ทำงานเสร็จสิ้น เพื่อไม่ให้รกพื้นที่เครื่องด้วย Container ที่ไม่ได้ใช้งาน

-v my_data_volume:/data Volume Mount

เชื่อม Volume เข้า Container

เชื่อม Volume ที่ชื่อ my_data_volume เข้ากับ Container ที่ path /data เพื่อเข้าถึงข้อมูล

-v $(pwd):/backup Host Mount

เชื่อมโฟลเดอร์ Host เข้า Container

$(pwd) คือคำสั่งที่แสดงโฟลเดอร์ปัจจุบันของเรา จะถูกเชื่อมเข้า Container ที่ /backup เพื่อรับไฟล์ Backup

tar cvzf Compression

บีบอัดไฟล์ด้วย gzip

c = create, v = verbose, z = gzip, f = file สร้างไฟล์ .tar.gz บีบอัดข้อมูล

3 Bash Script สำหรับระบบอัตโนมัติ

เหมาะสำหรับการตั้งค่าทิ้งไว้ (Cronjob) เพื่อให้เครื่องสำรองข้อมูลให้เราเองทุกวัน โดยอัตโนมัติ

Daily Backup @ 03:00 Mon Tue Wed Thu Fri 1 2 3 4 5 Backup Files 0 3 * * * /path/to/docker-backup.sh
docker-backup-automated.sh
#!/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

วิธีนำไปใช้งานจริง

1

สร้างไฟล์: nano docker-backup.sh แล้ววางโค้ดด้านบนลงไป

2

ให้สิทธิ์รัน: chmod +x docker-backup.sh เพื่อให้ไฟล์สามารถรันได้

3

ตั้งเวลา (Cronjob): crontab -e แล้วเพิ่ม 0 3 * * * /path/to/docker-backup.sh (สำรองทุกวันตี 3)

4 การกู้คืนข้อมูล (Restore)

Backup File backup.tar.gz Temp Container tar -xzf backup.tar.gz --strip 1 Restored Volume my_restored_data Success!

ขั้นตอนการกู้คืนข้อมูล

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 ว่าข้อมูลกลับมาครบหรือไม่

5 ข้อแนะนำระดับมืออาชีพ

หยุดบริการก่อน Backup

หากแอปพลิเคชันมีการเขียนไฟล์ตลอดเวลา (เช่น Database) แนะนำให้สั่ง docker stop ชั่วคราวก่อน เพื่อให้ได้ข้อมูลที่นิ่งที่สุดและไม่เสียหาย

ย้ายไฟล์ออกไปข้างนอก

อย่าเก็บไฟล์ backup ไว้ในเครื่องเดียวกับเครื่องที่รัน Docker เพราะหากเครื่องเสีย คุณจะเสียทั้งแอปและไฟล์สำรองไปพร้อมกัน ควรใช้ rsync หรือ cloud storage

เก็บหลายเวอร์ชัน

ควรเก็บ Backup หลายวัน หรือหลายสัปดาห์ เผื่อกรณีพบว่าไฟล์ Backup ล่าสุดเสียหาย หรือต้องการกู้คืนไปยังช่วงเวลาที่ต้องการ

ทดสอบ Backup อย่างสม่ำเสมอ

อย่าลืมทดสอบการ Restore จาก Backup ทุกเดือน เพื่อมั่นใจว่าไฟล์ Backup ใช้งานได้จริง ไม่สูญหายหรือเสียหายโดยที่ไม่รู้ตัว

คัดลอกลงคลิปบอร์ดแล้ว!