Sunday, September 29, 2024

[Docker] Phần 3 – Chia sẻ dữ liệu giữa Docker Host và Container

-

1. Mở Đầu

Trong phần 1, chúng ta đã làm quen với Docker, tìm hiểu cách cài đặt và sử dụng Docker trên các hệ điều hành khác nhau. Phần 2 đã hướng dẫn cách cập nhật image, lưu image ra file và nạp image từ file trong Docker. Bây giờ, trong phần 3, chúng ta sẽ khám phá cách chia sẻ dữ liệu giữa Docker Host và Container. Điều này sẽ giúp bạn quản lý dữ liệu và tương tác dễ dàng hơn giữa môi trường máy chủ và container Docker.

Trong phần này, chúng ta sẽ tìm hiểu cách chia sẻ dữ liệu giữa máy chủ và container Docker. Điều này bao gồm việc ánh xạ thư mục từ máy chủ vào container, chia sẻ dữ liệu qua biến môi trường và sử dụng các tùy chọn khác để quản lý dữ liệu trong Docker.

Lưu ý:
Để thực hiện các thao tác liên quan đến Docker, hãy đảm bảo bạn đã cài đặt Docker trên hệ thống của mình.

2. Container – ánh xạ thư mục máy Host

Máy Host chính 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.

Để mount thư mục máy host vào container, hãy run docker với tham -v <thư mục máy host>:<thư mục container>

Tạo thư mục share

mkdir /home/share

Run container

docker run -it --name=ubuntu1 -v /home/share:/home/data ubuntu

List container

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
a1e21a4caf48   ubuntu    "bash"    1 minutes ago   Up 1 minutes             ubuntu1

Hãy vào container

docker exec -it ubuntu1 bash

Tạo 1 file test

echo 'test mount' > /home/data/hoanghd.txt

Thoát khỏi container và kiểm tra thư mục /home/share ở máy host

$ ll /home/share/
total 12
drwxr-xr-x 2 root root 4096 Nov  2 13:05 ./
drwxr-xr-x 3 root root 4096 Nov  2 13:04 ../
-rw-r--r-- 1 root root   11 Nov  2 13:07 hoanghd.txt

Lúc này, dữ liệu trên thư mục /home/sitesdata/ của máy Host thì trong container có thể truy cập, cập nhật sửa đổi … thông qua đường dẫn /home/data

3. Chia sẻ dữ liệu giữa các Container.

Lúc nãy mình đã tạo 1 container là ubuntu1, bây giờ mình sẽ run thêm 1 container nữa có tên là ubuntu2 và sẽ sử dụng chung 1 thư mục /home/share trên máy host để chia sẻ dữ liệu. Để làm điều đó thêm vào tham số –volumes-from container_first

Ví dụ:

docker run -it --name=ubuntu2 --volumes-from ubuntu1 ubuntu

Kết quả

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
d1d5cb865746   ubuntu    "bash"    2 minutes ago    Up 22 seconds             ubuntu2
a1e21a4caf48   ubuntu    "bash"    11 minutes ago   Up 9 minutes              ubuntu1

Hãy vào container ubuntu2

docker exec -it ubuntu2 bash

Kiểm tra thư mục mount là /home/data, ta có kết quả

ls /home/data/
hoanghd.txt

4. 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ể:

Bây giờ mình sẽ tạo 1 container ubuntu3 sử dụng docker volume, trước tiên hãy tạo 1 ổ đĩa

docker volume create test_volume

List các ổ đĩa đã tồn tại

$ docker volume ls
DRIVER    VOLUME NAME
local     test_volume

Xem thông tin chi tiết 1 ổ đĩa

$ docker inspect test_volume
[
    {
        "CreatedAt": "2022-11-02T13:20:47Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test_volume/_data",
        "Name": "test_volume",
        "Options": {},
        "Scope": "local"
    }
]

Nếu muốn xoá ổ đĩa sử dụng lệnh

docker volume rm name_volume

Mount một ổ đĩa vào container (–mount)

Hãy run 1 container ubuntu3 và mount ổ đĩa

docker run -it --name=ubuntu3 --mount source=test_volume,target=/home/disk1 ubuntu

Container ubuntu3 đã được tạo

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS          PORTS     NAMES
b9f857b69204   ubuntu    "bash"    About a minute ago   Up 2 seconds              ubuntu3
d1d5cb865746   ubuntu    "bash"    12 minutes ago       Up 10 minutes             ubuntu2
a1e21a4caf48   ubuntu    "bash"    21 minutes ago       Up 19 minutes             ubuntu1

Hãy vào container ubuntu3

docker exec -it ubuntu3 bash

List thư mục home trong container ubuntu3 ta thấy thư mục disk1

$ ll /home/
drwxr-xr-x 2 root root 4096 Nov  2 13:20 disk1/

Kết quả cho thấy thư mục /home/disk1 đã được mount bởi ổ đĩa sda1

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         194G  2.1G  192G   2% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1       194G  2.1G  192G   2% /home/disk1
tmpfs           3.9G     0  3.9G   0% /proc/acpi
tmpfs           3.9G     0  3.9G   0% /proc/scsi
tmpfs           3.9G     0  3.9G   0% /sys/firmware

Gán ổ đĩa vào container khi tạo container (-v)

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=/home/share --opt type=none --opt o=bind volumename

Xem chi tiết volumename ta thấy device của ổ đĩa được gán với thư mục /home/share trên máy host

 docker volume inspect volumename
[
    {
        "CreatedAt": "2022-11-02T13:28:29Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/volumename/_data",
        "Name": "volumename",
        "Options": {
            "device": "/home/share",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local"
    }
]

Sau đó ổ đĩa này gán vào container với tham số -v (không dùng –mount)

docker run -it --name=ubuntu4 -v volumename:/home/sites ubuntu

Hãy vào container ubuntu4

docker exec -it ubuntu4 bash

Kết quả khi sử dụng df -h /home/sites đã được mount vào sda1

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         194G  2.1G  192G   2% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1       194G  2.1G  192G   2% /home/sites
tmpfs           3.9G     0  3.9G   0% /proc/acpi
tmpfs           3.9G     0  3.9G   0% /proc/scsi
tmpfs           3.9G     0  3.9G   0% /sys/firmware

Khi list /home/sites/ ta thấy tập tin hoanghd.txt mà trước đó mình đã tạo

$ ll /home/sites/
total 12
drwxr-xr-x 2 root root 4096 Nov  2 13:05 ./
drwxr-xr-x 1 root root 4096 Nov  2 13:30 ../
-rw-r--r-- 1 root root   11 Nov  2 13:07 hoanghd.txt

Để xoá tất cả các ổ đĩa không được sử dụng bởi container nào

docker volume prune

5. Tổng kết.

Chia sẻ dữ liệu giữa Docker Host và Container là một phần quan trọng của việc quản lý ứng dụng và dữ liệu trong môi trường Docker. Trong phần này, chúng ta đã tìm hiểu cách thực hiện điều này một cách hiệu quả và linh hoạt. Hi vọng rằng kiến thức này sẽ giúp bạn tận dụng toàn bộ tiềm năng của Docker trong việc phát triển và quản lý ứng dụng của mình.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories