Chuyển đến nội dung chính

Bài 10: Docker Volumes và Persistent Storage

Docker volumes, bind mounts, tmpfs mounts, volume drivers, named volumes, anonymous volumes, volume plugins cho NFS/AWS EBS/GlusterFS. Backup và restore data, storage best practices cho databases và stateful applications.

🔒 DevSecOps — Bài 10 Bài 10: Docker Volumes và Persistent Storage

Docker từ Cơ bản đến Nâng cao

Phần 3: Networking, Storage và Compose Nâng cao

xdev.asia

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-data

Liệ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:16

Hoặ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:16

Anonymous 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 \
    myapp

Use 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-data

Trong 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 nginx

Read-only container filesystem

docker run -d --read-only
--tmpfs /tmp
-v app-data:/data
myapp

Volume 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.