Docker sao lưu và khôi phục khối lượng


23

Tôi đang sử dụng Docker để triển khai một số dịch vụ trên máy chủ CentOS 6.4 và tôi đang cố gắng tìm ra cách sao lưu đúng dữ liệu mà chúng tạo ra.

Ví dụ: một trong những dịch vụ là một ứng dụng web nơi người dùng có thể tải lên các tệp. Đối với container này, tôi có một /fileskhối lượng mà tôi muốn sao lưu. Gắn kết máy chủ trông có vẻ như hơi khó chịu, bởi vì gắn kết như vậy là không thể di động - như đã nói trong bài đăng trên blog nàytài liệu docker cho khối lượng .

Tôi biết từ cùng một bài đăng trên blog rằng tôi không cần máy chủ lưu trữ để truy cập các tệp trong một tập, tôi có thể sử dụng docker inspectđể tìm ra vị trí của các tệp.

Nhưng đây là vấn đề của tôi: Tôi đã suy nghĩ về việc sao lưu chỉ các dockerfiles cần thiết để xây dựng các container và khối lượng liên quan đến chúng. Trong trường hợp có khả năng tôi phải khôi phục mọi thứ từ bản sao lưu, làm thế nào để tôi biết được thư mục âm lượng nào tương ứng với container nào? Việc xây dựng lại container khiến id và đường dẫn âm lượng thay đổi, vì vậy tôi sẽ cần thêm một số thông tin để khớp với chúng. Điều gì khác, nếu có, tôi nên sao lưu để có thể thực sự khôi phục mọi thứ?

Câu trả lời:


24

Bạn đúng. Vì bạn có thể có nhiều thùng chứa riêng, nên bạn cần theo dõi khối lượng nào tương ứng với thùng chứa nào. Cách thực hiện tùy thuộc vào thiết lập của bạn: Tôi sử dụng tên -data cho vùng chứa dữ liệu, vì vậy rõ ràng hình ảnh thuộc về vùng chứa nào. Bằng cách đó, nó có thể được sao lưu như thế này:

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

Bây giờ bạn chỉ cần xây dựng lại hình ảnh của mình và tạo lại bộ chứa dữ liệu của bạn:

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

Vì vậy, điều này có nghĩa là bạn cần sao lưu:

  • Dockerfile
  • âm lượng
  • đường dẫn khối lượng trong container
  • Tên của container khối lượng thuộc về

Cập nhật: Trong khi đó, tôi đã tạo một công cụ để sao lưu các thùng chứa và khối lượng (thùng chứa) của chúng: https://github.com/discordianfish/docker-backup và một hình ảnh sao lưu có thể tạo bản sao lưu và đẩy chúng vào s3: https://github.com/discordianfish/docker-lloyd


Đó là một sự thỏa hiệp công bằng, cảm ơn. Có một lợi thế rõ ràng của việc sử dụng một container riêng cho dữ liệu?
fcoelho

Điều này một lần nữa thực sự phụ thuộc vào thiết lập của bạn. Thật hợp lý khi sử dụng bộ chứa dữ liệu vì bạn có thể dễ dàng tham khảo nó bằng cách sử dụng 'volume-from' và có tất cả các phần bên trong được trừu tượng hóa: Bạn chỉ cần gắn khối lượng từ container vào các container khác thay vì suy nghĩ về đường dẫn và điểm gắn kết.
Zi 'cá' Ziemke

Tôi có lỗi này tùy chọn không hợp lệ - z. Có vẻ như tar mặc định trong busybox không hỗ trợ điều này.
nXqd

6
jq rất tuyệt, nhưng thay vì giới thiệu một phụ thuộc, tại sao không sử dụng docker inspects được xây dựng trong templating như vậy : VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Có lẽ cũng nên khôn ngoan khi nhắc mọi người đừng mong đợi sao lưu các tệp theo cách này trong khi họ đang tích cực sử dụng (ví dụ: cơ sở dữ liệu).
mc0e

2
Trong Docker 1.8, định dạng đã thay đổi - Volumeskhông còn nữa và Mountsthay vào đó là với cấu trúc khác nhau. Chúng tôi cần phải làm thêm một chút rangeđể tìm ra điểm gắn kết mà chúng tôi quan tâmVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki

5

Trong Docker mới hơn (đã thử nghiệm 1.9.1, build 9894698), bạn có thể sử dụng cplệnh .

Dưới đây là một ví dụ về cách sao chép một thư mục từ container sang máy chủ:

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

Dưới đây là một ví dụ về cách sao chép một thư mục từ container sang tartệp:

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

Cuối cùng nhưng không kém phần quan trọng là cách sao chép một thư mục từ container sang tar.gztệp:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz

2
docker cpgửi mọi thứ qua mạng. Đó là điều bạn muốn tránh đặc biệt là nếu khối lượng Docker của bạn đã là khối lượng btrfs.
Jarek Przygódzki

2
Câu hỏi đề cập đến sao lưu và khôi phục . Một ví dụ khôi phục trong câu trả lời này bằng cách sử dụng docker cpsẽ tốt đẹp.
MadMike
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.