Làm cách nào để chuyển các ổ đĩa chỉ chứa dữ liệu từ máy chủ này sang máy chủ khác?


121

Như được mô tả trong tài liệu Docker về Làm việc với khối lượng, có khái niệm về cái gọi là vùng chứa chỉ dữ liệu , cung cấp một ổ đĩa có thể được gắn vào nhiều vùng chứa khác, bất kể vùng chứa chỉ dữ liệu có thực sự đang chạy hay không.

Về cơ bản, điều này nghe có vẻ tuyệt vời. Nhưng có một điều tôi không hiểu.

Các ổ này ( không ánh xạ rõ ràng đến một thư mục trên máy chủ lưu trữ vì lý do di động, như tài liệu nêu rõ) được tạo và quản lý bởi Docker trong một số thư mục nội bộ trên máy chủ lưu trữ ( /var/docker/volumes/…).

Giả sử tôi sử dụng một ổ đĩa như vậy và sau đó tôi cần di chuyển nó từ máy chủ này sang máy chủ khác - làm cách nào để chuyển ổ đĩa? AFAICS nó có một ID duy nhất - tôi có thể đi và sao chép ổ đĩa và vùng chứa chỉ dữ liệu của nó sang một máy chủ mới không? Làm cách nào để tìm ra tệp nào cần sao chép? Hoặc có một số hỗ trợ được tích hợp sẵn cho Docker mà tôi chưa phát hiện ra?


12
Bạn có thể xuất thư mục vùng chứa dữ liệu: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzĐiều này không phụ thuộc vào chi tiết triển khai của các ổ. Và nhập dữ liệu bằng tar trên máy thứ hai.
Jiri

1
Wow, thật tuyệt, cảm ơn :-)))! Nếu bạn viết bình luận này như một câu trả lời, tôi sẽ vui vẻ chấp nhận nó!
Golo Roden

Câu trả lời:


136

Câu trả lời chính thức có sẵn trong phần "Sao lưu, khôi phục hoặc di chuyển khối lượng dữ liệu" :

SAO LƯU:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: loại bỏ vùng chứa khi nó thoát ra
  • --volumes-from DATA: đính kèm vào các ổ được chia sẻ bởi vùng chứa DATA
  • -v $(pwd):/backup: bind gắn kết thư mục hiện tại vào vùng chứa; để ghi tệp tar vào
  • busybox: một hình ảnh nhỏ đơn giản hơn - tốt để bảo trì nhanh chóng
  • tar cvf /backup/backup.tar /data: tạo một tệp tar không nén của tất cả các tệp trong thư mục / data

KHÔI PHỤC:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

3
Hiện tại, tốt hơn là sử dụng docker createcho các vùng chứa chỉ dữ liệu để chúng không được khởi động. Xem ví dụ ở phần tắt. tài liệu: docs.docker.com/userguide/dockervolumes/…
FelikZ

1
Vì vậy ... Nếu tôi đang cố gắng sao lưu cơ sở dữ liệu Postgres, tôi sẽ thay thế /databằng gì /var/lib/postgresql/data, đúng không?
425nesp

6
Phần "Sao lưu, khôi phục hoặc di chuyển khối lượng dữ liệu" dường như đã bị xóa khỏi tài liệu Docker :-(
SteveC

2
@Datz nó chỉ là một lệnh được gọi để tạo vùng chứa dữ liệu, nó có thể là bất kỳ lệnh nào thực sự không làm gì cả. Vùng chứa bắt đầu và thoát ngay lập tức nhưng nó được sử dụng để lưu giữ dữ liệu.
tommasop

1
@rszalski Nếu vì lý do nào đó, bạn cần vùng chứa tiếp tục chạy (giả sử bạn muốn docker execvào nó), thì một lệnh đơn giản tail -f /dev/nullsẽ không bao giờ thoát, nhưng sử dụng tài nguyên tối thiểu. Khi bạn không cần nó chạy nữa, docker stop data-containernó sẽ làm điều đó cho bạn. Khối lượng vẫn còn cho các thùng chứa khác.
Jesse Chisholm

16

Bạn có thể xuất âm lượng sang tar và chuyển sang máy khác. Và nhập dữ liệu bằng tar trên máy thứ hai. Điều này không phụ thuộc vào chi tiết triển khai của các tập.

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp

cảm ơn câu trả lời của bạn. Làm cách nào để di chuyển vùng chứa dữ liệu từ máy chủ này sang máy chủ khác?
Dzung Nguyen

1
@nXqd Vùng chứa dữ liệu được tạo bởi docker run -v /data-volume -name datacointainer busybox true- bạn có thể chạy vùng này ở bất cứ đâu. Sau khi tạo vùng chứa dữ liệu, bạn có thể nhập kho lưu trữ tar như được giải thích trong câu trả lời.
Jiri

Cảm ơn câu trả lời của bạn. Nhưng tôi đã gặp một vấn đề khác đó là chúng tôi cần xóa vùng chứa zombie được sử dụng để sao lưu sau đó. Vì điều này không trả về id. Bạn có cách nào hay không: D
Dzung Nguyen.

@nXqd Chắc chắn - bạn phải sử dụng --cidfile=id.txtlàm tham số chạy. ID vùng chứa sẽ được lưu trữ trong tệp id.txt. Tôi đã cập nhật câu trả lời.
Jiri

9
Bạn chỉ có thể sử dụng docker run --rmthay vì docker run --cidfile ... ; docker rm.
Felix Rabe,

16

Mở rộng câu trả lời chính thức từ tài liệu Dockercâu trả lời hàng đầu ở đây , bạn có thể có các bí danh sau trong .bashrc hoặc .zshrc của mình

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

Lưu ý rằng bản sao lưu được lưu vào /tmp, vì vậy bạn có thể di chuyển tệp sao lưu được lưu ở đó giữa các máy chủ docker.

Ngoài ra còn có hai cặp bí danh sao lưu / khôi phục. Một sử dụng nén và debian: jessie và một khác không nén nhưng với hộp bận rộn. Ưu tiên sử dụng tính năng nén nếu tệp cần sao lưu lớn.


3

Tôi sẽ thêm một công cụ gần đây khác của IBM ở đây, công cụ này thực sự được tạo ra để di chuyển khối lượng từ máy chủ chứa này sang máy chủ lưu trữ khác. Đây là một dự án hiện đang được thực hiện. Vì vậy, bạn có thể tìm thấy một phiên bản khác với các tính năng bổ sung trong tương lai.

Cargo được phát triển để di chuyển các container từ máy chủ này sang máy chủ khác cùng với dữ liệu của chúng với thời gian chết tối thiểu. Cargo sử dụng khả năng liên kết dữ liệu của hệ thống tệp liên hợp để tạo ra một chế độ xem dữ liệu thống nhất (chủ yếu là hệ thống tệp gốc) trên máy chủ nguồn và máy chủ đích. Điều này cho phép Cargo khởi động vùng chứa gần như ngay lập tức (trong vòng mili giây) trên máy chủ đích khi dữ liệu từ hệ thống tệp gốc nguồn được sao chép sang máy chủ mục tiêu theo yêu cầu (sử dụng phân vùng copy-on-write (COW) ) hoặc lười biếng trong nền (sử dụng rsync) .

Các điểm quan trọng là: - một centralizedmáy chủ xử lý quá trình di chuyển

Liên kết đến dự án được đưa ra ở đây:

https://github.com/nadgowdas/cargo

3

Trong trường hợp máy của bạn ở các VPC khác nhau hoặc bạn muốn sao chép từ / sang máy cục bộ (như trong trường hợp của tôi), bạn có thể sử dụng dvsync mà tôi đã tạo. Về cơ bản, nó được kết hợp với rsynchơn SSH được đóng gói thành hai hình ảnh nhỏ (cả hai ~ 25MB). Trước tiên, bạn khởi động dvsync-servertrên máy mà bạn muốn sao chép dữ liệu (Bạn sẽ cần cái NGROK_AUTHTOKENmà có thể lấy từ bảng điều khiển ngrok ):

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

Sau đó, bạn có thể khởi động dvsync-clienttrên máy mà bạn muốn sao chép các tệp vào, chuyển các tệp DVSYNC_TOKENđược hiển thị bởi máy chủ:

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client 

Sau khi sao chép xong, ứng dụng khách sẽ thoát. Điều này cũng hoạt động với Docker CLI, Compose, Swarm và Kubernetes.

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.