Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container

Container là ephemeral – chúng sinh ra, chết đi, và mất hết dữ liệu nếu không được quản lý đúng cách. Trong DevOps, việc lưu trữ dữ liệu lâu dài (persistent data) cho database, log, hay artifact là vấn đề sống còn. Docker Volume trong DevOps chính là giải pháp. Trong bài thứ tư của series, chúng ta sẽ đi sâu vào storage container, cách dùng volumebind mount để lưu persistent data, cùng thực hành để quản lý dữ liệu hiệu quả trong pipeline CI/CD.

Docker Storage Là Gì?

Tổng Quan Storage trong Docker

Docker dùng storage để lưu dữ liệu ngoài vòng đời container.

  • Mặc định: Dữ liệu lưu trong container (writeable layer), mất khi container bị xóa.
  • Storage driver: Overlay2, AUFS – quản lý layer image và container.

DevOps: Storage cần thiết để lưu DB, config, hoặc artifact giữa các job CI/CD.

Volume vs Bind Mount vs Tmpfs

Loại Đặc điểm Ứng dụng DevOps
Volume Quản lý bởi Docker, persistent DB, log dài hạn
Bind Mount Liên kết thư mục host Code dev, config tạm
Tmpfs Lưu RAM, không persistent Dữ liệu nhạy cảm tạm thời

Ví dụ: Volume cho Postgres DB, bind mount cho code test, tmpfs cho secret tạm.

Docker Volume: Persistent Data

Volume Là Gì?

Volume là thư mục do Docker quản lý, lưu ngoài container (thường ở /var/lib/docker/volumes).

  • Ưu điểm: Persistent, dễ backup, share giữa container.
  • Tạo volume:
    docker volume create my-volume

Sử Dụng Volume

  1. Chạy container với volume:
    docker run -d --name db -v my-volume:/var/lib/postgresql/data postgres
    • Dữ liệu DB lưu trong my-volume, không mất khi container dừng.
  2. Kiểm tra:
    docker volume ls
    docker volume inspect my-volume

DevOps: Volume đảm bảo dữ liệu test DB không mất giữa các job.

Bind Mount: Liên Kết Host

Bind Mount Là Gì?

Bind mount gắn thư mục/file từ host vào container.

  • Ưu điểm: Linh hoạt, dùng code/dev trực tiếp.
  • Nhược điểm: Phụ thuộc host, khó di chuyển.

Sử Dụng Bind Mount

  1. Chạy container với bind mount:
    docker run -d -v /home/user/app:/app nginx
    • /home/user/app trên host gắn vào /app trong container.
  2. Test:
    • Thay đổi file trên host → container thấy ngay.

DevOps: Bind mount hữu ích khi debug code trong pipeline.

Thực Hành: Quản Lý Dữ Liệu

Volume với Postgres

  1. Tạo volume:
    docker volume create pg-data
  2. Chạy Postgres:
    docker run -d --name pg -v pg-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecret postgres
  3. Thêm dữ liệu:
    docker exec -it pg psql -U postgres -c "CREATE TABLE test (id INT); INSERT INTO test VALUES (1);"
  4. Xóa container và chạy lại:
    docker rm -f pg
    docker run -d --name pg -v pg-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecret postgres
    docker exec -it pg psql -U postgres -c "SELECT * FROM test;"
    • Kết quả: Dữ liệu (id=1) vẫn còn.

Bind Mount với Nginx

  1. Tạo file HTML trên host:
    mkdir ~/web
    echo "<h1>Hello DevOps</h1>" > ~/web/index.html
  2. Chạy Nginx:
    docker run -d -p 8080:80 -v ~/web:/usr/share/nginx/html nginx
  3. Test:
    curl localhost:8080
    • Kết quả: “Hello DevOps”.

Debug tip:

  • Volume không mount: Kiểm tra docker inspect <container> xem mount point.
  • Bind mount lỗi: Đảm bảo path host tồn tại và có quyền.

Ứng Dụng trong DevOps

Pipeline CI/CD

  • Volume: Lưu artifact giữa các stage:
    build:
    image: docker
    script:
      - docker run -v build-data:/app my-app make build
    deploy:
    image: docker
    script:
      - docker run -v build-data:/app my-app deploy
  • Kết quả: Build output được tái sử dụng.

Microservices

  • Volume: DB container lưu dữ liệu persistent.
  • Bind mount: Dev gắn code vào container để debug realtime.

Case study: Một team dùng volume để lưu log test, giảm thời gian debug từ 1 giờ xuống 15 phút khi pipeline thất bại.

Backup và Restore

  • Backup volume:
    docker run --rm -v pg-data:/data -v $(pwd):/backup ubuntu tar cvf /backup/pg-backup.tar /data
  • Restore:
    docker run --rm -v pg-data:/data -v $(pwd):/backup ubuntu tar xvf /backup/pg-backup.tar -C /data

Kết Luận

Docker Volume trong DevOps là công cụ mạnh mẽ để quản lý persistent data qua volumebind mount, đảm bảo dữ liệu không mất trong pipeline và microservices. Thực hành với Postgres và Nginx cho thấy bạn có thể áp dụng storage container vào thực tế. Bài tiếp theo, chúng ta sẽ khám phá Docker Compose – cách điều phối multi-container trong DevOps.

Điều hướng chuỗi bài viết<< Bài 3. Docker Networking: Kết Nối Container Hiệu Quả
>> Bài 5. Docker Compose: Điều Phối Multi-Container Hiệu Quả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm