Cách mount thư mục máy Host hoặc tạo ổ đĩa để chia sẻ dữ liệu vào Container cũng như chia sẻ dữ liệu các container với nhau.
Trong phần này tìm hiểu cách chia sẻ dữ liệu giữa máy Host và Container, giữa các Container với nhau bằng cách sử dụng một thư mục trên máy Host làm nơi lưu trữ tập trung. (Tạo ổ đĩa rồi mount nó vào các container sẽ tìm hiểu sau, phần này sử dụng trực tiếp các thư mục).
Máy Host là hệ thống bạn đang chạy Docker Engine. Một thư mục của máy Host có thể chia sẻ để các Container đọc, lưu dữ liệu.
Container – ánh xạ thư mục máy Host
Thông tin:
- Thư mục cần chia sẻ dữ liệu trên máy host là:
path_in_host
- Khi chạy container thư mục đó được mount – ánh xạ tới
path_in_container
của container
Để có kết quả đó, tạo – chạy container với tham số thêm vào -v path_to_data:path_in_container
Ví dụ:
Giả sử ở máy host chúng ta có thư mục sitedata
ở đường dẫn /home/tobi/sitedata
. Trong thư mục này sẽ có 2 file .txt
như sau :
Bây giờ chúng ta tạo 1 container , ở container này sẽ có thư mục được ánh xạ dữ liệu với /home/tobi/sitedata
ở máy host với lệnh sau :
docker run -it -v /home/tobi/sitedata:/home/data ubuntu
Lúc này thì trong container mới tạo thư mục /home/data
sẽ được ánh xạ với /home/tobi/sitedata
ở máy host, việc bạn tạo thêm file hay xoá đi từ trong container thì thư mục bên ngoài host cũng sẽ giống vậy.
Lưu ý : Khi xoá container thì thư mục bên ngoài sẽ không mất dữ liệu.
Chia sẻ dữ liệu giữa các Container
Đầu tiên mình sẽ tạo 1 container có ánh xạ thư mục với /home/tobi/sitedata
có tên là C1
docker run -it -v /home/tobi/sitedata:/home/data --name C1 ubuntu
Lúc này thì như ở phần đầu thì thư mục data
sẽ đồng bộ với thư mục sitedata
ở máy host.
Tiếp theo để tạo 1 container C2
khác chia sẻ cùng dữ liệu thư mục data
với container C1
, chúng ta chỉ cần tạo với lệnh sau :
docker run -it --name C2 --volumes-from C1 almalinux
Thì lúc này Container C1 và C2 đã có thể chia sẽ chung dữ liệu thông qua thư mục /home/data
Quản lý các ổ đĩa với docker volume
Có thể tạo và quản lý các ổ đĩa bên ngoài container, lệnh làm việc với ổ đĩa là docker volume
với các trường hợp cụ thể:
Liệt kê danh sách các ổ đĩa:
docker volume ls
Tạo một ổ đĩa:
docker volume create name_volume
Xóa một ổ đĩa:
docker volume rm name_volume
Mount một ổ đĩa vào container (–mount)
Tạo ổ đĩa có tên là D1
docker volume create D1
Mount ổ đĩa vào container ( Ở đây mình tạo 1 container có tên là E1, và mount ổ đĩa có tên là D1 và thư mục disk1
, và container này được tạo từ images ubuntu
).
docker run -it --name E1 --mount source=D1,target=/home/disk1 ubuntu
Mình sẽ thử tạo 2 file text vào trong thư mục này ở container :
Bây giờ chúng ta xoá container tên E1
này đi thử nhé .
Tương tự tạo container tên E2
cũng dùng đĩa D1
để kiểm chứng việc xoá container E1
thì dữ liệu còn được ghi lại trên đĩa D1
không nhé.
docker run -it --name E2 --mount source=D1,target=/home/disk2 almalinux
Như bạn thấy thì dữ liệu của đĩa D1
vẫn còn cho dù bạn có xoá container E1
đi .
Tạo ổ đĩa ánh xạ tới thư mục máy host, và mount ổ đĩa vào container -v
(không dùng --mount
)
Nếu muốn ổ đĩa bind dữ liệu đến một thư mục cụ thể của máy HOST thì tạo ổ đĩa với tham số như sau:
docker volume create --opt device=path_in_host --opt type=none --opt o=bind volumename
Ví dụ : Mình tạo ổ đĩa tên D2
ánh xạ tới thư mục sitedata
ở máy host
docker volume create --opt device=/home/tobi/sitedata --opt type=none --opt o=bind D2
Kiểm tra lại
Tiếp theo mount ổ đĩa vào container -v
(không dùng --mount
)
docker run -it --name C3 -v D2:/home/data ubuntu
Như vậy là container có tên là C3
được tạo có thư mục data
ánh xạ với ổ D2
và ánh xạ với thư mục sitedata
ở máy host.
Xóa tất cả các ổ đĩa không được sử dụng bởi container nào:
docker volume prune