Bagaimana cara memindahkan kontainer Docker di antara host yang berbeda?

98

Saya tidak dapat menemukan cara untuk memindahkan pekerja pelabuhan yang menjalankan kontainer dari satu host ke host lainnya.

Adakah cara agar saya dapat mendorong container saya ke repositori seperti yang kami lakukan untuk gambar? Saat ini, saya tidak menggunakan volume data untuk menyimpan data yang terkait dengan aplikasi yang berjalan di dalam container. Jadi beberapa data berada di dalam container, yang ingin saya pertahankan sebelum mendesain ulang penyiapan.

Dinesh Reddy
sumber
Lihat flocker github.com/ClusterHQ/flocker
Adrian Mouat
Perhatikan bahwa Anda mungkin ingin menggunakan simpan / muat daripada ekspor / impor, karena menyimpan menyimpan metadata dan riwayat.
Burstaholic
Haruskah ini menjadi komentar untuk jawaban @ aholt?
Martin Thompson
docker saveadalah untuk menyimpan gambar, bukan wadah. docs.docker.com/engine/reference/commandline/save
stmllr

Jawaban:

57

Anda tidak dapat memindahkan kontainer buruh pelabuhan yang sedang berjalan dari satu host ke host lainnya.

Anda dapat melakukan perubahan dalam penampung Anda ke gambar dengan docker commit, memindahkan gambar ke host baru, lalu memulai penampung baru dengan docker run. Ini akan menyimpan data apa pun yang telah dibuat aplikasi Anda di dalam penampung.

Nb: Itu tidak menyimpan data yang disimpan di dalam volume; Anda perlu memindahkan volume data secara manual ke host baru.

larsks
sumber
@larsks Bukankah langkah pertama adalah menghentikan container, lalu melakukan komit?
valentt
@valentt Keduanya mungkin, untuk berkomitmen menjalankan dan menghentikan kontainer
crollywood
1
Jawaban ini tidak benar-benar menjelaskan dengan tepat perintah yang perlu Anda gunakan, yang menyulitkan pemula seperti saya
Paul Kruger
docker-checkpoint memungkinkan Anda memindahkan container "berjalan" di antara host, jika keduanya mendukung CRIU.
dGRAMOP
2
1. hentikan wadah docker stop x; 2. lakukan perubahan Anda docker commit -p x x; 3. simpan wadah ke gambar docker save -o x x; 4. pindahkan file x ke host baru dan di host baru muat gambar baru dokcer load -i x(jika Anda memulai penampung dengan -vopsi, Anda juga harus memindahkan file ini ke host baru); 5. jalankan gambar ini dengandocker run (-v is required to mount these files if needed)
Lau Real
95

Atau, jika Anda tidak ingin memasukkan ke repositori:

  1. Ekspor kontainer ke tarball

    docker export <CONTAINER ID> > /home/export.tar
    
  2. Pindahkan tarball Anda ke mesin baru

  3. Impor kembali

    cat /home/export.tar | docker import - some-name:latest
    
aholt
sumber
8
Juga tidak menyimpan data yang disimpan di dalam volume.
stmllr
1
Bagaimana cara kerjanya? Setelah impor saya mendapatkan gambar baru, lalu apa? Lakukan saja perintah jalankan baru?
valentt
2
Ini sebenarnya adalah saran yang sangat buruk, terutama untuk container yang menjalankan database. Saya mencoba saran ini dan tidak berhasil. Mungkinkah ini bekerja dengan menghentikan wadah dulu?
valentt
2
Saran ini hanya dimaksudkan sebagai alternatif. Mungkin berhasil untuk situasi Anda, mungkin juga tidak. Bagi saya, saya sedang menyiapkan wadah buruh pelabuhan replikasi database pada saat itu, dan untuk ekspor / impor, tidak peduli tentang melestarikan data, karena saya menjalankan backup data database secara teratur ke tarball yang berbeda. Untuk itu, ini bekerja dengan sempurna.
Aholt
32

Apa yang akhirnya berhasil bagi saya, setelah banyak manual yang membingungkan dan tutorial yang membingungkan, karena Docker jelas pada saat saya menulis tentang ekspektasi yang meningkat , adalah:

  1. Simpan gambar buruh pelabuhan ke dalam arsip:
    docker save image_name > image_name.tar
  2. salin di komputer lain
  3. di mesin buruh pelabuhan lainnya, jalankan beban buruh pelabuhan dengan cara berikut:
    cat image_name.tar | docker load

Ekspor dan impor, seperti yang diusulkan dalam jawaban lain tidak mengekspor port dan variabel, yang mungkin diperlukan agar penampung Anda berjalan. Dan Anda mungkin berakhir dengan hal-hal seperti "Tidak ada perintah yang ditentukan" dll ... Saat Anda mencoba memuatnya di komputer lain.

Jadi, perbedaan antara simpan dan ekspor adalah bahwa perintah simpan menyimpan seluruh gambar dengan histori dan metadata, sedangkan perintah ekspor hanya mengekspor struktur file (tanpa histori atau metadata).

Yang perlu dikatakan adalah, jika Anda sudah memiliki port tersebut yang diambil pada hyper-visor buruh pelabuhan yang Anda lakukan impor, oleh beberapa kontainer buruh pelabuhan lain, Anda akan berakhir dalam konflik, dan Anda harus mengkonfigurasi ulang port yang terbuka.

Aleksandar Pavić
sumber
1
Sangat membantu. Pesan "Tidak ada perintah yang ditentukan" membuat saya gila.
Rintoul
Pesan "Tidak ada perintah yang ditentukan" membuat saya gila juga. Saya menggunakan buruh pelabuhan commit <container-id> stackstorm-local: 2.9, dan buruh pelabuhan menarik stackstorm-local: 2.9 dari host lain.
Hua Zhang
18

Dari dokumentasi Docker:

docker exporttidak mengekspor konten volume yang terkait dengan penampung. Jika volume dipasang di atas direktori yang ada di wadah, docker exportakan mengekspor konten direktori yang mendasari , bukan konten volume. Lihat Mencadangkan, memulihkan, atau memigrasi volume data di panduan pengguna untuk contoh tentang mengekspor data dalam volume.

Antonio De Marinis
sumber
cluster HQ shutdown ... dan BTW untuk memigrasi container, container harus berjalan di ZFS / setiap bulan penyimpanan yang didukung
asvignesh
6

Gunakan skrip ini: https://github.com/ricardobranco777/docker-volumes.sh

Ini memang menyimpan data dalam volume.

Contoh penggunaan:

# 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
Ricardo Branco
sumber
1
Tidak berfungsi untuk saya di AWS Linux (Centos). Pada akhirnya saya mengambil pendekatan teknologi rendah dengan menggunakan buruh pelabuhan inspeksi untuk menemukan direktori volume, lalu menyalinnya secara manual.
JasonPlutext
@JasonPlutext Mungkin sesuatu yang berhubungan dengan SELinux? Apakah Anda telah mengaktifkan SELinux?
Ricardo Branco
1

Saya mencoba banyak solusi untuk ini, dan inilah yang berhasil untuk saya:

1. Kirim / simpan kontainer ke gambar baru:

  1. ++ komit wadah:
    # pekerja galangan stop
    #
    pekerja galangan komit CONTAINER_NAME # simpan pekerja galangan --output IMAGE_NAME.tar IMAGE_NAME: TAG


ps: "Container kami CONTAINER_NAME memiliki volume yang terpasang di '/ var / home'" (Anda harus memeriksa container Anda untuk menentukan jalur volumenya: # buruh pelabuhan periksa CONTAINER_NAME)

  1. ++ menyimpan volumenya: kami akan menggunakan gambar ubuntu untuk melakukan hal itu.
    # 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.”

Sekarang ketika Anda melihat $ {pwd} / backup, Anda akan menemukan volume kami di bawah format tar.
Hingga saat ini, kami memiliki gambar conatainer kami 'IMAGE_NAME.tar' dan volumenya 'volume_backup.tar'.

Sekarang Anda bisa, membuat ulang penampung lama yang sama di host baru.

Houssam Ezzoukh
sumber