❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Bài 11, bạn đã học cách quản lý và cập nhật Docker image an toàn. Từ kiểm tra image outdated, pull phiên bản mới, rollback khi gặp lỗi, cho đến tự động hoá update với Watchtower. Tất cả giúp hệ thống luôn chạy phiên bản mới nhất, bảo mật hơn.

Backup và Restore Docker Volume
Minh họa: Sao lưu và khôi phục dữ liệu Docker Volume

Nhưng có một câu hỏi quan trọng hơn mọi thứ: nếu VPS bị hỏng, dữ liệu mất sạch, bạn khôi phục bằng cách nào?

Bài này sẽ hướng dẫn bạn backup và restore dữ liệu Docker volume: từ thủ công đến tự động, từ local đến offsite, và cả cách migrate toàn bộ stack sang VPS mới.

Tại sao backup Docker quan trọng?

Nhiều người mới dùng Docker hay nghĩ: “Container chạy ngon rồi, lo gì?” Nhưng thực tế:

  • Container có thể xoá và tạo lại bất cứ lúc nào: đó là thiết kế của Docker. Container là ephemeral (tạm thời).
  • Volume mới là nơi chứa data thật: database, file upload, config… tất cả nằm trong volume.
  • Mất volume = mất data: và Docker không tự backup volume cho bạn.
  • Sự cố không báo trước: disk hỏng, VPS bị xoá nhầm, ransomware, lỗi update… đều có thể xảy ra.

Nói ngắn gọn: không có backup = đang đánh cược với dữ liệu của bạn.

Các loại data cần backup

Trước khi bắt tay vào backup, bạn cần hiểu có 3 loại dữ liệu quan trọng trong một hệ thống Docker:

1. Docker Volumes

Đây là phần quan trọng nhất, chứa dữ liệu thực tế của ứng dụng:

  • Database: MySQL data, PostgreSQL data
  • Uploads: ảnh, file người dùng upload lên WordPress, Nextcloud…
  • Config: file cấu hình ứng dụng, SSL certificates

2. Docker Compose files

File docker-compose.ymlinfrastructure as code: nó định nghĩa toàn bộ stack của bạn. Mất file này, bạn phải nhớ lại từng service, từng config, từng network… rất cực.

3. Custom Dockerfiles

Nếu bạn build image riêng (custom Dockerfile), hãy backup luôn. Không có Dockerfile, bạn không thể rebuild lại image giống y hệt.

Mẹo: Docker Compose files và Dockerfiles nên được quản lý bằng Git. Push lên GitHub/GitLab là đã có backup sẵn. Bài này sẽ tập trung vào phần khó hơn: backup Docker volumes.

Backup Docker Volume thủ công

Backup Docker Volume bằng lệnh tar
Backup volume WordPress thành file .tar.gz chỉ với 1 lệnh docker run

Docker không có lệnh docker volume backup built-in. Nhưng bạn có thể dùng một container tạm để mount volume vào, nén thành file .tar.gz, rồi lưu ra ngoài host.

Lệnh backup cơ bản

docker run --rm \
  -v my_volume:/data \
  -v $(pwd):/backup \
  ubuntu tar czf /backup/my_volume_backup.tar.gz -C /data .

Lệnh này nhìn dài, nhưng logic rất đơn giản. Mình phân tích từng phần:

PhầnGiải thích
docker run --rmTạo một container tạm, tự xoá sau khi chạy xong
-v my_volume:/dataMount volume cần backup vào thư mục /data trong container
-v $(pwd):/backupMount thư mục hiện tại (trên host) vào /backup trong container
ubuntuDùng image Ubuntu (có sẵn lệnh tar)
tar czf /backup/my_volume_backup.tar.gz -C /data .Nén toàn bộ nội dung /data thành file tar.gz, lưu vào /backup (tức thư mục hiện tại trên host)

Sau khi chạy xong, bạn sẽ có file my_volume_backup.tar.gz ngay trong thư mục hiện tại.

Ví dụ thực tế: Backup volume WordPress

Giả sử bạn có stack WordPress với 2 volume: wp_data (chứa code + uploads) và db_data (chứa database MySQL). Để kiểm tra volume nào đang tồn tại:

docker volume ls

Output:

DRIVER    VOLUME NAME
local     wordpress_wp_data
local     wordpress_db_data

Backup cả hai volume:

# Tạo thư mục chứa backup
mkdir -p ~/backups

# Backup volume WordPress data docker run --rm \ -v wordpress_wp_data:/data \ -v ~/backups:/backup \ ubuntu tar czf /backup/wp_data_$(date +%Y%m%d).tar.gz -C /data .

# Backup volume MySQL data docker run --rm \ -v wordpress_db_data:/data \ -v ~/backups:/backup \ ubuntu tar czf /backup/db_data_$(date +%Y%m%d).tar.gz -C /data .

# Kiểm tra kết quả ls -lh ~/backups/

Output:

-rw-r--r-- 1 root root  45M Mar 14 10:30 wp_data_20260314.tar.gz
-rw-r--r-- 1 root root 120M Mar 14 10:31 db_data_20260314.tar.gz

Lưu ý: Khi backup volume database bằng cách tar trực tiếp, database đang chạy có thể gây ra file backup không nhất quán (inconsistent). Với database, cách tốt hơn là dùng dump: mình sẽ hướng dẫn ngay phần tiếp theo.

Backup Database

Backup database MySQL trong Docker
Dump database MySQL và backup volume data

Với database, thay vì tar volume (có thể bị corrupt khi DB đang chạy), bạn nên dùng công cụ dump chuyên dụng để export data ra file SQL. File này đảm bảo data nhất quán và có thể restore vào bất kỳ đâu.

MySQL / MariaDB

# Backup tất cả databases
docker exec mysql_container mysqldump -u root -p'your_password' --all-databases > ~/backups/mysql_all_$(date +%Y%m%d).sql
# Backup một database cụ thể
docker exec mysql_container mysqldump -u root -p'your_password' wordpress_db > ~/backups/wordpress_db_$(date +%Y%m%d).sql

Ví dụ output khi chạy:

$ docker exec wordpress_db mysqldump -u root -p'secret123' wordpress_db > ~/backups/wordpress_db_20260314.sql

$ ls -lh ~/backups/wordpress_db_20260314.sql -rw-r--r-- 1 root root 15M Mar 14 10:35 wordpress_db_20260314.sql

$ head -5 ~/backups/wordpress_db_20260314.sql -- MySQL dump 10.13 Distrib 8.0.36, for Linux (x86_64) -- -- Host: localhost Database: wordpress_db -- ------------------------------------------------------ -- Server version 8.0.36

Mẹo: Thêm --single-transaction khi backup database InnoDB để không lock tables:

docker exec mysql_container mysqldump -u root -p'your_password' --single-transaction wordpress_db > ~/backups/wordpress_db.sql

PostgreSQL

# Backup một database
docker exec postgres_container pg_dump -U postgres mydb > ~/backups/mydb_$(date +%Y%m%d).sql
# Backup tất cả databases
docker exec postgres_container pg_dumpall -U postgres > ~/backups/pg_all_$(date +%Y%m%d).sql

Ví dụ:

$ docker exec n8n_postgres pg_dump -U postgres n8n > ~/backups/n8n_db_20260314.sql
$ ls -lh ~/backups/n8n_db_20260314.sql
-rw-r--r-- 1 root root 8.2M Mar 14 10:40 n8n_db_20260314.sql

Mẹo: Với PostgreSQL, bạn cũng có thể dùng pg_dump -Fc để tạo file custom format, nhỏ hơn và hỗ trợ restore chọn lọc từng table:

docker exec postgres_container pg_dump -U postgres -Fc mydb > ~/backups/mydb.dump

Restore dữ liệu

Restore Docker Volume từ backup
Restore volume từ file backup và verify dữ liệu

Backup mà không biết restore thì coi như… chưa có backup. Phần này hướng dẫn bạn khôi phục dữ liệu từ file backup đã tạo.

Restore Docker Volume từ file tar

Logic ngược lại với backup: tạo container tạm, mount volume đích và file backup vào, rồi giải nén.

# Tạo volume mới (nếu chưa có)
docker volume create wordpress_wp_data
# Restore từ file backup
docker run --rm \
  -v wordpress_wp_data:/data \
  -v ~/backups:/backup \
  ubuntu bash -c "cd /data && tar xzf /backup/wp_data_20260314.tar.gz"

Quan trọng: Nếu volume đã có data cũ và bạn muốn restore sạch, hãy xoá volume trước rồi tạo lại:

# Dừng container đang dùng volume
docker compose down

# Xoá volume cũ docker volume rm wordpress_wp_data

# Tạo lại và restore docker volume create wordpress_wp_data docker run --rm \ -v wordpress_wp_data:/data \ -v ~/backups:/backup \ ubuntu bash -c "cd /data && tar xzf /backup/wp_data_20260314.tar.gz"

# Khởi động lại stack docker compose up -d

Restore Database từ dump

MySQL / MariaDB:

# Restore từ file SQL
docker exec -i mysql_container mysql -u root -p'your_password' wordpress_db < ~/backups/wordpress_db_20260314.sql

PostgreSQL:

# Restore từ file SQL
docker exec -i postgres_container psql -U postgres mydb < ~/backups/mydb_20260314.sql
# Restore từ custom format (.dump)
docker exec -i postgres_container pg_restore -U postgres -d mydb < ~/backups/mydb.dump

Verify data sau restore

Restore xong chưa đủ, bạn cần kiểm tra data có đúng không:

# Kiểm tra volume đã có data
docker run --rm -v wordpress_wp_data:/data ubuntu ls -la /data

# Kiểm tra database đã có tables docker exec mysql_container mysql -u root -p'your_password' -e "USE wordpress_db; SHOW TABLES;"

# Kiểm tra số records docker exec mysql_container mysql -u root -p'your_password' -e "USE wordpress_db; SELECT COUNT(*) FROM wp_posts;"

Output mong đợi:

+----------+
| COUNT(*) |
+----------+
|      142 |
+----------+

Nếu số liệu khớp với trước khi backup → restore thành công. Cuối cùng, mở trình duyệt truy cập website để kiểm tra trực quan, đây là bước verify quan trọng nhất.

Script backup tự động

Backup thủ công thì ai cũng quên. Giải pháp là viết bash script rồi cho chạy tự động bằng crontab.

Script backup toàn diện

Tạo file /opt/docker-backup/backup.sh:

#!/bin/bash
# ===========================================
# Docker Backup Script
# Backup all volumes + databases
# ===========================================

# --- Cấu hình --- BACKUP_DIR="/opt/docker-backup/data" LOG_FILE="/opt/docker-backup/backup.log" RETENTION_DAYS=7 DATE=$(date +%Y%m%d_%H%M%S) BACKUP_TODAY="$BACKUP_DIR/$DATE"

# --- Hàm ghi log --- log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" }

# --- Bắt đầu --- log "========== BẮT ĐẦU BACKUP ==========" mkdir -p "$BACKUP_TODAY"

# --- Backup tất cả Docker volumes --- log "Đang backup Docker volumes..." for volume in $(docker volume ls -q); do log " → Volume: $volume" docker run --rm \ -v "$volume":/data \ -v "$BACKUP_TODAY":/backup \ ubuntu tar czf "/backup/volume_${volume}.tar.gz" -C /data . 2>>"$LOG_FILE"

if [ $? -eq 0 ]; then log " ✓ OK ($(du -sh "$BACKUP_TODAY/volume_${volume}.tar.gz" | cut -f1))" else log " ✗ LỖI khi backup volume $volume" fi done

# --- Backup MySQL/MariaDB databases --- for container in $(docker ps --filter "ancestor=mysql" --filter "ancestor=mariadb" -q 2>/dev/null); do CONTAINER_NAME=$(docker inspect --format '{{.Name}}' "$container" | sed 's/\///') log "Đang backup MySQL: $CONTAINER_NAME"

docker exec "$container" mysqldump -u root \ -p"$(docker exec "$container" printenv MYSQL_ROOT_PASSWORD)" \ --all-databases --single-transaction \ > "$BACKUP_TODAY/mysql_${CONTAINER_NAME}.sql" 2>>"$LOG_FILE"

if [ $? -eq 0 ]; then gzip "$BACKUP_TODAY/mysql_${CONTAINER_NAME}.sql" log " ✓ OK ($(du -sh "$BACKUP_TODAY/mysql_${CONTAINER_NAME}.sql.gz" | cut -f1))" else log " ✗ LỖI khi backup MySQL $CONTAINER_NAME" fi done

# --- Backup PostgreSQL databases --- for container in $(docker ps --filter "ancestor=postgres" -q 2>/dev/null); do CONTAINER_NAME=$(docker inspect --format '{{.Name}}' "$container" | sed 's/\///') log "Đang backup PostgreSQL: $CONTAINER_NAME"

docker exec "$container" pg_dumpall -U postgres \ > "$BACKUP_TODAY/pg_${CONTAINER_NAME}.sql" 2>>"$LOG_FILE"

if [ $? -eq 0 ]; then gzip "$BACKUP_TODAY/pg_${CONTAINER_NAME}.sql" log " ✓ OK ($(du -sh "$BACKUP_TODAY/pg_${CONTAINER_NAME}.sql.gz" | cut -f1))" else log " ✗ LỖI khi backup PostgreSQL $CONTAINER_NAME" fi done

# --- Backup Docker Compose files --- log "Đang backup Docker Compose files..." find /opt /root /home -name "docker-compose.yml" -o -name "docker-compose.yaml" -o -name "compose.yml" 2>/dev/null | while read f; do DEST="$BACKUP_TODAY/compose/$(echo "$f" | sed 's/\//_/g')" mkdir -p "$BACKUP_TODAY/compose" cp "$f" "$DEST" log " → $f" done

# --- Xoá backup cũ (rotation) --- log "Đang xoá backup cũ hơn $RETENTION_DAYS ngày..." find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; DELETED=$? log " ✓ Đã dọn dẹp"

# --- Tổng kết --- TOTAL_SIZE=$(du -sh "$BACKUP_TODAY" | cut -f1) log "Tổng dung lượng backup: $TOTAL_SIZE" log "Lưu tại: $BACKUP_TODAY" log "========== KẾT THÚC BACKUP =========="

Phân quyền và chạy thử

# Tạo thư mục
sudo mkdir -p /opt/docker-backup/data

# Phân quyền thực thi sudo chmod +x /opt/docker-backup/backup.sh

# Chạy thử sudo /opt/docker-backup/backup.sh

Output mẫu:

[2026-03-14 10:45:00] ========== BẮT ĐẦU BACKUP ==========
[2026-03-14 10:45:00] Đang backup Docker volumes...
[2026-03-14 10:45:01]   → Volume: wordpress_wp_data
[2026-03-14 10:45:08]     ✓ OK (45M)
[2026-03-14 10:45:08]   → Volume: wordpress_db_data
[2026-03-14 10:45:15]     ✓ OK (120M)
[2026-03-14 10:45:15] Đang backup MySQL: wordpress_db
[2026-03-14 10:45:22]   ✓ OK (5.2M)
[2026-03-14 10:45:22] Đang backup Docker Compose files...
[2026-03-14 10:45:22]   → /opt/wordpress/docker-compose.yml
[2026-03-14 10:45:23] Đang xoá backup cũ hơn 7 ngày...
[2026-03-14 10:45:23]   ✓ Đã dọn dẹp
[2026-03-14 10:45:23] Tổng dung lượng backup: 170M
[2026-03-14 10:45:23] Lưu tại: /opt/docker-backup/data/20260314_104500
[2026-03-14 10:45:23] ========== KẾT THÚC BACKUP ==========

Cài crontab chạy hàng ngày

# Mở crontab
sudo crontab -e
# Thêm dòng sau — chạy backup lúc 3:00 AM mỗi ngày
0 3 * * * /opt/docker-backup/backup.sh >> /opt/docker-backup/cron.log 2>&1

Giải thích: 0 3 * * * nghĩa là chạy vào lúc 3 giờ sáng, mỗi ngày, mỗi tháng, mỗi năm. Lúc 3 AM thường ít traffic nhất, phù hợp để chạy backup.

Kiểm tra crontab đã được lưu:

sudo crontab -l
Crontab tự động backup Docker
Script backup chạy tự động mỗi ngày lúc 3:00 AM qua crontab

Backup offsite với rclone

Backup nằm trên cùng VPS với data gốc thì chưa an toàn : VPS hỏng là mất cả hai. Bạn cần đẩy backup lên cloud (offsite). Công cụ phổ biến nhất cho việc này là rclone , hỗ trợ hơn 40 dịch vụ cloud: Google Drive, Amazon S3, Backblaze B2, OneDrive...

Cài đặt rclone

# Cài đặt rclone
curl https://rclone.org/install.sh | sudo bash
# Kiểm tra
rclone version

Cấu hình remote storage

Chạy wizard cấu hình:

rclone config

Ví dụ cấu hình với Backblaze B2 (rẻ, đơn giản, phổ biến cho backup):

  • Chọn n (New remote)
  • Đặt tên: b2backup
  • Chọn storage type: Backblaze B2 (hoặc Google Drive, S3...)
  • Nhập Account ID và Application Key
  • Xác nhận và lưu

Test kết nối:

# Liệt kê buckets
rclone lsd b2backup:
# Upload thử một file
rclone copy ~/backups/wordpress_db_20260314.sql.gz b2backup:my-docker-backups/

Tích hợp rclone vào script backup

Thêm đoạn sau vào cuối script backup.sh (trước dòng "KẾT THÚC BACKUP"):

# --- Upload lên cloud ---
REMOTE_NAME="b2backup"           # Tên remote đã cấu hình trong rclone
REMOTE_BUCKET="my-docker-backups" # Tên bucket/folder trên cloud

log "Đang upload lên cloud ($REMOTE_NAME)..." rclone sync "$BACKUP_TODAY" "$REMOTE_NAME:$REMOTE_BUCKET/$DATE" --log-file="$LOG_FILE" --log-level INFO

if [ $? -eq 0 ]; then log " ✓ Upload thành công" else log " ✗ LỖI khi upload lên cloud" fi

# Xoá backup cũ trên cloud (giữ 30 ngày) rclone delete "$REMOTE_NAME:$REMOTE_BUCKET" --min-age 30d --log-file="$LOG_FILE" log " ✓ Đã dọn backup cũ trên cloud"

Giải thích:

  • rclone sync: đồng bộ thư mục backup lên cloud
  • rclone delete --min-age 30d: xoá file trên cloud cũ hơn 30 ngày (local giữ 7 ngày, cloud giữ 30 ngày cho an toàn)

Migrate data sang VPS mới

Một ngày đẹp trời, bạn cần chuyển toàn bộ Docker stack sang VPS mới (nâng cấp, đổi provider, hoặc đơn giản là muốn VPS mạnh hơn). Quy trình Backup → Transfer → Restore sẽ giúp bạn làm việc này mượt mà.

Bước 1: Backup trên VPS cũ

# Chạy script backup (hoặc backup thủ công)
sudo /opt/docker-backup/backup.sh
# Kiểm tra backup
ls -lh /opt/docker-backup/data/

Bước 2: Transfer sang VPS mới

Dùng rsync (nhanh, hỗ trợ resume nếu bị ngắt) hoặc scp (đơn giản hơn):

# Dùng rsync (khuyến khích)
rsync -avz --progress /opt/docker-backup/data/20260314_104500/ root@new-vps-ip:/opt/docker-backup/restore/
# Hoặc dùng scp
scp -r /opt/docker-backup/data/20260314_104500/ root@new-vps-ip:/opt/docker-backup/restore/

Mẹo: Nếu backup đã upload lên cloud (rclone), bạn có thể pull trực tiếp từ cloud xuống VPS mới, không cần transfer qua SSH:

# Trên VPS mới (sau khi cài rclone + cấu hình remote)
rclone copy b2backup:my-docker-backups/20260314_104500/ /opt/docker-backup/restore/

Bước 3: Restore trên VPS mới

# Trên VPS mới — cài Docker trước (xem lại Bài 2)

# Copy Docker Compose files vào đúng vị trí mkdir -p /opt/wordpress cp /opt/docker-backup/restore/compose/* /opt/wordpress/

# Restore volumes docker volume create wordpress_wp_data docker run --rm \ -v wordpress_wp_data:/data \ -v /opt/docker-backup/restore:/backup \ ubuntu bash -c "cd /data && tar xzf /backup/volume_wordpress_wp_data.tar.gz"

# Khởi động stack cd /opt/wordpress docker compose up -d

# Restore database gunzip /opt/docker-backup/restore/mysql_wordpress_db.sql.gz docker exec -i wordpress_db mysql -u root -p'your_password' wordpress_db < /opt/docker-backup/restore/mysql_wordpress_db.sql

# Verify docker exec wordpress_db mysql -u root -p'your_password' -e "USE wordpress_db; SHOW TABLES;"

Lưu ý: Nhớ cập nhật domain DNS trỏ về IP mới, và kiểm tra lại cấu hình reverse proxy (Nginx Proxy Manager) nếu có.

Best practices cho Docker backup

Có file backup chưa đủ, cần backup đúng cách nữa. Dưới đây là những best practices mà mình khuyên bạn nên áp dụng:

1. Test restore định kỳ

Backup mà chưa bao giờ test restore thì coi như chưa có backup. Hàng tháng, hãy thử restore vào một môi trường test (VPS khác hoặc máy local) để đảm bảo file backup thực sự hoạt động.

2. Encrypt backup

Backup chứa data nhạy cảm (database, config, credentials). Nếu upload lên cloud, hãy mã hoá trước:

# Encrypt bằng gpg
gpg --symmetric --cipher-algo AES256 backup.tar.gz
# → Tạo ra file backup.tar.gz.gpg (sẽ hỏi passphrase)
# Decrypt khi cần restore
gpg --decrypt backup.tar.gz.gpg > backup.tar.gz

Hoặc dùng rclone với tính năng crypt: tự động encrypt/decrypt khi upload/download:

# Tạo remote crypt (wrap trên remote gốc)
rclone config
# → Chọn "crypt" → wrap remote "b2backup:my-docker-backups"
# → Đặt tên "b2encrypted"
# → Nhập password
# Upload qua remote crypt — tự động encrypt
rclone sync /opt/docker-backup/data/ b2encrypted:

3. Quy tắc 3-2-1

Đây là quy tắc vàng trong backup:

  • 3 bản copy dữ liệu (1 bản gốc + 2 bản backup)
  • 2 loại media khác nhau (ví dụ: ổ cứng VPS + cloud storage)
  • 1 bản offsite (ở vị trí địa lý khác: cloud storage đảm bảo điều này)

Với setup trong bài này, bạn đã có:

  • Bản gốc: data trong Docker volumes
  • Bản backup local: /opt/docker-backup/data/
  • Bản backup cloud: Backblaze B2 / Google Drive (offsite)

→ Đúng chuẩn 3-2-1! ✓

4. Ghi log và monitor

Script backup nên luôn ghi log. Nếu backup fail mà bạn không biết, coi như không có backup. Thêm notification (email, Telegram, Discord webhook) khi backup lỗi:

# Thêm vào cuối script backup
if grep -q "LỖI" "$LOG_FILE"; then
    curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
        -d "chat_id=$CHAT_ID" \
        -d "text=⚠️ Docker backup có lỗi! Kiểm tra log: $LOG_FILE"
fi

📚 Serie Docker từ A đến Z

  1. Bài 1: Docker là gì? Tại sao nên dùng Docker trên VPS
  2. Bài 2: Cài đặt Docker và Docker Compose trên VPS Ubuntu
  3. Bài 3: Làm quen với Docker – Các lệnh cơ bản cần biết
  4. Bài 4: Docker Image & Dockerfile – Tự tạo Image riêng
  5. Bài 5: Docker Volume & Network – Quản lý dữ liệu và mạng
  6. Bài 6: Docker Compose là gì? Cài đặt và cú pháp cơ bản
  7. Bài 7: Deploy WordPress + MySQL + phpMyAdmin bằng Docker Compose
  8. Bài 8: Deploy LEMP Stack (Nginx + PHP-FPM + MariaDB) bằng Docker Compose
  9. Bài 9: Biến môi trường & file .env trong Docker Compose
  10. Bài 10: Reverse Proxy với Nginx Proxy Manager + SSL tự động
  11. Bài 11: Deploy ứng dụng Node.js / Python với Docker Compose
  12. Bài 12: Backup & Restore dữ liệu Docker Volume (đang đọc)
  13. Bài 13: Monitoring Docker với Portainer, Uptime Kuma và cAdvisor
  14. Bài 14: Docker Logging – Quản lý log hiệu quả
  15. Bài 15: Bảo mật Docker trên VPS
  16. Bài 16: CI/CD đơn giản – Auto deploy với Webhook + Docker Compose
  17. Bài 17: Docker Compose trong thực tế – Tổng hợp project mẫu

Tổng kết

Trong bài này, bạn đã học được:

  • Tại sao backup quan trọng: volume là data thật, container chỉ là vỏ
  • Backup volume thủ công: dùng container tạm để tar/gzip
  • Backup database: mysqldump cho MySQL, pg_dump cho PostgreSQL
  • Restore: từ tar file và SQL dump, kèm verify
  • Tự động hoá: bash script + crontab + rotation
  • Offsite backup: rclone đẩy lên cloud
  • Migration: workflow chuyển stack sang VPS mới
  • Best practices: test restore, encrypt, quy tắc 3-2-1

Backup là phần không sexy nhưng cực kỳ quan trọng trong vận hành hệ thống. Setup một lần, chạy tự động mỗi ngày, khi có sự cố, bạn sẽ cảm ơn chính mình đã làm điều này.

Bài 13, mình sẽ hướng dẫn bạn monitoring Docker : theo dõi CPU, RAM, disk, container health bằng các công cụ như cAdvisor, Prometheus và Grafana. Bạn sẽ biết chính xác hệ thống đang khoẻ hay đang "thở oxy" , trước khi mọi thứ sập.

👈 Bài trước: Deploy ứng dụng Node.js / Python với Docker Compose

👉 Bài tiếp: Monitoring Docker với Portainer, Uptime Kuma và cAdvisor

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Thạch Phạm

Thạch Phạm

Đồng sáng lập và Giám đốc điều hành của AZDIGI. Có hơn 15 năm kinh nghiệm trong phổ biến kiến thức liên quan đến WordPress tại thachpham.com, phát triển website và phát triển hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI