Danh sách bài viết trong series Sử dụng Docker từ cơ bản đến nâng cao
- Bài 1. Cơ Bản Docker: Hiểu Container và Vai Trò trong DevOps
- Bài 2. Docker Image: cách xây Dựng và tối Ưu
- Bài 3. Docker Networking: Kết Nối Container Hiệu Quả
- Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container
- Bài 5. Docker Compose: Điều Phối Multi-Container Hiệu Quả
- Bài 6. Docker Swarm: Orchestration Cơ Bản để Scale Container
- Bài 7. Docker Security: Bảo Mật Container Hiệu Quả
- Bài 8. Docker CI/CD: Tích Hợp Container vào Pipeline DevOps
- Bài 9. Docker Monitoring: Theo Dõi và Logging Container Hiệu Quả
- Bài 10. Docker resources: Tối Ưu và Debug Container Hiệu Quả
- Bài 11. Docker và Microservices: Thiết Kế Ứng Dụng Phân Tán
- Bài 12. Docker Registry: Tự Host và Quản Lý Image Hiệu Quả
- Bài 13. Docker với Cloud: Tích Hợp Container trên AWS ECS và GCP Cloud Run
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 volume và bind 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
- 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.
- Dữ liệu DB lưu trong
- 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
- 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.
- 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
- Tạo volume:
docker volume create pg-data
- Chạy Postgres:
docker run -d --name pg -v pg-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecret postgres
- Thêm dữ liệu:
docker exec -it pg psql -U postgres -c "CREATE TABLE test (id INT); INSERT INTO test VALUES (1);"
- 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
- Tạo file HTML trên host:
mkdir ~/web echo "<h1>Hello DevOps</h1>" > ~/web/index.html
- Chạy Nginx:
docker run -d -p 8080:80 -v ~/web:/usr/share/nginx/html nginx
- 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 volume và bind 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.