Skip to content
Trung Tiến
Trang chủBlogDự ánCông cụKhóa họcVề tôiLiên hệ
en
✦

Trung Tiến

Công nghệ phụng sự chúng sinh

BlogDự ánKhóa họcVề tôiLiên hệ

© 2026

← ← Quay lại danh sách khóa học
Bài học 3/6⏱️ 20 phút

Docker Volumes — Persistent Data

2/6

⚠️Vấn đề: Dữ liệu tạm thời

Mặc định, dữ liệu trong container là ephemeral — biến mất khi container bị xóa. Với database, file upload, log — bạn cần dữ liệu sống sót. Docker có 3 giải pháp: bind mount, named volume, và tmpfs mount.
Ephemeral demo
# Dữ liệu biến mất khi xóa container
docker run --rm -it ubuntu bash -c "echo 'Hello' > /data.txt && exit"
docker run --rm -it ubuntu cat /data.txt
# cat: /data.txt: No such file or directory

🔗Bind Mount

Map một thư mục host vào container: -v host_path:container_path. Thay đổi ở host hoặc container đều đồng bộ ngay. Thêm :ro để container chỉ đọc.
Host Machine /home/user/html <-> Container /usr/share/nginx/html

Bind mount: thư mục host và container chia sẻ dữ liệu

Bind mount example
# Bind mount: map thư mục code vào nginx
docker run -d --name web   -v $(pwd)/html:/usr/share/nginx/html   -p 8080:80 nginx

# Sửa file trên host là thấy ngay trong container
echo "<h1>Hello from host!</h1>" > ./html/index.html
# → localhost:8080 thay đổi tức thì!

⚖️Bind Mount vs Named Volume

  • Bind Mount: -v /path/host:/path/container — bạn chỉ định đường dẫn host. Tiện cho code.
  • Named Volume: -v my-volume:/path/container — Docker quản lý ở /var/lib/docker/volumes/. An toàn, di động, dùng cho database.
Named volume
# Named volume — dùng cho database
docker volume create pg-data

docker run -d --name db   -v pg-data:/var/lib/postgresql/data   -e POSTGRES_PASSWORD=secret   postgres:16

# Volume tồn tại độc lập với container
docker rm db
docker run -d --name db-new   -v pg-data:/var/lib/postgresql/data   postgres:16  # Dữ liệu vẫn còn!

docker volume ls
docker volume prune  # Xóa volume không dùng

🎯Thực hành

  1. Tạo thư mục my-site và file index.html
  2. Chạy docker run -d --name site -v $(pwd)/my-site:/usr/share/nginx/html:ro -p 8080:80 nginx:alpine
  3. Vào http://localhost:8080 — thấy trang HTML
  4. Sửa index.html, refresh browser — thấy thay đổi ngay
  5. Tạo volume: docker volume create demo-vol
  6. Chạy docker run --rm -v demo-vol:/data alpine touch /data/test.txt
  7. Chạy docker run --rm -v demo-vol:/data alpine ls /data — test.txt còn

❓ Kiểm tra kiến thức

1. Bind mount khác gì so với named volume?

2. Tại sao database nên dùng volume?

← Bài trước3 / 6Bài tiếp →