Quay lại

Bài 7: Chia sẻ và lưu trữ File cho Container Chuyên mục Docker    2023-12-10    33 Lượt xem    27 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Bài 7: Chia sẻ và lưu trữ File cho Container

Tại sao cần lưu trữ và chia sẻ File trong Container

Việc lưu trữ và chia sẻ file trong container Docker có một số lợi ích và ứng dụng cụ thể:

  1. Giữ cho Ứng Dụng Độc Lập:

    • Bằng cách lưu trữ dữ liệu trong container, ứng dụng trở nên độc lập và di động hơn. Container có thể được triển khai ở mọi nơi mà Docker được cài đặt mà không cần phải lo lắng về việc quản lý dữ liệu ở mức hệ thống.
  2. Đồng Bộ Hóa Phiên Bản:

    • Bạn có thể chia sẻ container cùng với dữ liệu của nó. Điều này làm cho việc triển khai và chia sẻ ứng dụng dễ dàng hơn, đồng thời đảm bảo rằng phiên bản của ứng dụng và dữ liệu đều được đồng bộ hóa.
  3. Dễ Dàng Sao Lưu và Phục Hồi:

    • Dữ liệu được lưu trữ trong container có thể được sao lưu một cách dễ dàng. Điều này làm cho quá trình sao lưu và phục hồi dễ dàng hơn, đặc biệt là khi bạn sử dụng các công cụ như Docker Compose để quản lý nhiều container cùng một lúc.
  4. Tích Hợp với Các Dịch Vụ Lưu Trữ Khác:

    • Container có thể kết hợp với các dịch vụ lưu trữ như Amazon S3, Google Cloud Storage, hoặc các dịch vụ lưu trữ dữ liệu dựa trên đám mây khác. Điều này giúp tối ưu hóa quản lý dữ liệu và giúp giảm thiểu tác động đến container khi chúng được triển khai ở các môi trường khác nhau.
  5. Phát Triển và Kiểm Thử Dễ Dàng:

    • Dữ liệu được lưu trữ trong container giúp đơn giản hóa quá trình phát triển và kiểm thử. Bạn có thể dễ dàng chia sẻ container chứa cả ứng dụng và dữ liệu với đồng đội mà không cần phải lo lắng về việc cấu hình môi trường hoặc lưu trữ dữ liệu.

Tuy nhiên, cũng cần lưu ý rằng việc lưu trữ dữ liệu trong container cũng có thể tạo ra những thách thức nhất định, đặc biệt là khi cần duy trì dữ liệu qua các phiên bản container khác nhau hoặc khi có yêu cầu về tính bảo mật và quản lý dữ liệu. Đối với các ứng dụng sản phẩm và môi trường production, việc sử dụng các giải pháp lưu trữ dữ liệu bên ngoài container thường được ưa chuộng hơn.

Container lifetime và persistent data trong container

Container lifetime và quản lý dữ liệu có tính bền vững (persistent data) là hai khía cạnh quan trọng khi làm việc với Docker containers. Dưới đây là mô tả về chúng:

Container Lifetime:

  1. Short-Lived Nature:

    • Containers thường có tính ngắn hạn và có thể được tạo, triển khai, và xóa đi nhanh chóng. Một container thường được tạo ra để thực hiện một công việc cụ thể và sau đó bị xóa.
  2. Immutable Infrastructure:

    • Thay vì sửa đổi một container đang chạy, thì thói quen thường là tạo một container mới với cấu hình hoặc phiên bản mới. Điều này giúp đảm bảo rằng môi trường làm việc luôn được xác định và có thể tái tạo.
  3. Thường Xuyên Tái Tạo (Frequent Recreation):

    • Containers thường được tạo và tái tạo thường xuyên, điều này thích hợp với mô hình microservices và ứng dụng phân tán.

Persistent Data trong Container:

  1. Khả Năng Mất Mát Dữ Liệu:

    • Dữ liệu bên trong một container thường có tính tạm thời và có thể bị mất khi container kết thúc hoặc bị xóa. Điều này đặt ra thách thức khi bạn cần lưu trữ dữ liệu giữa các chu kỳ container.
  2. Dùng Volumes hoặc Bind Mounts:

    • Để giữ cho dữ liệu tồn tại và bền vững, bạn có thể sử dụng volumes hoặc bind mounts trong Docker. Volumes là cách lưu trữ dữ liệu ở ngoài container và có thể được chia sẻ giữa các container khác nhau, trong khi bind mounts liên kết một thư mục từ host vào container.
  3. Docker Volumes:

    • Sử dụng Docker volumes cho phép bạn duy trì dữ liệu giữa các container và giữ cho dữ liệu này không bị mất khi container kết thúc. Volumes có thể được quản lý bằng các lệnh Docker như docker volume create và docker volume rm.
# Ví dụ sử dụng Docker volumes
docker run -d -v mydata:/app/data myapp​

     4.Bind Mounts:

    • Bind mounts liên kết một thư mục từ host vào container, giúp dữ liệu tồn tại ở ngoài container và thay đổi trong thư mục sẽ được đồng bộ giữa host và container.
# Ví dụ sử dụng bind mounts
docker run -d -v /host/path:/container/path myapp​

Tóm Tắt:

  • Container lifetime ngắn hạn và có thể tái tạo thường xuyên.
  • Persistent data được duy trì thông qua việc sử dụng Docker volumes hoặc bind mounts để lưu trữ dữ liệu ở ngoài container.
  • Sử dụng volumes giúp đảm bảo tính bền vững của dữ liệu giữa các chu kỳ container và giữ cho dữ liệu không bị mất khi container kết thúc.

Giới thiệu về Volume

Trong Docker, volumes là một cách để lưu trữ và quản lý dữ liệu ở ngoài các container. Volumes giúp giải quyết nhiều vấn đề liên quan đến lưu trữ dữ liệu trong môi trường containerized, bảo đảm tính nhất quán và bền vững của dữ liệu ngay cả khi container chứa nó bị xóa hay cập nhật.

Để các bạn hiểu hơn về volumn mình sẽ lấy image mysql làm ví dụ để xem cách nó tạo volumn như thế nào và cách hoạt động của nó. Khi các bạn vào xem cấu hình Dockerfile của Image mysql này ở dòng số 116 là cách mà nó tạo ra volumn. 

Bản chất cái thư mục VOLUME /var/lib/mysql mà Dockerfile tạo ra là để tạo ra một vùng nhớ lưu trữ các dữ liệu của mysql nằm trên container và đồng thời dữ liệu này cũng được mound trên 1 vùng nhớ trong 1 thư mục trên máy host, để xem và hiểu chi tiết các bạn có thể làm theo cách sau: 

Bước 1: Pull image mysql về local.

 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

Bước 2: Kiểm tra container.

docker container inspect mysql

Bước 3: Xem chi tiết về volumn trên container

Như các bạn thấy phần Mounts -> source chính là nơi mà dữ liệu được lưu trên máy chủ host và nó sẽ mound dữ liệu vào thư mục /var/lib/mysql trong container: 

/var/lib/docker/volumes/11c7b944b51a25717fb1844202889c5b04c674056b660dc6dfbe62237db6f75c/_data

Nếu các bạn muốn biết chính xác nó được lưu chỗ nào trên máy host thì các bạn có thể nhìn bức ảnh bên dưới, cái này là mình dùng Window 11 mà như các bạn biết thì khi dùng window hay mac Docker Desktop nó sẽ tạo ra một VM để chạy cho 2 OS này chính vì thế nó sẽ được lưu lên VM nha, trên linux thì dễ quan sát nó hơn vì nó được mound trực tiếp vào OS linux luôn có thể cd vào xem một cách dễ dàng.

Còn Mounts -> Destination chính là thư mục mà dữ liệu được lưu trên container.

Còn Mounts -> type chính là kiểu của volumn : có 2 loại đó là volumnbind

OK sau khi các bạn đã mound được data , bạn có thể thử xóa container bằng lệnh :

docker container rm -f mysql

Sau khi xóa thì container đã biến mất còn volumn thì vẫn sẽ còn đó trên máy host của chúng ta, khi bạn tạo 1 container mới chỉ cần mound lại đúng volumn thì dữ liệu sẽ hoạt động như bình thường.

Sử dụng Docker Volume thế nào?

Sử dụng Docker volumes giúp bạn quản lý và lưu trữ dữ liệu ở ngoài các container, làm cho quá trình triển khai và duy trì ứng dụng trở nên dễ dàng và bền vững. Dưới đây là một hướng dẫn cơ bản về cách sử dụng Docker volumes:

1. Tạo Docker Volume:

Trước tiên, bạn cần tạo một Docker volume. Bạn có thể sử dụng lệnh docker volume create:

docker volume create mydata​

2. Chạy Container với Volume:

Chạy một container và liên kết nó với volume bạn vừa tạo. Ví dụ:

docker run -d -v mydata:/app/data myapp​

Trong đó:

  • -d: Chạy container ở chế độ detached (nền).
  • -v mydata:/app/data: Liên kết volume mydata với đường dẫn /app/data trong container myapp.

3. Chia Sẻ Volume giữa Các Container:

Nếu bạn muốn chia sẻ volume giữa các container, chỉ cần liên kết nhiều container với cùng một volume:

docker run -d -v mydata:/app/data myapp-1
docker run -d -v mydata:/app/data myapp-2​

Cả myapp-1 và myapp-2 đều có thể truy cập và sử dụng dữ liệu trong volume mydata.

4. Xem Danh Sách Các Volumes:

Sử dụng lệnh docker volume ls để xem danh sách các volumes hiện có:

docker volume ls​

5. Xóa Volume:

Nếu bạn muốn xóa một volume, đảm bảo rằng không có container nào đang sử dụng nó. Sau đó, sử dụng lệnh docker volume rm:

docker volume rm mydata​

6. Sử Dụng Docker Compose với Volumes:

Nếu bạn đang sử dụng Docker Compose, bạn có thể định nghĩa volumes trong tệp docker-compose.yml. Ví dụ:

version: '3'
services:
  myservice:
    image: myapp
    volumes:
      - mydata:/app/data
volumes:
  mydata:​

Lưu Ý Quan Trọng:

  • Khi volume được tạo, nó sẽ tồn tại đến khi bạn xóa nó.
  • Volumes là một cách tốt để lưu trữ dữ liệu không gian thời gian, ví dụ, dữ liệu cơ sở dữ liệu, tệp tin log, vv.
  • Khi container kết thúc, dữ liệu vẫn được giữ lại trong volume, và container mới có thể sử dụng lại dữ liệu này khi liên kết với volume tương ứng.

Với các bước trên, bạn có thể sử dụng Docker volumes để quản lý dữ liệu của ứng dụng một cách hiệu quả và bền vững.

Docker Bind mount

Trong Docker, "bind mount" là một cách để liên kết một thư mục từ máy host vào một vị trí cụ thể trong container. Điều này cho phép dữ liệu nằm ngoài container và giữ cho container có thể truy cập, đọc, và ghi vào dữ liệu ở thư mục đó trên host. Sự liên kết này tạo ra một cơ chế linh hoạt và đơn giản để chia sẻ dữ liệu giữa container và host.

Dưới đây là một số điểm quan trọng khi sử dụng bind mount trong Docker:

1. Liên Kết Một Thư Mục:

Để liên kết một thư mục từ host vào container, bạn sử dụng cờ -v hoặc --mount khi chạy lệnh docker run. Ví dụ:

docker run -d -v /host/path:/container/path myapp​

Hoặc sử dụng cú pháp --mount:

docker run -d --mount type=bind,source=/host/path,target=/container/path myapp​

Hoặc

docker run -d -v $(pwd):/container/path myapp​

2. Chia Sẻ Dữ Liệu:

Các thay đổi vào dữ liệu từ container sẽ được ánh xạ ngay lập tức vào thư mục trên host và ngược lại. Điều này giúp dữ liệu giữa container và host được chia sẻ và duy trì tính nhất quán.

3. Chia Sẻ Giữa Các Container:

Cùng một thư mục có thể được bind mount vào nhiều container. Điều này giúp chia sẻ dữ liệu giữa các container một cách dễ dàng:

docker run -d -v /shared/data:/app/data myapp-1
docker run -d -v /shared/data:/app/data myapp-2​

4. Chế Độ Read-Only:

Bạn cũng có thể liên kết một thư mục theo chế độ chỉ đọc từ host vào container bằng cách sử dụng cờ :ro:

docker run -d -v /host/path:/container/path:ro myapp​

5. Sử Dụng Docker Compose:

Trong Docker Compose, bind mounts có thể được định nghĩa trong tệp docker-compose.yml. Ví dụ:

version: '3'
services:
  myservice:
    image: myapp
    volumes:
      - /host/path:/container/path

Lưu Ý Quan Trọng:

  • Dữ liệu trong thư mục bind mount không được quản lý bởi Docker, do đó, cần phải đảm bảo rằng quyền truy cập và quyền sở hữu của dữ liệu là đúng trên host.
  • Bind mounts giúp dễ dàng thực hiện debugging và phát triển, nhưng cũng có thể tạo ra các vấn đề về tính bảo mật và di động khi chuyển đưa giữa các môi trường khác nhau.

Sử dụng bind mounts giúp bạn kiểm soát một cách linh hoạt việc lưu trữ và chia sẻ dữ liệu giữa host và container trong Docker.

So sánh Docker Volume và Bind mount

Docker Volume và Bind Mount là hai cách để quản lý và chia sẻ dữ liệu giữa host và container trong Docker, nhưng chúng có những điểm khác nhau quan trọng. Dưới đây là một so sánh giữa Docker Volume và Bind Mount:

Docker Volume:

  1. Quản Lý bởi Docker:

    • Docker volumes được quản lý bởi Docker daemon. Bạn có thể tạo, xóa, và quản lý chúng bằng các lệnh Docker.
  2. Dễ Quản Lý và Duỵêt Chuyển:

    • Dữ liệu trong Docker volumes có thể dễ dàng chuyển giữa các container và giữa các host.
  3. Tính Nhất Quán và An Toàn:

    • Docker volumes đảm bảo tính nhất quán và an toàn cho dữ liệu. Chúng có thể được chia sẻ giữa các container mà không làm ảnh hưởng đến tính toàn vẹn của dữ liệu.
  4. Lưu Trữ Trong Docker Daemon:

    • Dữ liệu của volumes được lưu trữ trong Docker daemon, không phải trực tiếp trên host.
  5. Tính Bền Vững và Dễ Dàng Sao Lưu:

    • Dữ liệu trong volumes thường có tính bền vững và có thể dễ dàng sao lưu và khôi phục.

Bind Mount:

  1. Liên Kết Trực Tiếp Từ Host:

    • Bind mount liên kết trực tiếp thư mục hoặc tập tin từ host vào container. Không cần quản lý bởi Docker daemon.
  2. Dữ Liệu Ngay Lập Tức:

    • Bất kỳ thay đổi trong bind mount sẽ ngay lập tức phản ánh trên host và ngược lại. Điều này làm cho bind mount trở nên linh hoạt, nhưng cũng có thể tạo ra rủi ro nếu không sử dụng cẩn thận.
  3. Tùy Chọn Đọc Chỉ (Read-Only):

    • Bạn có thể đặt bind mount chỉ đọc bằng cách thêm tùy chọn :ro vào cuối cùng.
  4. Dữ Liệu Lưu Trữ Ngay Tại Host:

    • Dữ liệu của bind mount nằm trực tiếp trên host. Container có thể ảnh hưởng đến dữ liệu này một cách trực tiếp.

Lựa Chọn Sử Dụng:

  • Docker Volume khi:

    • Bạn muốn tính nhất quán và an toàn cho dữ liệu giữa các container.
    • Bạn muốn quản lý dễ dàng qua các lệnh Docker và Docker Compose.
    • Bạn muốn tích hợp dữ liệu với các dịch vụ lưu trữ đám mây.
  • Bind Mount khi:

    • Bạn muốn sự linh hoạt và tiện lợi trong việc chia sẻ dữ liệu giữa host và container.
    • Bạn muốn thay đổi trong dữ liệu ngay lập tức phản ánh giữa host và container.
    • Bạn muốn giữ dữ liệu nằm trực tiếp trên host.

Tùy thuộc vào yêu cầu cụ thể của ứng dụng và môi trường triển khai, bạn có thể lựa chọn sử dụng Docker Volume hoặc Bind Mount để quản lý dữ liệu một cách hiệu quả.

Bài tập về volumn

Bài tập về bind mount

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday