Hướng dẫn A-Z Sao lưu và Khôi phục Docker Volumes (Kèm Script)

Docker đã cách mạng hóa cách chúng ta phát triển và triển khai ứng dụng. Các container linh hoạt, nhẹ nhàng và có tính di động cao. Nhưng có một sự thật quan trọng: container vốn là không cố định (ephemeral), còn dữ liệu bên trong nó (cơ sở dữ liệu, file người dùng upload, logs…) thì lại vô giá.

Sẽ ra sao nếu một ngày đẹp trời, toàn bộ dữ liệu đó biến mất do một lỗi vô tình hay sự cố hệ thống? Đó là lúc tầm quan trọng của việc sao lưu Docker Volumes trở nên rõ ràng hơn bao giờ hết.

Hiểu rõ được tầm quan trọng đó, Vinahost sẽ dẫn dắt bạn qua từng bước để sao lưu và khôi phục dữ liệu Docker một cách an toàn, từ phương pháp thủ công đơn giản đến kịch bản tự động hóa chuyên nghiệp.


1. Tại sao phải sao lưu Docker Volumes?

1.1 Dữ liệu trong Docker Container thường không cố định

Để hiểu tại sao dữ liệu trong container có thể bị mất, chúng ta cần nhìn vào cách Docker cấu trúc hệ thống file của nó. Khi một container được khởi tạo từ một image, Docker sử dụng một Hệ thống file xếp chồng (Union File System), ví dụ như OverlayFS.

Cấu trúc này bao gồm:

  1. Các lớp chỉ đọc: Đây là các lớp gốc từ image, chứa hệ điều hành, thư viện và mã nguồn ứng dụng của bạn. Chúng không bao giờ thay đổi.

  2. Lớp ghi tạm thời: Mọi thay đổi bạn thực hiện khi container đang chạy, ví dụ như tạo file log, ghi dữ liệu vào CSDL, tải file lên đều được ghi vào một lớp mỏng ở trên cùng gọi là lớp ghi tạm thời.

Vấn đề cốt lõi là lớp ghi này gắn liền với vòng đời của container. Khi bạn chạy lệnh docker stop và sau đó là docker rm, lớp ghi này cùng với toàn bộ dữ liệu bên trong nó sẽ bị xóa vĩnh viễn. Đây chính là bản chất của tính “không cố định” của container.

1.2 Docker Volume là gì và tại sao nó là giải pháp?

Để giải quyết vấn đề trên, Docker giới thiệu Volumes. Bạn có thể hình dung Volume như một “tủ tài liệu” được đặt bên ngoài căn phòng làm việc tạm thời. Dù bạn có thay đổi bao nhiêu căn phòng, tủ tài liệu đó vẫn ở nguyên vị trí và chứa đựng mọi giấy tờ quan trọng.

Về mặt kỹ thuật, Volume là một thư mục đặc biệt trên máy chủ host, được Docker quản lý hoàn toàn và gắn vào container để lưu trữ dữ liệu bền vững. Dữ liệu trong Volume tồn tại độc lập với vòng đời của container.

1.3 Các rủi ro nếu không sao lưu Volumes:

Ngay cả khi dữ liệu đã bền vững, nó vẫn chưa an toàn. Bạn vẫn phải đối mặt với các rủi ro:

  • Vô tình xóa volume: Một lệnh docker volume rm … bất cẩn có thể xóa sạch dữ liệu.
  • Lỗi phần cứng: Ổ cứng của máy chủ host có thể bị hỏng.
  • Dữ liệu bị hỏng: Lỗi trong ứng dụng của bạn có thể ghi dữ liệu sai, làm hỏng toàn bộ cơ sở dữ liệu.
  • Tấn công mạng: Ransomware có thể mã hóa toàn bộ hệ thống file trên máy chủ host, bao gồm cả các thư mục chứa dữ liệu của Docker Volumes.
tấn công Ransomware
tấn công Ransomware

Vì vậy, sao lưu là lớp phòng thủ cuối cùng và quan trọng nhất.


2. Phương pháp sao lưu và khôi phục Docker Volumes từ Cơ bản đến Nâng cao (kèm lệnh chi tiết)

Dưới đây là 3 cách tiếp cận phổ biến, phù hợp với các nhu cầu và kịch bản khác nhau.

Phương pháp 1: Sử dụng docker cp

Khi nào dùng: Phù hợp khi bạn cần lấy nhanh một vài file hoặc một thư mục nhỏ từ volume của một container đang hoạt động mà không muốn dừng nó.

Các bước sao lưu:

Bước 1: Tìm ID của container đang sử dụng volume: docker ps

Bước 2: Sao chép dữ liệu từ volume ra máy chủ host:

# Cú pháp: docker cp <container_id>:<đường_dẫn_bên_trong_container> <đường_dẫn_trên_host>
docker cp my_database_container:/var/lib/mysql ./mysql_backup

Các bước khôi phục:

# Cú pháp: docker cp <đường_dẫn_trên_host> <container_id>:<đường_dẫn_bên_trong_container>
docker cp ./mysql_backup my_database_container:/var/lib/mysql

Hạn chế: Phụ thuộc vào container, không phải là cách làm sạch sẽ và dễ tự động hóa.


Phương pháp 2: Sử dụng một Container Utility 

Đây là phương pháp tốt nhất và chuyên nghiệp nhất, vì nó tương tác trực tiếp với Volume mà không phụ thuộc vào container ứng dụng chính. Nó hoạt động ngay cả khi container của bạn đã bị dừng hoặc xóa.

Các bước sao lưu:

Bước 1: Dừng container đang sử dụng volume để đảm bảo dữ liệu không bị thay đổi trong quá trình sao lưu: docker stop my_app_container

Bước 2: Chạy một container tạm thời (ví dụ dùng image ubuntu), gắn (mount) volume cần sao lưu vào /data và thư mục backup trên host vào /backup. Sau đó, dùng lệnh tar để nén toàn bộ nội dung của /data.

# Cú pháp lệnh sao lưu
# --rm: Tự động xóa container tạm sau khi chạy xong
# -v <tên_volume>:/data: Gắn volume cần sao lưu vào thư mục /data trong container tạm
# -v $(pwd)/backup:/backup: Gắn thư mục 'backup' hiện tại trên host vào /backup
docker run --rm -v my_volume_name:/data -v $(pwd)/backup:/backup ubuntu tar czf /backup/backup.tar.gz -C /data .

Sau lệnh này, bạn sẽ có một file backup.tar.gz chứa toàn bộ dữ liệu của volume trong thư mục backup.

Các bước khôi phục:

Bước 1: Đảm bảo bạn đã có một volume mới để khôi phục vào (có thể tạo bằng docker volume create new_volume_name).

Bước 2: Chạy một container tạm tương tự, nhưng lần này giải nén file backup vào volume.

# Cú pháp lệnh khôi phục
docker run --rm -v new_volume_name:/data -v $(pwd)/backup:/backup ubuntu tar xzf /backup/backup.tar.gz -C /data

Giờ đây, new_volume_name đã chứa toàn bộ dữ liệu được phục hồi.


Phương pháp 3: Sao lưu trực tiếp từ thư mục trên Host

Khi nào dùng: Khi bạn muốn toàn quyền kiểm soát và hiểu rõ cấu trúc file trên host.

Các bước sao lưu:

Bước 1: Tìm đường dẫn vật lý của volume trên máy chủ host:

docker volume inspect my_volume_name

Tìm đến dòng “Mountpoint”: “/var/lib/docker/volumes/my_volume_name/_data”.

Bước 2: Sử dụng tar hoặc rsync để sao lưu trực tiếp thư mục này.

sudo tar czf ./backup/backup.tar.gz -C /var/lib/docker/volumes/my_volume_name/_data .

Rủi ro: Đây là phương pháp “kém di động” nhất. Nó bỏ qua lớp quản lý của Docker và có thể gây ra các vấn đề về quyền sở hữu file (file permissions) khi bạn cố gắng khôi phục trên một máy chủ khác. Chỉ nên dùng khi bạn thực sự biết mình đang làm gì.

Các bước khôi phục:

Việc khôi phục bằng phương pháp này cũng đi ngược lại với lớp quản lý của Docker và nó đòi hỏi sự cẩn thận, đặc biệt là về vấn đề quyền sở hữu file (file permissions). Đây là rủi ro lớn nhất bạn cần phải hiểu rõ. Vì nó khá phực tạp và nhiều bước, nên đội ngũ kỹ thuật của Vinahost không khuyến khích sử dụng, sử dụng cách 2 thì oke, còn cách này tham khảo thoi


3. Tự động hóa quy trình sao lưu với Script và Cron Job

Việc sao lưu thủ công rất dễ bị quên. Tự động hóa là chìa khóa để có một chiến lược bảo vệ dữ liệu đáng tin cậy.

3.1 Xây dựng một Script Sao lưu Đơn giản

Hãy tạo một file tên là backup_docker.sh và dán nội dung sau vào:

#!/bin/bash

# --- Cấu hình ---
VOLUME_NAME="my_volume_name" # Thay bằng tên volume của bạn
BACKUP_DIR="/home/user/docker_backups" # Thay bằng thư mục chứa backup của bạn
RETENTION_DAYS=7 # Số ngày giữ lại các bản backup cũ

# --- Logic Script ---
# Tạo thư mục backup nếu chưa tồn tại
mkdir -p $BACKUP_DIR

# Tạo tên file backup với ngày tháng
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/backup-$TIMESTAMP.tar.gz"

echo "Bắt đầu sao lưu volume '$VOLUME_NAME' vào '$BACKUP_FILE'..."

# Sử dụng phương pháp container phụ tá để sao lưu
docker run --rm -v $VOLUME_NAME:/data -v $BACKUP_DIR:/backup ubuntu tar czf /backup/backup-$TIMESTAMP.tar.gz -C /data .

echo "Sao lưu hoàn tất."

# Xóa các bản backup cũ hơn RETENTION_DAYS
echo "Xóa các bản backup cũ hơn $RETENTION_DAYS ngày..."
find $BACKUP_DIR -name "backup-*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete

echo "Hoàn tất."

Đừng quên cấp quyền thực thi cho script: chmod +x backup_docker.sh.

3.2 Lên lịch chạy tự động với Cron Job

Cron là một tiện ích lập lịch trên các hệ thống Linux.

  1. Mở bảng lập lịch: crontab -e

  2. Thêm dòng sau vào cuối file để chạy script của bạn vào 2 giờ sáng mỗi ngày:

    # Chạy script sao lưu Docker vào 2:00 sáng hàng ngày
    0 2 * * * /path/to/your/backup_docker.sh > /dev/null 2>&1

Vậy là xong! Hệ thống của bạn giờ đây đã được sao lưu tự động.


4. Sao lưu và Khôi phục trong môi trường Docker Compose

Khi sử dụng Docker Compose, Docker sẽ tự động tạo tên cho volume theo cú pháp <tên_thư_mục_dự_án>_<tên_volume_trong_compose_file>.

Ví dụ, nếu dự án của bạn nằm trong thư mục my_project và volume tên là db_data, tên volume thực tế sẽ là my_project_db_data. Bạn có thể dùng docker volume ls để kiểm tra tên chính xác.

Sau khi đã có tên, bạn hoàn toàn có thể áp dụng các phương pháp sao lưu ở trên, đặc biệt là phương pháp 2.


5. Lưu ý quan trọng khi sao lưu Docker Volumes

  1. Luôn dừng Container trước khi sao lưu: Đặc biệt quan trọng với cơ sở dữ liệu để đảm bảo dữ liệu được ghi xuống đĩa đầy đủ và nhất quán.
  2. Lưu trữ bản sao lưu ở một nơi khác (Off-site): Tuân thủ quy tắc 3-2-1, Hãy đẩy các file backup lên một dịch vụ lưu trữ đám mây (Cloud Storage) hoặc một máy chủ khác. Đừng bao giờ để cả dữ liệu gốc và bản sao lưu trên cùng một máy chủ vật lý.
  3. Nén các bản sao lưu: Lệnh tar với tùy chọn z (gzip) sẽ giúp bạn tiết kiệm không gian lưu trữ đáng kể.
  4. Kiểm tra quy trình khôi phục của bạn định kỳ: Một bản sao lưu chưa bao giờ được thử khôi phục chỉ là một niềm hy vọng, không phải là một kế hoạch. Hãy định kỳ thử khôi phục vào một môi trường test để đảm bảo bản sao lưu của bạn thực sự hoạt động.
  5. Ưu tiên sử dụng Named Volumes: Thay vì Bind Mounts (gắn một thư mục tùy ý trên host), hãy luôn khai báo Named Volumes trong file docker-compose.yml. Chúng được Docker quản lý hoàn toàn, giúp việc sao lưu trở nên độc lập, an toàn và dễ dàng hơn.

Câu hỏi thường gặp

Câu 1: Sao lưu Volume và sao lưu Image khác nhau như thế nào?

Image là một “bản thiết kế” chỉ đọc, chứa ứng dụng và các thư viện của bạn. Image không chứa dữ liệu người dùng.

Volume là nơi chứa dữ liệu bền vững mà ứng dụng của bạn tạo ra và sử dụng.

Bạn sao lưu Image để có thể triển khai lại ứng dụng nhanh chóng, và bạn sao lưu Volume để không làm mất dữ liệu của ứng dụng đó.

Câu 2: Tôi có thể sử dụng các công cụ bên thứ ba để sao lưu Docker không?

Chắc chắn rồi. Có nhiều công cụ mã nguồn mở và thương mại (như Duplicati, Restic, Portainer Backup…) có thể giúp bạn quản lý việc sao lưu một cách trực quan hơn. Tuy nhiên, việc hiểu các phương pháp nền tảng trong bài viết này sẽ giúp bạn sử dụng các công cụ đó hiệu quả hơn.

Câu 3: Làm thế nào để sao lưu cơ sở dữ liệu trong Docker một cách an toàn nhất?

Cách tốt nhất là kết hợp. Đầu tiên, hãy chạy lệnh dump của chính cơ sở dữ liệu đó (ví dụ: mysqldump hoặc pg_dump) để tạo ra một file .sql. Sau đó, sử dụng các phương pháp trong bài viết này để sao lưu Volume chứa file .sql đó. Cách này đảm bảo tính toàn vẹn tuyệt đối của cơ sở dữ liệu tại thời điểm dump.


Kết Luận

Dữ liệu trong Docker Volumes là tài sản quan trọng, và việc thiết lập một chiến lược sao lưu vững chắc không phải là một tùy chọn, mà là một yêu cầu bắt buộc. Bằng cách áp dụng phương pháp “container phụ tá” và tự động hóa quy trình với script, bạn có thể yên tâm rằng dữ liệu của mình luôn được bảo vệ.

Việc quản lý sao lưu là một phần thiết yếu, nhưng để nó hoạt động ổn định, bạn cần một nền tảng hạ tầng vững chắc. Hãy để Cloud Server hiệu năng cao của VinaHost làm nền móng cho các ứng dụng Docker, và dịch vụ Cloud Backup của chúng tôi bảo vệ an toàn cho các bản sao lưu quan trọng của bạn.

DỊCH VỤ CLOUD BACKUP TẠI VINAHOST
DỊCH VỤ CLOUD BACKUP TẠI VINAHOST

Mời bạn truy cập vào blog của VinaHost TẠI ĐÂY để theo dõi thêm nhiều bài viết mới. Hoặc nếu bạn muốn được tư vấn thêm thì có thể liên hệ với chúng tôi qua:

Bài viết liên quan
Bình luận
Subscribe
Notify of
guest
0 Góp ý
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Tổng lượt truy cập: lượt xem