Mục đích của VOLUME trong Dockerfile là gì


106

Tôi đang cố gắng tìm hiểu sâu hơn về khối lượng của Docker và tôi đang gặp khó khăn để tìm ra sự khác biệt / trường hợp sử dụng của:

  • các docker volume createlệnh
  • Các docker run -v /path:/host_path
  • Các VOLUMEmục trong Dockerfiletập tin

Tôi đặc biệt không hiểu điều gì sẽ xảy ra nếu bạn kết hợp VOLUMEmục nhập với -vcờ.


Câu trả lời:


70

Tập là một dữ liệu liên tục được lưu trữ trong /var/lib/docker/volumes/...

  • Bạn có thể khai báo nó trong Dockerfile, có nghĩa là mỗi khi vùng chứa được khởi động từ hình ảnh, ổ đĩa sẽ được tạo ( trống ), ngay cả khi bạn không có bất kỳ -vtùy chọn nào .

  • Bạn có thể khai báo nó trong thời gian chạy docker run -v [host-dir:]container-dir.
    kết hợp cả hai ( VOLUME+ docker run -v) có nghĩa là bạn có thể gắn kết nội dung của thư mục lưu trữ vào ổ đĩa của bạn được vùng chứa trong/var/lib/docker/volumes/...

  • docker volume create tạo ra một volume mà không cần phải xác định Dockerfile và xây dựng một hình ảnh và chạy một container. Nó được sử dụng để nhanh chóng cho phép các thùng chứa khác gắn khối lượng đã nói.

Nếu bạn đã lưu giữ một số nội dung trong một tập, nhưng sau đó đã xóa vùng chứa (theo mặc định không xóa tập liên kết của nó, trừ khi bạn đang sử dụng docker rm -v), bạn có thể đính kèm lại tập đã nói vào một vùng chứa mới (khai báo cùng một khối lượng).

Xem " Docker - Cách truy cập vào một ổ đĩa không được gắn vào một vùng chứa? ".
Với tính năng tạo ổ đĩa của docker, điều này rất dễ dàng để gắn lại ổ đĩa đã đặt tên vào một vùng chứa.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
Giả sử bạn sử dụng Dockerfilevới VOLUME-v /path:/host_path/cờ. Nội dung của di VOLUMEchúc được ghi đè bởi nội dung của /host_path/?
radium226

Cảm ơn bạn @VonC, tôi nghĩ tôi hiểu được nó :) Và nếu bạn thực hiện docker volume create --name my_volumetheo sau là a docker run --volume-from my_volume, làm thế nào để bạn biết điểm gắn kết sẽ ở đâu?
radium226

@ radium226 không có điểm gắn kết (có nghĩa là không có điểm gắn kết nào từ máy chủ, bên cạnh trống / var / lib / docker / volume gốc). Đường dẫn của tập nằm trong siêu dữ liệu my_volume: stackoverflow.com/a/31997267/6309
VonC

Tôi hiểu rằng không có điểm gắn kết nào ở phía máy chủ. Nhưng bên trong vùng chứa đang chạy docker run ..., làm cách nào tôi có thể ghi vào tệp được lưu trữ trên my_volumeổ đĩa? Tôi không biết ... con đường? của khối lượng bên trong vùng chứa đang chạy của tôi bởi vì tôi không xác định gì? Tôi hy vọng tôi đủ rõ ràng, bởi vì tôi là dứt khoát không chắc chắn về danh từ của tôi: - /
radium226

1
@ radium226 docker volume create --name anametạo một ổ đĩa được đặt tên : Bạn chỉ định một đường dẫn vùng chứa trong thời gian chạy:: vùng docker run -v aname:/apathchứa đó hiện có một ổ đĩa được đính kèm với nó, được gắn vào thư mục / apath của nó. Tôi đã viết lại câu trả lời để làm rõ điều đó.
VonC

11

VOLUMEhướng dẫn trở nên thú vị khi bạn kết hợp nó với volumes-fromtham số thời gian chạy.

Cho Dockerfile sau:

FROM busybox
VOLUME /myvolume

Xây dựng hình ảnh với:

docker build -t my-bb .

Và quay một thùng chứa với:

docker run --rm -it --name my-first-bb my-bb

Điều đầu tiên cần chú ý là bạn sẽ có một thư mục có tên trong hình ảnh này myvolume. Nhưng nó không đặc biệt thú vị vì khi chúng ta thoát ra khỏi vùng chứa, khối lượng cũng sẽ bị xóa.

Tạo một tệp trống trong thư mục này, vì vậy hãy chạy như sau trong vùng chứa:

cd myvolume
touch hello.txt

Bây giờ quay một vùng chứa mới, nhưng chia sẻ cùng một khối lượng với my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Bạn sẽ thấy my-second-bbcó chứa tệp hello.txttrong myvolumethư mục.

Khi bạn thoát cả hai vùng chứa, tập của bạn cũng sẽ bị xóa.


Các tập sẽ bị xóa vì chúng là các tập ẩn danh VÀ bạn đã bắt đầu các vùng chứa bằng --rmtùy chọn. Tôi nghĩ nó có thể hiệu quả khi đề cập đến nó. Nếu bạn không bắt đầu vùng chứa bằng --rm, bạn vẫn có thể xóa vùng chứa và các ổ ẩn danh của nó bằng docker rm -v my-container.
AymDev
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.