Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Docker Volume để:
- Giúp container lưu trữ dữ liệu lâu dài, không bị mất khi container bị xoá.
- Dùng chung dữ liệu giữa nhiều container.
- Kiểm tra xem dữ liệu còn tồn tại không sau khi container bị xoá.
Xem thêm:
Docker Registry và Docker Repo – Bài 6
Hướng dẫn Mapping Port trong Docker – Mở port (expose và publish) – Bài 7
1. Tại sao cần dùng Docker Volume?
Khi bạn không tạo volume, mọi dữ liệu được ghi trong container sẽ nằm trong hệ thống tạm của nó. Nếu bạn xoá container, toàn bộ dữ liệu bên trong sẽ bị mất.
Docker Volume giúp bạn lưu dữ liệu vào hệ thống file của host, độc lập với container. Dữ liệu vẫn tồn tại ngay cả khi container bị xoá.
2. Tạo volume
Tạo volume tên là website:
docker volume create website
Kiểm tra:
docker volume ls
Bạn sẽ thấy:
DRIVER VOLUME NAME local website
3. Tạo container và gắn volume bằng --mount
Chúng ta chạy một container Apache PHP, gắn volume vào đúng thư mục Apache mặc định (/var/www/html):
docker run -d \
--name web01 \
--mount source=website,target=/var/www/html \
-p 4444:80 \
php:apache
Giải thích:
source=website: tên volume đã tạo.target=/var/www/html: nơi mount trong container.-p 4444:80: mở cổng 80 của container ra cổng 4444 của host.
4. Thêm nội dung vào volume từ host
Tìm đường dẫn thực tế của volume:
docker volume inspect website
Bạn sẽ thấy trường "Mountpoint" trỏ đến thư mục thực tế trên máy chủ, ví dụ:
/var/lib/docker/volumes/website/_data
Gõ:
cd /var/lib/docker/volumes/website/_data
Tạo file:
echo "<h1>Hello from Docker Volume</h1>" > index.html
5. Truy cập container từ trình duyệt
Giả sử máy bạn có IP 192.168.1.100. Truy cập:
http://192.168.1.100:4444
Bạn sẽ thấy dòng chữ: Hello from Docker Volume.
6. Chạy container thứ 2 dùng chung volume
Chúng ta tạo container thứ hai dùng cùng volume website:
docker run -d \
--name web02 \
--mount source=website,target=/var/www/html \
-p 7777:80 \
php:apache
Truy cập:
http://192.168.1.100:7777
→ Bạn sẽ thấy cùng một nội dung như container đầu tiên.
7. Kiểm tra đồng bộ dữ liệu giữa container và volume
Bạn có thể thay đổi file index.html từ host hoặc từ bên trong container, và thấy kết quả phản ánh ngay:
Từ container:
docker exec -it web01 sh
echo "<h1>Updated from inside container</h1>" > /var/www/html/index.html
exit
Truy cập lại trình duyệt, bạn sẽ thấy nội dung đã được cập nhật.
8. Xoá container và kiểm tra dữ liệu
Dừng và xoá cả hai container:
docker stop web01 web02
docker rm web01 web02
Kiểm tra dữ liệu:
ls /var/lib/docker/volumes/website/_data
→ Dữ liệu vẫn còn!
9. So sánh gắn volume và không gắn volume
| Tiêu chí | Không gắn volume | Gắn volume (best practice) |
|---|---|---|
| Dữ liệu sau khi xoá container | Bị mất | Vẫn còn nguyên |
| Dùng chung giữa nhiều container | Không | Có |
| Tốc độ đọc/ghi dữ liệu | Tốt | Tốt |
| Quản lý, backup dễ dàng | Khó | Dễ dàng, di chuyển, backup tốt |
Kết luận
Trong bài thực hành hôm nay, chúng ta đã học:
- Cách tạo volume bằng Docker.
- Gắn volume vào container bằng
--mount. - Kiểm tra dữ liệu tồn tại sau khi container bị xoá.
- Chia sẻ dữ liệu giữa nhiều container thông qua volume.
Bài viết cùng chủ đề:
Docker Network là gì? Làm sao các container kết nối với nhau? – Bài 9
Hướng dẫn chạy MySQL và Adminer bằng Docker & Docker Compose – Bài 10