[Docker] Docker volume
Như chúng ta đều biết, đặc điểm của Docker container là chúng chạy độc lập, và không ảnh hưởng đến nhau, thế nhưng vì một lí do nào đó, chúng ta lại muốn chia sẻ data giữa các container ví dụ, bạn có một 2,3 web server nginx và mong muốn khi chúng share chung các file config, hay html tĩnh. May mắn docker cung cấp volume để thực hiện việc đó
Docker volume là một volume được tạo ra cho phép các container mount volume vào trong các container hay dễ hiểu hơn là docker sử dụng Volume đó thay thế cho 1 folder của container
Sử dụng volume có 3 tác dụng chính:
- Để giữ lại dữ liệu khi một container bị xóa.
- Để chia sẻ dữ liệu giữa các hệ thống tập tin máy chủ và container Docker.
- Để chia sẻ dữ liệu với các container Docker khác.
VOLUME trong Dockerfile
Trở lại ví dụ trong phần Docker instructions1
2
3
4FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
Kết quả như trang này có giải thích nó sẽ tạo ra một volume mới và copy file greeting vào volume được tạo. Nhưng khi tôi build và run docker này lại không có volume myvol nào được tạo ra?
Thực tế không phải volume myvol không được tạo ra mà nó đã được băm dưới dạng id1
2
3
4
5docker volume ls
DRIVER VOLUME NAME
local 09ac41f23520dfeaec2d2dcc571168a1a8ff185f633cbaa355915703b3fa6b4f
local 0a7f05233da3de18ae8d67f80b3d6bcda4f374bffd7c2d44b0b0914db976f835
local 16f5fec934cc322c7b065ea89b6bc122c3fabafcad76ff69bc53ab3849ababc5
Công việc của bạn là cần tìm VOLUME NAME đó là cái nào :v (sắp xếp theo ngày tạo ấy sẽ thấy nhé)
Sử dụng VOLUME trong Dockerfile như vậy, các volume sẽ được tạo trong thư mục: /var/lib/docker/volumes/
và được docker quản lý, bạn không thể ánh xạ nó sang thư mục khác của máy thật được.
Đặt tên VOLUME
Nếu cách để docker tự sinh volume name khiến bạn không khó tìm, bạn hoàn toàn có thể đặt tên VOLUME trong file docker-compose.yml
1
2
3
4
5
6
7
8
9
10version: '3'
services:
...
mysql:
volumes:
- db-data:/var/lib/mysql
...
volumes:
db-data:
Khi đó bạn sẽ dễ dàng thấy VOLUME khi dùng lệnh1
2
3
4
5
6docker volume ls
DRIVER VOLUME NAME
local 09ac41f23520dfeaec2d2dcc571168a1a8ff185f633cbaa355915703b3fa6b4f
local 0a7f05233da3de18ae8d67f80b3d6bcda4f374bffd7c2d44b0b0914db976f835
local 16f5fec934cc322c7b065ea89b6bc122c3fabafcad76ff69bc53ab3849ababc5
local laravel_db-data
Việc xoá volume đi cũng dễ dàng, đỡ nhầm lẫn :D1
docker volume rm laravel_db-data
Tùy chọn volume
khi run docker
Sử dụng lệnh thêm tham số volume khi chạy docker cho phép bạn ánh xạ được vùng mount bởi volume từ docker container ra host của chúng ta thông qua 2 tham số source và destination1
docker run -d --name nginx1 --mount source=nginx-static-html-share-volume,destination=/usr/share/nginx/html -p 2222:80 nginx
Tổng kết
- Sử dụng VOLUME trong Dockerfile, volume sẽ được Docker quản lý, không thể ánh xạ vị trí khác được
- Ngược lại sử dụng volume, mount trong khi chạy docker, hoặc trong docker-compose cho phép bạn ánh xạ các file, thư mục đến file, thư mục trên máy thật mà bạn muốn
Tài liệu đọc thêm:
[Docker] Docker volume