Yalnızca veri birimleri bir ana bilgisayardan diğerine nasıl taşınır?


121

Birimlerle Çalışma ile ilgili Docker belgelerinde açıklandığı gibi, salt veri kapsayıcısının gerçekten çalışıp çalışmadığına bakılmaksızın, birden çok başka kapsayıcıya monte edilebilen bir birim sağlayan, salt veri kapsayıcıları kavramı vardır .

Temel olarak, kulağa harika geliyor. Ama anlamadığım bir şey var.

(Do Bu hacimler değil açıkça dokümantasyon devletler olarak, taşınabilirlik nedenlerle ana bilgisayardaki bir klasöre harita) oluşturuldu ve ana bilgisayarda bazı iç klasörde Docker tarafından yönetilmektedir ( /var/docker/volumes/…).

Diyelim ki böyle bir birim kullanıyorum ve sonra onu bir ana bilgisayardan diğerine taşımam gerekiyor - birimi nasıl taşıyabilirim? AFAICS'in benzersiz bir kimliği var - sadece birimi ve yalnızca veri içeren kapsayıcısını yeni bir ana bilgisayara kopyalayabilir miyim? Hangi dosyaların kopyalanacağını nasıl öğrenirim? Yoksa Docker'da henüz keşfetmediğim yerleşik bir destek var mı?


12
Veri kapsayıcı dizinini dışa aktarabilirsiniz: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzBu, birimlerin uygulama ayrıntılarına bağlı değildir. Ve verileri ikinci makineye katran ile aktarın.
Jiri

1
Vay canına, bu harika, teşekkürler :-)))! Bu yorumu cevap olarak yazarsanız, memnuniyetle kabul edeceğim!
Golo Roden

Yanıtlar:


136

Resmi yanıt, "Veri birimlerini yedekleme, geri yükleme veya taşıma" bölümünde mevcuttur :

DESTEK OLMAK:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: kapsayıcı çıkarken çıkarın
  • --volumes-from DATA: DATA kapsayıcısı tarafından paylaşılan birimlere ekleyin
  • -v $(pwd):/backup: geçerli dizini kapsayıcıya bağla; tar dosyasını yazmak için
  • busybox: küçük ve basit bir resim - hızlı bakım için iyidir
  • tar cvf /backup/backup.tar /data: / data dizinindeki tüm dosyaların sıkıştırılmamış bir tar dosyasını oluşturur

ONARMAK:

# 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
Şimdilik docker createyalnızca veri içeren kaplar için kullanmak daha iyidir, böylece bunlar başlatılmaz. Kapalı örneğe bakın. belgeler: docs.docker.com/userguide/dockervolumes/…
FelikZ

1
Ben yedekleme için bir Postgres veritabanı çalışıyorum Eğer Yani ..., ne yerini alacak /dataolan /var/lib/postgresql/datadoğru?
425nesp

6
"Veri birimlerini yedekleme, geri yükleme veya
taşıma

2
@Datz sadece veri kabını oluşturmak için çağrılan bir komut, aslında hiçbir şey yapmayan herhangi bir komut olabilir. Kapsayıcı başlar ve hemen çıkar, ancak verileri sürdürmek için kullanılır.
tommasop

1
@rszalski Herhangi bir nedenle, konteynerin çalışır durumda kalması gerekiyorsa (örneğin, docker execiçine girmek istiyorsunuz), o zaman basit bir komut tail -f /dev/nullasla çıkmayacak, ancak minimum kaynak kullanacaktır. Artık çalıştırmaya ihtiyacın kalmadığında docker stop data-container, bunu senin için yapacak. Hacimler diğer kaplar için kalır.
Jesse Chisholm

16

Hacmi katrana aktarabilir ve başka bir makineye aktarabilirsiniz. Ve verileri ikinci makineye katran ile aktarın. Bu, ciltlerin uygulama ayrıntılarına bağlı değildir.

# 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

Cevabınız için teşekkürler. Veri kabını bir ana bilgisayardan diğerine nasıl taşıyabilirim?
Dzung Nguyen

1
@nXqd Veri kapsayıcısı docker run -v /data-volume -name datacointainer busybox true- bunu her yerde çalıştırabilirsiniz. Veri kabı oluşturduktan sonra, cevapta açıklandığı gibi tar arşivini içe aktarabilirsiniz.
Jiri

Cevabınız için teşekkürler. Ama daha sonra yedeklemek için kullanılan zombi kabını kaldırmamız gereken başka bir sorunla karşılaştım. Bu id döndürmediğinden. Herhangi bir iyi
yolunuz

@nXqd Elbette - --cidfile=id.txtçalıştırma parametresi olarak kullanmanız gerekir . Konteyner kimliği dosyada saklanacaktır id.txt. Cevabı güncelledim.
Jiri

9
Bunun docker run --rmyerine kullanabilirsiniz docker run --cidfile ... ; docker rm.
Felix Rabe

16

Docker belgelerinden resmi yanıtı ve buradaki en iyi yanıtı genişleterek, .bashrc veya .zshrc dosyanızda aşağıdaki takma adlara sahip olabilirsiniz.

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

Yedeklemenin şuraya kaydedildiğini unutmayın: /tmp , böylece orada kaydedilen yedekleme dosyasını docker ana bilgisayarları arasında taşıyabilirsiniz.

Ayrıca iki çift yedekleme / geri yükleme takma adı vardır. Sıkıştırma ve debian kullanan biri: jessie ve sıkıştırmasız ancak busybox kullanan diğeri. Yedeklenecek dosyalar büyükse sıkıştırmayı tercih edin.


3

Burada, bir konteyner ana bilgisayarından diğerine hacim geçişi için yapılmış olan, IBM'den yeni bir araç daha ekleyeceğim. Bu şu anda devam eden bir projedir. Bu nedenle, gelecekte ek özelliklere sahip farklı bir sürüm bulabilirsiniz.

Cargo , konteynerleri bir ana bilgisayardan başka bir ana bilgisayara verileriyle birlikte minimum kesinti süresiyle taşımak için geliştirildi. Cargo , kaynak ve hedef ana bilgisayarlar arasında birleşik bir veri görünümü (esas olarak kök dosya sistemi) oluşturmak için birleşim dosya sisteminin veri federasyonu yeteneklerini kullanır . Bu, Cargo'nun hedef ana bilgisayarda neredeyse anında (milisaniye içinde) bir konteyneri başlatmasını sağlar, çünkü kaynak kök dosya sisteminden gelen veriler talep üzerine ( yazma üzerine kopyalama (COW) bölümü kullanarak) veya tembel olarak hedef ana bilgisayarlara kopyalanır. arka planda (rsync kullanarak) .

Önemli noktalar şunlardır: - centralizedtaşıma sürecini bir sunucu yönetir

Projenin bağlantısı burada verilmiştir:

https://github.com/nadgowdas/cargo

3

Makinelerinizin farklı VPC'lerde olması veya yerel makineden / yerel makineye kopyalamak istiyorsanız (benim durumumda olduğu gibi) oluşturduğum dvsync'i kullanabilirsiniz . Temelde ngrokrsync , iki küçük (her ikisi de ~ 25MB) görüntü halinde paketlenmiş aşırı SSH ile birleştirildi . İlk olarak, dvsync-serververileri kopyalamak istediğiniz bir makinede başlatın ( ngrok kontrol panelindenNGROK_AUTHTOKEN elde edilebilecek olana ihtiyacınız olacak ):

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

Ardından dvsync-client, dosyaları kopyalamak istediğiniz makinede, DVSYNC_TOKENgösterileni sunucuya aktararak başlatabilirsiniz :

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

Kopyalama yapıldıktan sonra müşteri çıkacaktır. Bu Docker CLI, Compose, Swarm ve Kubernetes ile de çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.