Chia sẻ dữ liệu giữa Docker Host và Container

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
Chia sẻ dữ liệu giữa Docker Host và Container

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

< Bài Trước. Bài Sau.>

Picture of Tobi

Tobi

Chào mọi người, mình là Quyền - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau, trau dồi thêm nhiều kiến thức bổ ích hơn nữa.