Tìm hiểu Docker Volume là gì, các loại volume phổ biến và hướng dẫn sử dụng Docker Volume một cách dễ hiểu để quản lý dữ liệu hiệu quả trong container.
Trong hệ sinh thái Docker, quản lý dữ liệu là một yếu tố quan trọng để đảm bảo tính bền vững và linh hoạt của ứng dụng. Docker Volume là giải pháp giúp lưu trữ và quản lý dữ liệu một cách độc lập khỏi vòng đời của container. Bài viết này sẽ phân tích chi tiết Docker Volume là gì và hướng dẫn bạn cách sử dụng volume trong Docker để tối ưu hóa quy trình quản lý dữ liệu.
>>> Có thể bạn quan tâm: Docker Hub là gì? Hướng dẫn sử dụng Docker Hub chi tiết
1. Docker Volume là gì?
Docker Volume là một cơ chế để quản lý dữ liệu trong các container Docker. Khi bạn chạy một container, dữ liệu có thể được lưu trữ trong hệ thống file bên trong container đó. Tuy nhiên, khi container bị xóa hoặc tạo lại, dữ liệu này sẽ bị mất. Để giải quyết vấn đề này, Docker cung cấp volumes.
Docker cung cấp 3 cách khác nhau để có thể chia sẻ dữ liệu (mount data) từ Docker host tới container đó là:
- volumes
- bind mounts
- tmpfs mounts
Hình ảnh trên mô tả vị trí lưu trữ dữ liệu của container trên Docker host. Theo đó, ta có thể thấy được:
- volumes được lưu trữ như một phần của filesystem trên Docker host và được quản lý bởi Docker (xuất hiện trong /var/lib/docker/volumes trên Linux). Đây được xem là cách tốt nhất để duy trì dữ liệu trong Docker
- bind mounts cho phép lưu trữ bất cứ đâu trong host system.
- tmpfs mounts cho phép lưu trữ tạm thời dữ liệu vào bộ nhớ của Docker host, không bao giờ ghi vào filesystem của Docker host.
2. Phân tích các loại Docker Volume
2.1 Volume
Volumes được tạo và quản lý bởi Docker. Ta có thể tạo volumes với câu lệnh docker volume create hoặc tạo volumes trong khi tạo containers, ...
Khi tạo ra volumes, nó sẽ được lưu trữ trong một thư mục trên Docker host (/var/lib/docker/volumes/<volume-name>). Khi ta thực hiện mount volumes vào 1 thư mục trong container có nghĩa là khi ta truy cập vào container và thực hiện bất kỳ hành động nào ở thư mục ta vừa mount thì volume cũng sẽ biến đổi theo.
Volumes có thể được mount vào nhiều containers cùng một lúc. Khi không có containers nào sử dụng volumes thì volumes vẫn ở trạng thái cho phép mount vào containers và không bị xóa một cách tự động.
Volume là cách phổ biến được lựa chọn để duy trì dữ liệu trong services và containers. Một số trường hợp sử dụng volumes có thể bao gồm:
- Chia sẻ dữ liệu giữa nhiều containers: Ví dụ container chứa sql cần phải chia sẻ với nhiều container web khác
- Dữ liệu cần tồn tại khi dừng hoặc xóa containers: Bạn có một cơ sở dữ liệu hoặc một ứng dụng lưu trữ dữ liệu quan trọng cần duy trì, ngay cả khi container chạy ứng dụng bị dừng hoặc bị xóa.
- Docker host có cấu trúc filesystem không ổn định: như việc nâng cấp hệ điều hành, thay đổi ổ cứng, hoặc các yêu cầu di chuyển hệ thống.
- Lưu trữ dữ liệu containers trên remote hosts hoặc cloud: Khi bạn muốn chia sẻ cho nhiều docker server khác
- Khi có nhu cầu sao lưu, backup hoặc migrate dữ liệu tới Docker host khác thì volumes là một sự lựa tốt. Ta cần phải dừng containers sử dụng volumes sau đó thực hiện backup tại đường dẫn /var/lib/docker/volumes/<volume-name>
2.2 Bind mounts
Bind mounts thường được sử dụng trong các trường hợp sau:
- Chia sẻ các file cấu hình từ Docker host tới containers: Bạn có một file cấu hình Nginx trên Docker host ở đường dẫn /etc/nginx/nginx.conf. Bạn muốn sử dụng cấu hình này cho container Nginx
- Chia sẻ file hoặc cấu trúc thư mục cố định: container nginx cần ghi log trực tiếp vào file /var/log/
2.3 Tmpfs mount
tmpfs mount được sử dụng trong các trường hợp ta không muốn dữ liệu tồn tại trên Docker host hay containers vì lý do bảo mật hoặc đảm bảo hiệu suất của containers khi ghi một lượng lớn dữ liệu một cách không liên tục.
Nếu bạn có một container cần xử lý thông tin đăng nhập tạm thời mà bạn không muốn lưu lại trên Docker host, bạn có thể sử dụng tmpfs mount
3. Hướng dẫn sử dụng Docker Volume
3.1 Cách sử dụng volumes
Để tạo một volume, ta sử dụng câu lệnh:
docker volume create my-vol |
Khi khởi chạy containers với volume chưa có (tồn tại) thì Docker sẽ tự động tạo ra volume với tên được khai báo hoặc với một tên ngẫu nhiên và đảm bảo tên ngẫu nhiên này là duy nhất. Ví dụ:
docker run -d \ -it \ --name devtest \ --mount type=volume,source=myvol2,target=/var/www/html \ nginx:latest |
câu lệnh trên sẽ thực hiện tạo volume myvol2 và mount tới thư mục /var/www/html trong container devtest.
Khi này ta sử dụng lệnh đăng nhập vào container và thực hiện bất kỳ thao tác tạo sửa xóa file trên thư mục /var/www/html thì trên volume /var/lib/docker/volumes/myvol2 cũng sẽ thay đổi theo.
docker exec -it devtest bash |
Nếu muốn mount volume với chế độ readonly, ta có thể thêm vào trong --mount. Với ví dụ trên có thể là làm như sau:
--mount source=myvol2,target=/app,readonly |
3.2 Cách sử dụng bind mounts
Sử dụng tương tự như volume, ta chỉ cần thay đổi giá trị của type trong --mount. Theo đó ta có câu lệnh ví dụ như sau:
docker run -d \ -it \ --name devtest \ --mount type=bind,source=/home/thanhquang,target=/var/www/html \ nginx:latest |
Lúc này docker sẽ không tạo volume nữa mà sẽ mount thư mục /home/thanhquang có sẵn trong máy vào thư mục /var/www/html trên container devtest. (Lưu ý là thư mục bên trong container nhé).
3.3 Cách sử dụng tmpfs mounts
Khi sử dụng tmpfs mounts thì ta không thể chia sẻ dữ liệu giữa containers.
tmpfs mounts chỉ làm việc đối với Linux containers.
Tương tự như khi sử dụng volumes, ta chỉ cần thay đổi giá trị type trong --mount và bỏ source đi.
docker run -d \ -it \ --name devtest \ --mount type=tmpfs,target=/var/www/html \ nginx:latest |
4. Volume share
Docker volume share là một tính năng cho phép nhiều container sử dụng chung một volume. Ví dụ như bạn có 2 container và 2 container này cùng chạy một image là nginx và bạn muốn 2 container này cùng chạy song song, nếu chẳng may có container này bị down thì sẽ có container kia còn dùng được.
Tạo docker volume.
docker volume create nginx-data |
Chạy 2 container nginx dùng chung một volume vừa tạo.
docker run -d --name nginx-container-1 -v nginx-data:/usr/share/nginx/html -p 8081:80 nginx docker run -d --name nginx-container-2 -v nginx-data:/usr/share/nginx/html -p 8082:80 nginx |
Bây giờ ta sẽ vào container 1 để tạo ra 1 file index xong đó lên trang web truy cập vào 2 container xem có share chung dữ liệu không.
docker exec -it nginx-container-1 /bin/bash |
Ta sẽ dùng lệnh EOF để có thể tạo 1 file index.html nhé.
cat > /usr/share/nginx/html/index.html << 'EOF' Nội dung file index …. EOF |
Tổng kết
Đến đây chắc hẳn bạn đã hiểu rõ Docker volume là gì cũng như cách sử dụng hiệu quả. Docker volume là một cơ chế lưu trữ dữ liệu trong Docker, cho phép dữ liệu được giữ lại ngay cả khi container bị xóa. Volumes được lưu trữ ngoài container's filesystem, giúp dữ liệu được bảo toàn và dễ dàng chia sẻ giữa các container. Docker volume giúp tách biệt dữ liệu khỏi vòng đời của container, cho phép quản lý dữ liệu linh hoạt và an toàn hơn. Đây là giải pháp tối ưu để quản lý dữ liệu bền vững trong các ứng dụng containerized, đảm bảo tính toàn vẹn và khả năng truy cập dữ liệu liên tục.
>>> Xem thêm: Docker image là gì? Dockerfile là gì? Build image từ Dockerfile