Bagaimana cara mem-port volume data-only dari satu host ke host lainnya?

121

Seperti yang dijelaskan dalam dokumentasi Docker tentang Bekerja dengan Volume, ada konsep yang disebut wadah hanya data , yang menyediakan volume yang dapat dipasang ke beberapa wadah lain, tidak peduli apakah wadah hanya data benar-benar berjalan atau tidak.

Pada dasarnya, ini terdengar luar biasa. Tetapi ada satu hal yang saya tidak mengerti.

Volume ini (yang tidak secara eksplisit memetakan ke folder di host karena alasan portabilitas, seperti status dokumentasi) dibuat dan dikelola oleh Docker di beberapa folder internal di host ( /var/docker/volumes/…).

Misalkan saya menggunakan volume seperti itu, dan kemudian saya perlu memigrasikannya dari satu host ke host lain - bagaimana cara mem-port volume? AFAICS memiliki ID unik - dapatkah saya pergi dan menyalin volume dan penampung hanya data yang sesuai ke host baru? Bagaimana cara mengetahui file mana yang akan disalin? Atau apakah ada dukungan bawaan untuk Docker yang belum saya temukan?

Golo Roden
sumber
12
Anda dapat mengekspor direktori penampung data: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzIni tidak bergantung pada detail implementasi volume. Dan impor data dengan tar di mesin kedua.
Jiri
1
Wow, itu luar biasa, terima kasih :-)))! Jika Anda menulis komentar ini sebagai jawaban, saya akan menerimanya dengan senang hati!
Golo Roden

Jawaban:

136

Jawaban resmi tersedia di bagian "Cadangkan, pulihkan, atau migrasikan volume data" :

CADANGAN:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: keluarkan wadah saat keluar
  • --volumes-from DATA: lampirkan ke volume yang dibagikan oleh penampung DATA
  • -v $(pwd):/backup: bind mount direktori saat ini ke dalam container; untuk menulis file tar ke
  • busybox: gambar kecil yang lebih sederhana - bagus untuk perawatan cepat
  • tar cvf /backup/backup.tar /data: membuat file tar yang tidak terkompresi dari semua file di direktori / data

MENGEMBALIKAN:

# 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
tommasop
sumber
3
Untuk saat ini, lebih baik menggunakan docker createuntuk penampung khusus data sehingga tidak akan dimulai. Lihat contoh di off. dokumentasi: docs.docker.com/userguide/dockervolumes/…
FelikZ
1
Jadi ... Jika saya mencoba untuk backup database Postgres, apa yang akan saya ganti /datadengan /var/lib/postgresql/data, benar?
425nesp
6
Bagian "Cadangkan, pulihkan, atau migrasikan volume data" tampaknya telah dihapus dari dokumentasi Docker :-(
SteveC
2
@Datz itu hanya perintah yang dipanggil untuk membuat wadah data, itu bisa berupa perintah apa pun yang sebenarnya tidak melakukan apa-apa. Penampung dimulai dan segera keluar tetapi digunakan untuk menyimpan data.
tommasop
1
@rszalski Jika karena alasan tertentu, Anda memerlukan container untuk tetap berjalan (katakanlah, Anda ingin docker execmasuk ke dalamnya), maka perintah sederhana tail -f /dev/nullyang tidak akan pernah keluar, tetapi menggunakan sumber daya yang minimal. Ketika Anda tidak membutuhkannya berjalan lagi, docker stop data-containerakan melakukannya untuk Anda. Volume tetap untuk wadah lain.
Jesse Chisholm
16

Anda dapat mengekspor volume ke tar dan mentransfernya ke komputer lain. Dan impor data dengan tar di mesin kedua. Ini tidak bergantung pada detail implementasi volume.

# 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
Jiri
sumber
Terima kasih atas jawaban anda. Bagaimana cara memindahkan wadah data dari satu host ke host lainnya?
Dzung Nguyen
1
@nXqd Penampung data dibuat oleh docker run -v /data-volume -name datacointainer busybox true- Anda dapat menjalankannya di mana saja. Setelah Anda membuat penampung data, Anda dapat mengimpor arsip tar seperti yang dijelaskan dalam jawaban.
Jiri
Terima kasih atas jawaban anda. Tapi saya menemui masalah lain yaitu kita perlu menghapus container zombie yang digunakan untuk backup sesudahnya. Karena ini tidak mengembalikan id. Apakah Anda memiliki cara yang baik: D
Dzung Nguyen
@nXqd Tentu - Anda harus menggunakan --cidfile=id.txtsebagai parameter run. ID penampung akan disimpan di file id.txt. Saya telah memperbarui jawabannya.
Jiri
9
Anda bisa menggunakan docker run --rmsaja docker run --cidfile ... ; docker rm.
Felix Rabe
16

Memperluas jawaban resmi dari dokumen Docker dan jawaban teratas di sini , Anda dapat memiliki alias berikut di .bashrc atau .zshrc Anda

# 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}"
}

Perhatikan bahwa cadangan disimpan ke /tmp, sehingga Anda dapat memindahkan file cadangan yang disimpan di sana antara host buruh pelabuhan.

Ada juga dua pasang alias backup / restore. Satu menggunakan kompresi dan debian: jessie dan lainnya tanpa kompresi tetapi dengan busybox. Lebih suka menggunakan kompresi jika file yang akan di-backup besar.

Luís Bianchin
sumber
3

Saya akan menambahkan alat terbaru lainnya di sini dari IBM yang sebenarnya dibuat untuk migrasi volume dari satu host kontainer ke yang lain. Ini adalah proyek yang sedang berjalan. Jadi, Anda mungkin menemukan versi lain dengan fitur tambahan di masa mendatang.

Cargo dikembangkan untuk memigrasi kontainer dari satu host ke host lain bersama dengan datanya dengan waktu henti minimal. Cargo menggunakan kapabilitas federasi data dari sistem file serikat untuk membuat tampilan data terpadu (terutama sistem file root) di seluruh host sumber dan target. Hal ini memungkinkan Cargo untuk memulai penampung dengan segera (dalam milidetik) pada host target karena data dari sistem file root sumber disalin ke host target baik saat diminta (menggunakan partisi copy-on-write (COW) ) atau dengan malas di latar belakang (menggunakan rsync) .

Poin penting adalah: - centralizedserver menangani proses migrasi

Tautan ke proyek diberikan di sini:

https://github.com/nadgowdas/cargo
Arif A.
sumber
3

Jika mesin Anda berada di VPC berbeda atau Anda ingin menyalin dari / ke mesin lokal (seperti dalam kasus saya), Anda dapat menggunakan dvsync yang saya buat. Ini pada dasarnya ngrok dikombinasikan dengan rsynclebih dari SSH yang dikemas menjadi dua gambar kecil (keduanya ~ 25MB). Pertama, Anda memulai dvsync-serverpada mesin yang ingin Anda salin datanya (Anda akan memerlukan NGROK_AUTHTOKENyang dapat diperoleh dari dasbor ngrok ):

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

Kemudian Anda dapat memulai dvsync-clientdi mesin tempat Anda ingin menyalin file, meneruskan yang DVSYNC_TOKENditunjukkan oleh server:

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

Setelah penyalinan selesai, klien akan keluar. Ini bekerja dengan Docker CLI, Compose, Swarm dan Kubernetes juga.

suda
sumber