1. Docker Storage - Tổng quan
Mặc định, data trong container bị mất khi container bị xóa. Docker cung cấp 3 cơ chế để lưu trữ persistent data:
┌─────────────────────────────────────────────────┐
│ Docker Host │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Volumes │ │ Bind │ │ tmpfs │ │
│ │ │ │ Mounts │ │ Mounts │ │
│ │ /var/lib/ │ │ Any │ │ RAM only │ │
│ │ docker/ │ │ host │ │ (no disk) │ │
│ │ volumes/ │ │ path │ │ │ │
│ └─────┬────┘ └─────┬────┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌─────▼──────────────▼──────────────▼───────┐ │
│ │ Container │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
2. Docker Volumes
Volumes là cách recommended để persist data. Docker quản lý hoàn toàn volumes trong /var/lib/docker/volumes/.
2.1. Tạo và quản lý Volumes
# Tạo volume docker volume create my-dataLiệt kê volumes
docker volume ls
Xem chi tiết volume
docker volume inspect my-data
Xóa volume
docker volume rm my-data
Cleanup unused volumes
docker volume prune
2.2. Sử dụng Named Volumes
# Mount named volume vào container docker run -d --name db \ -v postgres-data:/var/lib/postgresql/data \ postgres:16Hoặc dùng --mount syntax (recommended cho clarity)
docker run -d --name db
--mount source=postgres-data,target=/var/lib/postgresql/data
postgres:16
2.3. Anonymous Volumes
# Docker tự tạo volume với random name docker run -d -v /var/lib/postgresql/data postgres:16Anonymous volumes thường khó quản lý
→ Luôn dùng named volumes
3. Bind Mounts
Bind mounts mount một directory/file từ host vào container:
# Bind mount directory
docker run -d --name web \
-v /home/user/html:/usr/share/nginx/html:ro \
nginx
# Mount syntax (recommended)
docker run -d --name web \
--mount type=bind,source=/home/user/html,target=/usr/share/nginx/html,readonly \
nginx
# Development: live code reload
docker run -d --name dev-app \
-v $(pwd)/src:/app/src \
-v $(pwd)/package.json:/app/package.json \
node:20-alpine npm run dev
Volumes vs Bind Mounts
| Feature | Volumes | Bind Mounts |
|---|---|---|
| Quản lý | Docker quản lý | User quản lý |
| Location | /var/lib/docker/volumes/ | Bất kỳ path nào |
| Pre-populate | Có (copy data từ container) | Không (override content) |
| Backup | docker volume commands | Standard filesystem tools |
| Use case | Production data | Development, config files |
4. tmpfs Mounts
Lưu data trong RAM, không persist xuống disk:
# tmpfs mount docker run -d --name app \ --tmpfs /tmp:rw,size=100m \ --mount type=tmpfs,target=/app/cache,tmpfs-size=50m \ myappUse case: Sensitive data (passwords, tokens)
Data tự động xóa khi container stop
5. Backup và Restore Data
5.1. Backup Volume
# Backup volume vào tar file docker run --rm \ -v postgres-data:/data:ro \ -v $(pwd)/backups:/backup \ alpine tar czf /backup/postgres-backup-$(date +%Y%m%d).tar.gz -C /data .Hoặc dùng docker cp
docker cp db:/var/lib/postgresql/data ./backup/
5.2. Restore Volume
# Restore từ backup docker volume create postgres-data-restored
docker run --rm
-v postgres-data-restored:/data
-v $(pwd)/backups:/backup:ro
alpine tar xzf /backup/postgres-backup-20260330.tar.gz -C /data
5.3. Clone Volume
# Clone volume
docker volume create --name cloned-data
docker run --rm \
-v original-data:/from:ro \
-v cloned-data:/to \
alpine sh -c "cp -a /from/. /to/"
6. Volume Drivers và Plugins
# NFS volume docker volume create \ --driver local \ --opt type=nfs \ --opt o=addr=192.168.1.100,rw \ --opt device=:/shared/data \ nfs-dataTrong Docker Compose
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: "addr=192.168.1.100,nolock,soft,rw"
device: ":/shared/data"
7. Read-only Volumes và Permissions
# Read-only volume docker run -d -v config:/etc/app/config:ro nginxRead-only container filesystem
docker run -d --read-only
--tmpfs /tmp
-v app-data:/data
myappVolume permissions
docker run -d
-v data:/data
--user 1000:1000
myapp
8. Storage Best Practices cho Databases
Luôn dùng named volumes cho database data
Separate volumes cho data, logs, và backups
Regular backups với automated scripts
Test restore procedures thường xuyên
Monitor disk usage với docker system df
# Docker Compose best practice cho database
services:
db:
image: postgres:16-alpine
volumes:
- db-data:/var/lib/postgresql/data
- db-logs:/var/log/postgresql
- ./db/init:/docker-entrypoint-initdb.d:ro
environment:
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
db-data:
db-logs:
9. Tổng kết
Trong bài này, bạn đã nắm được:
3 loại storage: Volumes, Bind Mounts, tmpfs
Tạo và quản lý Docker volumes
Backup và restore data từ volumes
Volume drivers cho NFS và cloud storage
Read-only volumes và permissions
Storage best practices cho databases
Bài tiếp theo sẽ hướng dẫn Docker Compose nâng cao - profiles, extends, override files.