❤️ 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.

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.yml là infrastructure 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

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ần | Giải thích |
|---|---|
docker run --rm | Tạo một container tạm, tự xoá sau khi chạy xong |
-v my_volume:/data | Mount volume cần backup vào thư mục /data trong container |
-v $(pwd):/backup | Mount thư mục hiện tại (trên host) vào /backup trong container |
ubuntu | Dù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

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

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

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