Bagaimana orang berurusan dengan penyimpanan persisten untuk wadah Docker Anda?
Saat ini saya menggunakan pendekatan ini: membangun gambar, misalnya untuk PostgreSQL, dan kemudian mulai wadah dengan
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
IMHO, yang memiliki kelemahan, bahwa saya tidak boleh (secara tidak sengaja) menghapus wadah "c0dbc34fd631".
Gagasan lain adalah memasang volume host "-v" ke dalam wadah, namun, userid di dalam wadah tidak selalu cocok dengan userid dari host, dan kemudian izin mungkin akan kacau.
Catatan: Alih-alih --volumes-from 'cryptic_id'
Anda juga dapat menggunakan di --volumes-from my-data-container
mana my-data-container
nama yang Anda tetapkan untuk wadah hanya data, mis. docker run --name my-data-container ...
(Lihat jawaban yang diterima)
docker
docker-container
juwalter
sumber
sumber
--name
. Anda punya-name
Jawaban:
Docker 1.9.0 dan lebih tinggi
Gunakan API volume
Ini berarti bahwa pola wadah hanya-data harus ditinggalkan demi volume baru.
Sebenarnya volume API hanyalah cara yang lebih baik untuk mencapai apa yang menjadi pola data-container.
Jika Anda membuat wadah dengan
-v volume_name:/container/fs/path
Docker secara otomatis akan membuat volume bernama untuk Anda yang dapat:docker volume ls
docker volume inspect volume_name
--volumes-from
koneksiAPI volume baru menambahkan perintah yang berguna yang memungkinkan Anda mengidentifikasi volume yang menggantung:
Dan kemudian hapus melalui namanya:
Sebagai @mpugach menggarisbawahi dalam komentar, Anda dapat menyingkirkan semua volume yang menggantung dengan one-liner yang bagus:
Docker 1.8.x dan di bawah
Pendekatan yang tampaknya bekerja paling baik untuk produksi adalah dengan menggunakan wadah data saja .
Wadah data saja dijalankan pada gambar barebones dan sebenarnya tidak melakukan apa-apa selain mengekspos volume data.
Kemudian Anda bisa menjalankan wadah lain untuk memiliki akses ke volume wadah data:
Dalam posting blog ini ada deskripsi yang baik tentang wadah yang disebut sebagai pola volume yang menjelaskan titik utama memiliki data wadah saja .
Dokumentasi Docker sekarang memiliki deskripsi DEFINITIF dari wadah sebagai pola volume .
Berikut ini adalah prosedur pencadangan / pemulihan untuk Docker 1.8.x dan di bawah ini.
CADANGAN:
MENGEMBALIKAN:
Berikut ini adalah artikel bagus dari Brian Goff yang luar biasa yang menjelaskan mengapa sebaiknya menggunakan gambar yang sama untuk wadah dan wadah data.
sumber
--volumes-from
memungkinkan Anda berbagi ruang disk--link
memungkinkan Anda berbagi layanan.docker volume create --name mydata
) lebih disukai daripada Kontainer Volume Data. Orang-orang di Docker sendiri menyarankan bahwa Wadah Volume Data " tidak lagi dianggap sebagai pola yang disarankan ," " volume yang dinamai harus dapat menggantikan volume hanya data di sebagian besar (jika tidak semua) kasus ," dan " tidak ada alasan saya bisa melihat untuk menggunakan wadah khusus data . "Dalam Docker release v1.0 , mengikat mount file atau direktori pada mesin host dapat dilakukan dengan perintah yang diberikan:
Volume di atas dapat digunakan sebagai penyimpanan persisten pada host yang menjalankan Docker.
sumber
Pada Docker Compose 1.6, sekarang ada peningkatan dukungan untuk volume data di Docker Compose. File penulisan berikut akan membuat gambar data yang akan bertahan di antara restart (atau bahkan menghapus) wadah induk:
Berikut adalah pengumuman blog: Compose 1.6: New Compose file untuk mendefinisikan jaringan dan volume
Berikut ini contoh file penulisan:
Sejauh yang saya mengerti: Ini akan membuat wadah volume data (
db_data
) yang akan bertahan di antara restart.Jika Anda menjalankan:
docker volume ls
Anda akan melihat volume Anda terdaftar:Anda bisa mendapatkan detail lebih lanjut tentang volume data:
Beberapa pengujian:
Catatan:
Anda juga dapat menentukan berbagai driver di
volumes
blok. Misalnya, Anda bisa menentukan driver Flocker untuk db_data:Penafian: Pendekatan ini menjanjikan, dan saya menggunakannya dengan sukses di lingkungan pengembangan. Saya akan khawatir untuk menggunakan ini dalam produksi dulu!
sumber
Dalam hal tidak jelas dari pembaruan 5 dari jawaban yang dipilih, pada Docker 1.9, Anda dapat membuat volume yang dapat ada tanpa dikaitkan dengan wadah tertentu, sehingga membuat pola "wadah hanya-data" usang.
Lihat Wadah khusus data yang usang dengan docker 1.9.0? # 17.798 .
Saya pikir pemilik Docker menyadari bahwa pola wadah data-satunya adalah sedikit bau desain dan memutuskan untuk membuat volume sebagai entitas terpisah yang dapat ada tanpa wadah terkait.
sumber
Meskipun ini masih merupakan bagian dari Docker yang memerlukan beberapa pekerjaan , Anda harus meletakkan volume di Dockerfile dengan instruksi VOLUME sehingga Anda tidak perlu menyalin volume dari wadah lain.
Itu akan membuat wadah Anda kurang saling bergantung dan Anda tidak perlu khawatir tentang penghapusan satu wadah yang memengaruhi wadah lainnya.
sumber
docker rm
)Saat menggunakan Docker Compose , cukup lampirkan volume bernama, misalnya:
sumber
@tommasop jawaban baik, dan menjelaskan beberapa mekanisme menggunakan wadah data saja. Tetapi sebagai seseorang yang awalnya berpikir bahwa kontainer data konyol ketika seseorang hanya dapat mengikat volume ke host (seperti yang disarankan oleh beberapa jawaban lain), tetapi sekarang menyadari bahwa sebenarnya hanya wadah data yang cukup rapi, saya dapat menyarankan saya sendiri posting blog tentang topik ini: Mengapa Wadah Data Docker (Volume!) Bagus
Lihat juga: jawaban saya untuk pertanyaan " Apa cara (terbaik) untuk mengelola izin untuk volume bersama Docker? " Untuk contoh tentang bagaimana menggunakan wadah data untuk menghindari masalah seperti izin dan pemetaan uid / gid dengan tuan rumah.
Untuk mengatasi salah satu masalah awal OP: wadah data tidak boleh dihapus. Bahkan jika kontainer data dihapus, data itu sendiri tidak akan hilang selama setiap kontainer memiliki referensi ke volume itu yaitu setiap kontainer yang memasang volume melalui
--volumes-from
. Jadi kecuali semua kontainer terkait dihentikan dan dihapus (orang bisa menganggap ini setara dengan kecelakaanrm -fr /
) datanya aman. Anda selalu dapat membuat ulang wadah data dengan melakukan--volumes-from
wadah apa pun yang memiliki referensi ke volume itu.Seperti biasa, buat cadangan!
PEMBARUAN: Docker sekarang memiliki volume yang dapat dikelola secara terpisah dari wadah, yang selanjutnya membuatnya lebih mudah untuk dikelola.
sumber
Ada beberapa tingkat mengelola data persisten, tergantung pada kebutuhan Anda:
-v host-path:container-path
untuk bertahan data direktori kontainer ke direktori host.--volumes-from
untuk memasang data itu ke wadah aplikasi Anda.sumber
Jika Anda ingin memindahkan volume Anda, Anda juga harus melihat Flocker .
Dari README:
sumber
Itu tergantung pada skenario Anda (ini tidak benar-benar cocok untuk lingkungan produksi), tetapi di sini ada satu cara:
Membuat Kontainer Docker MySQL
Inti dari ini adalah menggunakan direktori pada host Anda untuk kegigihan data.
sumber
Baru-baru ini saya menulis tentang solusi potensial dan aplikasi yang menunjukkan teknik tersebut. Saya merasa cukup efisien selama pengembangan dan produksi. Semoga ini bisa membantu atau memicu beberapa ide.
Repo: https://github.com/LevInteractive/docker-nodejs-example
Artikel: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
sumber
Saya hanya menggunakan direktori yang sudah ditentukan pada host untuk bertahan data PostgreSQL. Selain itu, dengan cara ini dimungkinkan untuk dengan mudah memigrasi instalasi PostgreSQL yang sudah ada ke wadah Docker: https://crondev.com/persistent-postgresql-inside-docker/
sumber
Solusi saya adalah menggunakan yang baru
docker cp
, yang sekarang dapat menyalin data dari wadah, tidak masalah apakah itu berjalan atau tidak dan berbagi volume host ke lokasi yang sama persis di mana aplikasi database membuat file database di dalam wadah . Solusi ganda ini berfungsi tanpa wadah khusus data, langsung dari wadah basis data asli.Jadi skrip init systemd saya mengambil pekerjaan mencadangkan database ke dalam arsip di host. Saya menempatkan cap waktu di nama file untuk tidak pernah menulis ulang file.
Itu melakukannya di ExecStartPre:
Dan itu juga melakukan hal yang sama di ExecStopPost:
Plus, saya mengekspos folder dari host sebagai volume ke lokasi yang sama persis di mana database disimpan:
Ini bekerja sangat baik pada VM saya (saya membangun sendiri tumpukan LEMP): https://github.com/DJviolin/LEMP
Tapi saya tidak tahu apakah itu solusi "antipeluru" ketika hidup Anda benar-benar bergantung padanya (misalnya, toko web dengan transaksi dalam milidetik yang memungkinkan)?
Pada 20 menit 20 detik dari video utama Docker ini, presenter melakukan hal yang sama dengan database:
Memulai dengan Docker
sumber
Gunakan Persistent Volume Claim (PVC) dari Kubernetes, yang merupakan alat manajemen jadwal dan penjadwalan Docker:
Volume Persisten
Keuntungan menggunakan Kubernetes untuk tujuan ini adalah:
sumber