Docker volume và network: giữ dữ liệu và kết nối container

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Xóa một container là dữ liệu bên trong biến mất. Hai container muốn nói chuyện với nhau thì cần mạng đúng cách. Volume và network là hai khái niệm giải quyết đúng hai vấn đề này, và hiểu chúng giúp bạn tránh nhiều sự cố đáng tiếc.

Vì sao dữ liệu trong container dễ mất?

Mỗi container có một lớp ghi (writable layer) riêng, gắn với vòng đời của nó. Khi container bị xóa, lớp này đi theo. Với ứng dụng không lưu trạng thái thì không sao, nhưng với database hay thư mục tải lên của người dùng thì đây là thảm họa.

Ba cách lưu dữ liệu

LoạiDữ liệu nằm ở đâuHay dùng khi
VolumeDocker quản lýDữ liệu database, dữ liệu cần bền
Bind mountThư mục cụ thể trên máy chủPhát triển, sửa code thấy ngay
tmpfsBộ nhớ RAMDữ liệu tạm, nhạy cảm

Làm việc với volume

docker volume create pgdata
docker run -d --name db -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data postgres:16
docker volume ls
docker volume inspect pgdata
docker rm -f db
docker run -d --name db2 -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data postgres:16

Sau khi xóa container db, tạo container db2 gắn lại volume pgdata thì dữ liệu cũ vẫn còn. Đó là sức mạnh của volume: vòng đời của dữ liệu tách khỏi vòng đời container.

Bind mount cho lúc phát triển

docker run -d -p 3000:3000 -v "$(pwd)":/app -w /app node:20-alpine node server.js

Thư mục hiện tại của bạn được gắn vào /app. Sửa file bên ngoài là container thấy ngay. Hãy cẩn thận về quyền truy cập file và đừng dùng bind mount tùy tiện ở production, vì nó phụ thuộc cấu trúc thư mục của máy chủ.

Network: các container nói chuyện thế nào?

Docker có vài kiểu mạng. Thường gặp nhất:

  • bridge: mạng ảo mặc định trên một máy, container nằm cùng mạng thì liên lạc được.
  • host: container dùng thẳng mạng của máy chủ (chủ yếu trên Linux).
  • none: không có mạng.

Điều quan trọng: với mạng bridge do bạn tự tạo, các container gọi nhau bằng tên thay vì địa chỉ IP, vì Docker có DNS nội bộ.

docker network create appnet
docker run -d --name db --network appnet -e POSTGRES_PASSWORD=secret postgres:16
docker run -d --name api --network appnet -p 3000:3000 my-api:1.0

Bên trong api, bạn kết nối tới database bằng máy chủ db và cổng 5432. Chú ý rằng cổng 5432 không cần ánh xạ ra ngoài; chỉ những thứ cần truy cập từ bên ngoài (như api) mới cần -p.

Những lỗi thường gặp

  1. Dùng localhost để gọi container khác: trong container, localhost là chính nó, không phải máy chủ hay container bên cạnh.
  2. Quên gắn volume cho database: chạy ổn cho đến lần xóa container đầu tiên.
  3. Mở cổng database ra internet: không cần thiết và rất nguy hiểm.
  4. Sao lưu volume chưa từng thử khôi phục: bản sao lưu chưa kiểm tra chưa phải bản sao lưu.

Dọn dẹp an toàn

Lệnh docker system prune dọn container dừng, mạng không dùng và image treo. Thêm --volumes sẽ xóa cả volume không còn container nào dùng, nên hãy đọc kỹ danh sách mà Docker hỏi xác nhận trước khi đồng ý.

Kết luận

Hãy nhớ nguyên tắc: dữ liệu cần bền thì để ở volume, các container cùng ứng dụng thì cho vào chung một mạng tự tạo và gọi nhau bằng tên. Nắm hai điều này, bạn đã tránh được phần lớn rắc rối khi vận hành Docker.

Nếu bạn muốn luyện thêm bằng các bài thực hành triển khai thật, hãy xem danh sách khóa học trên codebem.com.

author_photo
Nguyễn Đình Cường

0 comment