Làm thế nào để quyết định giữa một container khối lượng docker và một khối lượng docker?


24

Sau khi đọc các tài liệu tôi thấy mình hơi bối rối về cách tốt nhất để quản lý dữ liệu ứng dụng / dịch vụ hiệu quả.

Dường như có 3 lựa chọn:

  1. Đơn giản chỉ cần ánh xạ âm lượng đến thư mục máy chủ (tức là -vđối số cho docker run)
  2. Tạo một hình ảnh container docker cho dữ liệu (nghĩa là container riêng biệt và --volumes-from)
  3. Tạo một khối lượng docker (tức là docker volume create)

Bây giờ, có vẻ như thực tiễn được chấp nhận là tùy chọn # 2, nhưng sau đó tôi tự hỏi mục đích của # 3 là gì.

Đặc biệt là làm thế nào để bạn xử lý chính xác các kịch bản này docker volumevà tốt hơn là sử dụng bộ chứa khối lượng dữ liệu hoặc điều này cho từng tình huống?

  • Bạn cần dữ liệu ứng dụng trong một khối lượng riêng và / hoặc tầng lưu trữ trong máy chủ của bạn
  • Sao lưu
  • Khôi phục dữ liệu


@MichaelHampton Tôi nhận ra rằng tôi nên viết lại câu hỏi của mình
dukeofgaming

# 1 không phải là một lựa chọn nghiêm túc cho sản xuất; về cơ bản nó không bao giờ nên được thực hiện nếu một sự thay thế tồn tại.
Michael Hampton

2
@MichaelHampton Tại sao?, Dữ liệu có thể không được cập nhật nhưng HĐH máy chủ vẫn được quản lý bởi một nhóm cơ sở hạ tầng giám sát và sao lưu
dukeofgaming

@dukeofgaming Không đề cập đến việc bạn có thể chạy btrfs scrubtrên đó để tìm và sửa các tệp bị hỏng. Tôi không chắc chắn cách thức hoạt động của công cụ dockerized, nhưng tôi đoán nó không bảo vệ chống thối dữ liệu, vì vậy tôi luôn cần khôi phục hoàn toàn nếu có điều gì đó xấu xảy ra thay vì chỉ khôi phục các tệp riêng lẻ. Một ý kiến ​​khác cho rằng nó thêm một lớp trừu tượng khác, vì vậy nó làm chậm việc đọc và viết tệp hơn nữa. Tôi bằng cách nào đó không thấy được lợi thế của # 2 và # 3, nhưng tôi không có kinh nghiệm với docker, vì vậy điều này có thể thay đổi.
inf3rno

Câu trả lời:


18

Tôi nghĩ # 2 và # 3 khá giống nhau, sự khác biệt chính là không có container dừng với # 3 (theo nghĩa đen, chỉ là một tập có tên). Ví dụ: bạn có thể tạo một tập có tên và thực hiện tương tự những gì bạn sẽ làm với # 2 -vthay thế.

Tạo một khối lượng được đặt tên:

$ docker volume create --name test

Gắn và ghi một số dữ liệu vào ổ đĩa đó từ một thùng chứa:

$ docker run -v test:/opt/test alpine touch /opt/test/hello

Sau đó, bạn có thể gắn cùng một testâm lượng trong một thùng chứa khác và đọc dữ liệu:

$ docker run -v test:/opt/test alpine ls -al /opt/test     
total 8
drwxr-xr-x    2 root     root          4096 Jan 23 22:28 .
drwxr-xr-x    3 root     root          4096 Jan 23 22:29 ..
-rw-r--r--    1 root     root             0 Jan 23 22:28 hello

Ưu điểm ở đây là âm lượng sẽ không vô tình biến mất nếu bạn loại bỏ bộ chứa chỉ có dữ liệu. Bây giờ bạn quản lý nó với lệnh docker volumephụ.

$ d volume ls
DRIVER              VOLUME NAME
local               test

Nó cũng mở ra các khả năng cho các trình điều khiển âm lượng trên đường để bạn có thể thực hiện các âm lượng được chia sẻ giữa các máy chủ (nghĩa là các ổ được đặt tên qua NFS). Ví dụ về điều này có thể là FlockerConvoy . Theo quan điểm của bạn cụ thể về việc di chuyển hoặc sao lưu dữ liệu, Convoy có các lệnh phụ cụ thể để sao lưu dữ liệu và cho phép lưu trữ trên NFS hoặc EBS bên ngoài máy chủ của bạn.

Vì lý do này, tôi nghĩ rằng cách học mới hơn (Docker 1.9+) là sử dụng một ổ đĩa được đặt tên thay vì một thùng chứa chỉ có dữ liệu.


Cảm ơn, bạn đã trả lời hầu hết các câu hỏi của tôi, nhưng quan điểm về việc quản lý dữ liệu container trong một tầng âm lượng vật lý khác vẫn chưa được trả lời và đó là vấn đề quan trọng ... giả sử đây là giải pháp quản lý repo git và tôi cần một phần của container dữ liệu (là một ổ đĩa được xác định trong một dockerfile) trong bộ lưu trữ Cấp 0 nằm trong một ổ đĩa vật lý khác (ví dụ: một phân vùng khác, đĩa vật lý hoặc bất cứ thứ gì)
dukeofgaming

Tôi loại đã làm với các đề cập đến trình điều khiển âm lượng. Ngay bây giờ, để lưu trữ dữ liệu bên ngoài trình điều khiển lưu trữ cục bộ vật lý, bạn sẽ cần sử dụng dữ liệu đã thực hiện cụ thể những gì bạn đang muốn làm. Ngoài đỉnh đầu của tôi, có github.com/rancher/convoygithub.com/ClusterHQ/flocker . Convoy có hỗ trợ cho NFS và GlusterFS tại thời điểm này nghe gần hơn với những gì bạn đang theo đuổi. Tôi sẽ sửa đổi câu trả lời để làm rõ điều này.
Andy Shinn

Sử dụng trình điều khiển devicemapper dường như để trả lời câu hỏi của tôi, cảm ơn! docs.docker.com/engine/userguide/storagedriver/ từ
dukeofgaming

the volume won't accidentally disappear if you remove the data-only container. Bạn có thể giải thích? Cảm ơn.
Stephane

22

Kể từ Docker 1.9, việc tạo các Tập tin được đặt tên bằng API khối ( docker volume create --name mydata) được ưu tiên hơn Bộ chứa khối lượng dữ liệu. Kể từ tháng 2 năm 2016, tài liệu về khối lượng Docker đã hết hạn. Bản thân mọi người tại Docker đề xuất rằng Bộ chứa dữ liệu khối lượng dữ liệu không còn được coi là một mẫu được đề xuất , các khối lượng có tên nên có thể thay thế các khối lượng chỉ có dữ liệu trong hầu hết các trường hợp (nếu không phải tất cả) , và không có lý do nào tôi có thể sử dụng container chỉ dữ liệu .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.