Triển khai Sidecar Container: Tự động hóa Backup Docker Volumes lên S3 và Google Drive

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Cơn ác mộng mang tên “bay màu dữ liệu” trên Docker

Dân chuyên Docker chắc chẳng lạ gì cảm giác “toát mồ hôi hột” khi server đột tử vào lúc 2 giờ sáng. Toàn bộ Docker Volume chứa dữ liệu quan trọng bỗng dưng bốc hơi không dấu vết. Mặc dù Docker Volume giúp lưu trữ dữ liệu bền vững (persistent data), nhưng nếu chỉ để nó nằm im trên host mà không có phương án dự phòng bên ngoài, bạn đang chơi một canh bạc đầy rủi ro.

Trước đây, mình thường viết script Bash, cài zipaws-cli trực tiếp lên máy host rồi đặt Cronjob. Cách này ổn khi chỉ có 1-2 container. Nhưng khi hệ thống phình to ra, việc quản lý hàng chục script trên nhiều server khác nhau trở thành thảm họa bảo trì. Hệ thống dần trở nên “rác” vì phải cài cắm quá nhiều công cụ bổ trợ không liên quan.

Bài học xương máu từ hệ thống 30 Microservices

Khi vận hành hơn 30 microservices cho một dự án e-commerce, mình từng mất trắng 2 ngày chỉ để tìm nguyên nhân lỗi memory leak. Hóa ra, việc nhồi nhét script backup chạy ngầm ngay bên trong container ứng dụng đã ngốn tới 500MB RAM mỗi lần thực thi và không chịu giải phóng. Kết quả là app chính sập liên tục. Sau cú vấp đó, mình chuyển hẳn sang mô hình Sidecar Container. Nửa năm “chinh chiến” trên production đã chứng minh đây là cách sạch và an toàn nhất.

Sidecar Container là gì? Tại sao nên dùng nó để backup?

Hãy tưởng tượng chiếc xe máy có thêm một thùng xe nhỏ bên cạnh (sidecar). Trong thế giới Docker, Sidecar là một container chạy song song, hỗ trợ container chính mà không can thiệp vào logic code. Nó đảm nhận các nhiệm vụ phụ trợ như ghi log, giám sát hoặc backup dữ liệu.

Tại sao Sidecar lại vượt trội hơn script chạy trên host?

  • Tách biệt tài nguyên (Isolation): Sidecar có lỗi cũng không kéo app chính sập theo.
  • Tính di động (Portability): Cấu hình nằm gọn trong docker-compose.yml. Bạn chỉ cần copy file sang server mới là chạy được ngay, không cần cài thêm tool cho host.
  • Quản lý tập trung: Mỗi dịch vụ có một Sidecar riêng, đẩy dữ liệu về các S3 Bucket khác nhau cực kỳ dễ dàng.

Thực hành: Cấu hình Sidecar Backup lên Amazon S3

Mình sẽ sử dụng image offen/docker-volume-backup. Đây là công cụ cực kỳ gọn nhẹ, hỗ trợ đa dạng từ S3, GCS cho đến Dropbox.

Bước 1: Chuẩn bị thông tin S3

Bạn cần chuẩn bị sẵn: Access Key ID, Secret Access Key, Region và tên Bucket. Hãy đảm bảo User IAM có quyền s3:PutObject để có thể đẩy file lên cloud.

Bước 2: Thiết lập Docker Compose

Giả sử bạn có service MariaDB cần lưu trữ. File docker-compose.yml sẽ được cấu hình như sau:

version: '3.8'

services:
  db:
    image: mariadb:10.6
    environment:
      MYSQL_ROOT_PASSWORD: secret_password
    volumes:
      - db_data:/var/lib/mysql
    restart: always

  backup:
    image: offen/docker-volume-backup:latest
    bind_volumes_from:
      - db
    environment:
      AWS_ACCESS_KEY_ID: YOUR_ACCESS_KEY
      AWS_SECRET_ACCESS_KEY: YOUR_SECRET_KEY
      AWS_REGION: ap-southeast-1
      S3_ENDPOINT: s3.amazonaws.com
      S3_BUCKET_NAME: my-app-backups
      S3_PATH: db-backups
      BACKUP_CRON_EXPRESSION: "0 2 * * *"
      BACKUP_FILENAME: "db-backup-%Y-%m-%dT%H-%M-%S.tar.gz"
      BACKUP_RETENTION_DAYS: 30
    restart: always

volumes:
  db_data:

Lưu ý các thông số chính:

  • bind_volumes_from: Cơ chế giúp Sidecar tự động nhận diện và mount toàn bộ volume từ service db.
  • BACKUP_RETENTION_DAYS: Giúp bạn tiết kiệm tới 70% chi phí lưu trữ bằng cách tự động xóa các bản backup cũ hơn 30 ngày.

Giải pháp thay thế: Backup lên Google Drive với Rclone

Nếu muốn tận dụng 15GB miễn phí từ Google Drive, rclone là lựa chọn linh hoạt hơn. Bạn có thể tự dựng một Sidecar tối giản như sau:

services:
  app:
    image: wordpress
    volumes:
      - wp_data:/var/www/html

  backup-gdrive:
    image: rclone/rclone:latest
    volumes:
      - wp_data:/data:ro
      - ./rclone.conf:/config/rclone/rclone.conf
    entrypoint: >
      /bin/sh -c "
      while true; do
        filename=\"backup-$(date +%Y%m%d).tar.gz\"
        tar -czf /tmp/$filename /data
        rclone copy /tmp/$filename gdrive:MyBackups
        rm /tmp/$filename
        echo \"Backup hoàn tất lúc $(date)\"
        sleep 86400
      done"

volumes:
  wp_data:

Mẹo nhỏ: Hãy chạy rclone config ở máy cá nhân trước để lấy file cấu hình, sau đó mới đưa lên server.

Kinh nghiệm “sống sót” khi vận hành thực tế

Sau nhiều lần xử lý sự cố, mình rút ra 4 quy tắc vàng:

  1. Luôn nén dữ liệu: Sử dụng tar -gz là bắt buộc. Nó không chỉ tiết kiệm dung lượng mà còn giảm đáng kể chi phí băng thông (egress) khi đẩy lên Cloud.
  2. Ưu tiên Read-Only: Hãy luôn thêm tag :ro khi mount volume vào Sidecar. Điều này ngăn chặn rủi ro Sidecar vô tình ghi đè làm hỏng dữ liệu gốc của app.
  3. Định kỳ kiểm tra file: Đừng tin hoàn toàn vào log “Success”. Mỗi tháng một lần, hãy tải thử file backup về và giải nén. Mình từng gặp trường hợp file backup nặng 0KB do database bị khóa lúc đang copy.
  4. Tuyệt đối không hardcode mật khẩu: Hãy dùng file .env. Đừng bao giờ commit trực tiếp Access Key lên GitHub trừ khi bạn muốn tặng tài khoản AWS cho hacker.

Lời kết

Sidecar Container không chỉ giúp kiến trúc hệ thống chuyên nghiệp hơn mà còn là chiếc “bảo hiểm” đắt giá cho dữ liệu. Chỉ mất 15 phút thiết lập hôm nay, bạn sẽ kê cao gối ngủ ngon mà không sợ những sự cố phần cứng bất ngờ làm gián đoạn công việc.

Share: