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?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
Ini tidak bergantung pada detail implementasi volume. Dan impor data dengan tar di mesin kedua.Jawaban:
Jawaban resmi tersedia di bagian "Cadangkan, pulihkan, atau migrasikan volume data" :
CADANGAN:
--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 kebusybox
: gambar kecil yang lebih sederhana - bagus untuk perawatan cepattar cvf /backup/backup.tar /data
: membuat file tar yang tidak terkompresi dari semua file di direktori / dataMENGEMBALIKAN:
sumber
docker create
untuk penampung khusus data sehingga tidak akan dimulai. Lihat contoh di off. dokumentasi: docs.docker.com/userguide/dockervolumes/…/data
dengan/var/lib/postgresql/data
, benar?docker exec
masuk ke dalamnya), maka perintah sederhanatail -f /dev/null
yang tidak akan pernah keluar, tetapi menggunakan sumber daya yang minimal. Ketika Anda tidak membutuhkannya berjalan lagi,docker stop data-container
akan melakukannya untuk Anda. Volume tetap untuk wadah lain.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.
sumber
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.--cidfile=id.txt
sebagai parameter run. ID penampung akan disimpan di fileid.txt
. Saya telah memperbarui jawabannya.docker run --rm
sajadocker run --cidfile ... ; docker rm
.Memperluas jawaban resmi dari dokumen Docker dan jawaban teratas di sini , Anda dapat memiliki alias berikut di .bashrc atau .zshrc Anda
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.
sumber
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: -
centralized
server menangani proses migrasiTautan ke proyek diberikan di sini:
sumber
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
rsync
lebih dari SSH yang dikemas menjadi dua gambar kecil (keduanya ~ 25MB). Pertama, Anda memulaidvsync-server
pada mesin yang ingin Anda salin datanya (Anda akan memerlukanNGROK_AUTHTOKEN
yang dapat diperoleh dari dasbor ngrok ):Kemudian Anda dapat memulai
dvsync-client
di mesin tempat Anda ingin menyalin file, meneruskan yangDVSYNC_TOKEN
ditunjukkan oleh server:Setelah penyalinan selesai, klien akan keluar. Ini bekerja dengan Docker CLI, Compose, Swarm dan Kubernetes juga.
sumber