Pencadangan dan pemulihan volume Docker

23

Saya menggunakan Docker untuk menyebarkan beberapa layanan pada server CentOS 6.4, dan saya mencoba mencari cara untuk membuat cadangan data yang mereka hasilkan dengan benar.

Misalnya, salah satu layanan adalah aplikasi web tempat pengguna dapat mengunggah file. Untuk wadah ini, saya memiliki /filesvolume yang ingin saya backup. Host mounts sepertinya mereka agak disukai, karena mount seperti itu sama sekali tidak portabel - seperti yang dikatakan dalam posting blog ini dan dokumentasi buruh pelabuhan untuk volume .

Saya tahu dari posting blog yang sama bahwa saya tidak memerlukan host host untuk mengakses file dalam volume, saya dapat menggunakan docker inspectuntuk mencari tahu di mana file-file itu.

Tapi ini masalah saya: Saya berpikir untuk mencadangkan hanya buruh pelabuhan yang diperlukan untuk membangun kontainer dan volume yang terkait dengannya. Jika saya harus mengembalikan semuanya dari cadangan, bagaimana cara mengetahui direktori volume yang sesuai dengan wadah mana? Membangun kembali wadah menyebabkan id dan jalur volume berubah, jadi saya perlu beberapa informasi tambahan untuk mencocokkannya. Apa lagi, jika ada, yang harus saya backup agar dapat benar-benar memulihkan semuanya?

fcoelho
sumber

Jawaban:

24

Kamu benar. Karena Anda dapat memiliki beberapa kontainer dengan volume sendiri, Anda perlu melacak volume mana yang sesuai dengan wadah mana. Cara melakukannya tergantung pada pengaturan Anda: Saya menggunakan nama-data untuk wadah data, jadi jelas ke wadah mana sebuah gambar berada. Dengan begitu bisa dicadangkan seperti ini:

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

Sekarang Anda hanya perlu membangun kembali gambar Anda dan membuat ulang wadah data Anda:

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

Jadi ini berarti Anda perlu membuat cadangan:

  • Dockerfile
  • volume
  • jalur volume dalam wadah
  • nama wadah volume milik

Pembaruan: Sementara itu saya membuat alat untuk mencadangkan wadah dan volumenya (wadah): https://github.com/discordianfish/docker-backup dan gambar cadangan yang dapat membuat cadangan dan mendorongnya ke s3: https://github.com/discordianfish/docker-lloyd

Yohanes 'ikan' Ziemke
sumber
Itu kompromi yang adil, terima kasih. Apakah ada keuntungan jelas menggunakan wadah terpisah untuk data?
fcoelho
Sekali lagi ini sangat tergantung pada pengaturan Anda. Masuk akal untuk menggunakan wadah data karena Anda dapat dengan mudah merujuknya dengan menggunakan 'volume-dari' dan membuat semua bagian dalamnya diabstraksikan: Anda hanya memasang volume dari wadah ke wadah lain alih-alih memikirkan jalur dan titik pemasangan.
Johannes 'fish' Ziemke
Saya punya opsi kesalahan ini tidak valid - z. Tampaknya tar default di busybox tidak mendukung ini.
Dzung Nguyen
6
JQ sangat dingin, tapi daripada memperkenalkan ketergantungan, mengapa tidak menggunakan docker inspects dibangun di template seperti: VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" ). Mungkin juga bijaksana untuk mengingatkan orang agar tidak membuat cadangan file dengan cara ini saat mereka sedang aktif digunakan (misalnya, basis data).
mc0e
2
Di Docker 1.8 format telah berubah - Volumeshilang dan ada yang Mountsdengan struktur berbeda. Kita perlu melakukan sedikit lebih banyak pekerjaan rangeuntuk menemukan titik mount yang menarik bagi kitaVOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki
5

Di Docker yang lebih baru (diuji dalam 1.9.1, build 9894698) Anda dapat menggunakan cpperintah .

Berikut adalah contoh cara menyalin direktori dari wadah ke host:

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

Berikut adalah contoh cara menyalin direktori dari wadah ke tarfile:

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

Terakhir, contoh cara menyalin direktori dari wadah ke tar.gzfile:

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz
Czerasz
sumber
2
docker cpmengirim semuanya melalui jaringan. Ini adalah sesuatu yang ingin Anda hindari terutama jika volume Docker Anda sudah menjadi volume btrfs.
Jarek Przygódzki
2
Pertanyaannya menyebutkan cadangan dan pemulihan . Contoh pemulihan dalam jawaban ini menggunakan docker cpakan lebih baik.
MadMike