Docker konteynerleri farklı ana bilgisayarlar arasında nasıl taşınır?


99

Docker çalıştıran konteynerleri bir ana bilgisayardan diğerine taşımanın bir yolunu bulamıyorum.

Resimler için yaptığımız gibi kapsayıcılarımı depolara itebilmemin bir yolu var mı? Şu anda, kapsayıcıların içinde çalışan uygulamalarla ilişkili verileri depolamak için veri hacimlerini kullanmıyorum. Bu yüzden bazı veriler, kurulumu yeniden tasarlamadan önce devam ettirmek istediğim kapların içinde bulunuyor.



Kaydetme, meta verileri ve geçmişi koruduğundan, dışa / içe aktarma yerine kaydet / yüklemeyi kullanmak isteyebileceğinizi unutmayın.
Burstaholic

Bu @ aholt'un cevabına bir yorum mu olmalı?
Martin Thompson

docker savegörüntüleri kaydetmek içindir, kapsayıcıları değil. docs.docker.com/engine/reference/commandline/save
stmllr

Yanıtlar:


59

Çalışan bir docker konteynerini bir ana bilgisayardan diğerine taşıyamazsınız.

Konteynırınızdaki değişiklikleri ile bir resme işleyebilir, docker commitresmi yeni bir ana bilgisayara taşıyabilir ve ardından ile yeni bir konteyner başlatabilirsiniz docker run. Bu, uygulamanızın kapsayıcı içinde oluşturduğu tüm verileri koruyacaktır.

Not : Birimler içinde depolanan verileri korumaz; veri birimlerini manuel olarak yeni ana bilgisayara taşımanız gerekir.


@larsks İlk adım, kapsayıcıyı durdurup ardından kaydetme olmaz mıydı?
valentt

@valentt Konteyneri çalıştırmayı ve durdurmayı taahhüt etmek her ikisi de mümkündür
crollywood

2
Bu cevap, kullanmanız gereken komutları tam olarak açıklamıyor, bu da benim gibi bir çaylak için zorlaştırıyor
Paul Kruger

docker-checkpoint, her ikisi de CRIU'yu destekliyorsa, ana bilgisayarlar arasında "çalışan" bir kapsayıcı taşımanıza izin verebilir.
dGRAMOP

2
1. kabı durdurun docker stop x; 2. değişiklikleri işlemek docker commit -p x x; 3. kabı görüntüye kaydedin docker save -o x x; 4. x dosyasını yeni ana bilgisayara taşıyın ve yeni ana bilgisayarda yeni görüntüyü yükleyin dokcer load -i x(kapsayıcıyı -vseçeneğiyle başlattıysanız, bu dosyaları da yeni ana bilgisayara taşımanız gerekir); 5. bu resmidocker run (-v is required to mount these files if needed)
Lau Real

96

Alternatif olarak, bir arşive göndermek istemiyorsanız:

  1. Kapsayıcıyı bir tarball'a aktarın

    docker export <CONTAINER ID> > /home/export.tar
    
  2. Tarball'unuzu yeni makineye taşıyın

  3. Geri aktar

    cat /home/export.tar | docker import - some-name:latest
    

8
Ayrıca birimler içinde depolanan verileri korumaz.
stmllr

1
Bunun nasıl çalışması gerekiyor? İçe aktarımdan sonra yeni görüntü alıyorum ve sonra ne olacak? Sadece yeni bir çalıştır komutu mu yapacaksınız?
valentt

2
Bu aslında gerçekten kötü bir öneri, özellikle veritabanı çalıştıran konteynerler için. Bu öneriyi denedim ve işe yaramadı. Önce konteyneri durdurarak çalışabilir mi?
valentt

2
Bu öneri sadece gerçekten bir alternatif içindi. Durumunuz için işe yarayabilir, olmayabilir. Benim için, o sırada veritabanı replikasyon penceresi konteynerlerini kuruyordum ve dışa aktarma / içe aktarma için, veritabanı verilerinin yedeklerini düzenli olarak farklı bir tarball'a çalıştırdığım için verileri korumaya aldırış etmedim. Bunun için bu mükemmel çalıştı.
aholt

34

Sonunda benim için işe yarayan şey, çok sayıda kafa karıştırıcı kılavuzlar ve kafa karıştırıcı öğreticilerden sonra, Docker açıkçası benim yazarken şişirilmiş beklentilere göz atarken , şu oldu:

  1. Docker görüntüsünü arşive kaydedin:
    docker save image_name > image_name.tar
  2. başka bir makineye kopyala
  3. diğer docker makinesinde docker load'u aşağıdaki şekilde çalıştırın:
    cat image_name.tar | docker load

Başka bir yanıtta önerildiği gibi dışa aktarma ve içe aktarma, kapsayıcınızın çalışması için gerekli olabilecek bağlantı noktalarını ve değişkenleri dışa aktarmaz. Ve "Komut belirtilmedi" gibi şeyler ile karşılaşabilirsiniz ... Başka bir makineye yüklemeye çalıştığınızda.

Bu nedenle, kaydet ve dışa aktar arasındaki fark, kaydet komutunun tüm görüntüyü geçmiş ve meta verilerle kaydetmesi, dışa aktarma komutunun ise yalnızca dosya yapısını dışa aktarmasıdır (geçmiş veya meta veriler olmadan).

Söylemeye gerek yok, eğer docker hyper-visor üzerinde zaten bu portlara sahipseniz, başka bir docker container tarafından içe aktarım yapıyorsanız, çatışmaya gireceksiniz ve maruz kalan portları yeniden yapılandırmanız gerekecek.


1
Çok yardımcı oldu. "Komut belirtilmedi" mesajı beni deli ediyordu.
Rintoul

"Komut belirtilmedi" mesajı da beni deli ediyordu. Docker commit <container-id> stackstorm-local: 2.9 ve docker pull stackstorm-local: 2.9'u başka bir ana bilgisayardan kullanıyorum.
Hua Zhang

Bu benim için çalışıyor
M. Ali El-Sayed

18

Docker belgelerinden:

docker exportkapsayıcıyla ilişkili birimlerin içeriğini dışa aktarmaz. Bir birim kapsayıcıda var olan bir dizinin üstüne monte edilirse, birimin docker exportiçeriğini değil, temeldeki dizinin içeriğini dışa aktarır. Bakınız , Yedekleme geri yükleme veya migrate veri hacimleri bir hacimde veri dışa üzerine örnekler için kullanıcı kılavuzunda.


cluster hq shutdown ... ve BTW kapsayıcıyı taşımak için ZFS / desteklenen herhangi bir depolama
lun'da

7

Bu komut dosyasını kullanın: https://github.com/ricardobranco777/docker-volumes.sh

Bu , verileri ciltler halinde korur.

Örnek kullanım:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

# On the other host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER

1
AWS Linux (Centos) üzerinde benim için çalışmadı. Endi'de, hacim dizinini bulmak için docker inspect kullanma ve ardından bunu manuel olarak kopyalamanın düşük teknolojili yaklaşımını kullandım.
JasonPlutext

@JasonPlutext Belki SELinux ile ilgili bir şey? SELinux'u etkinleştirdiniz mi?
Ricardo Branco

Anladım: tar: Üye adlarından önde gelen `/ 'kaldırılıyor
hjahan

@hjahan Bu tipik bir tar mesajıdır. Ne bir hata ne de bir uyarı.
Ricardo Branco

1

Bunun için birçok çözüm denedim ve bu benim için işe yarayan çözüm:

1. kapsayıcıyı yeni görüntüye kaydet / kaydet:

  1. ++ kapsayıcıyı kaydet :
    # docker stop
    # docker commit CONTAINER_NAME
    # docker save --output IMAGE_NAME.tar IMAGE_NAME: TAG


ps: "CONTAINER_NAME kapsayıcımızın '/ var / home' konumunda takılı bir birimi var" (hacim yolunu belirtmek için kabınızı incelemeniz gerekir: # docker CONTAINER_NAME denetleyin)

  1. ++ hacmini kaydedin: bunu yapmak için bir ubuntu görüntüsü kullanacağız.
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v $ {pwd} / backup: / backup ubuntu bash -c “cd / var / home && tar cvf /backup/volume_backup.tar.”

Şimdi $ {pwd} / backup'a baktığınızda, birimimizi tar biçiminde bulacaksınız.
Şimdiye kadar, konteynırımızın imajı 'IMAGE_NAME.tar' ve hacmi 'volume_backup.tar' elimizde.

Artık aynı eski kapsayıcıyı yeni bir ana bilgisayarda yeniden oluşturabilirsiniz.

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.