Bagaimana cara memutuskan antara volume volume buruh pelabuhan dan volume buruh pelabuhan?

24

Setelah membaca dokumen saya agak bingung bagaimana cara terbaik mengelola data aplikasi / layanan produktif.

Tampaknya ada 3 opsi:

  1. Cukup memetakan volume ke direktori host (yaitu -vargumen untuk docker run)
  2. Buat gambar wadah buruh pelabuhan untuk data (yaitu wadah terpisah dan --volumes-from)
  3. Membuat volume buruh pelabuhan (yaitu docker volume create)

Sekarang, tampaknya praktik yang diterima adalah opsi # 2, tetapi kemudian saya bertanya-tanya apa tujuan # 3.

Terutama bagaimana Anda menangani skenario ini dengan benar docker volumedan apakah lebih baik menggunakan wadah volume data atau ini untuk setiap situasi?

  • Anda memerlukan data aplikasi dalam volume yang terpisah dan / atau tingkat penyimpanan di server Anda
  • Mencadangkan
  • Memulihkan data
dukeofgaming
sumber
@MichaelHampton saya menyadari saya harus mengulangi pertanyaan saya
dukeofgaming
# 1 bukanlah pilihan serius untuk produksi; itu pada dasarnya tidak boleh dilakukan jika ada alternatif.
Michael Hampton
2
@MichaelHampton Why ?, data mungkin tidak di-galerisasi tetapi OS host masih dikelola oleh tim infrastruktur yang memantau dan
mencadangkan
@dukeofgaming Belum lagi Anda dapat menjalankannya btrfs scrubuntuk menemukan dan memperbaiki file yang rusak. Saya tidak yakin bagaimana cara kerja barang-barang galerisasi, tetapi saya kira itu tidak melindungi terhadap pembusukan data, jadi saya selalu membutuhkan pemulihan penuh jika sesuatu yang buruk terjadi alih-alih hanya mengembalikan file individual. Pikiran lain yang menambahkan lapisan abstraksi, sehingga memperlambat membaca dan menulis file bahkan lebih. Saya entah bagaimana tidak melihat keuntungan dari # 2 dan # 3, tetapi saya tidak berpengalaman dengan buruh pelabuhan, jadi ini mungkin berubah.
inf3rno

Jawaban:

18

Saya pikir # 2 dan # 3 adalah hal yang hampir sama, perbedaan utama adalah bahwa tidak ada wadah yang berhenti dengan # 3 (secara harfiah, hanya volume bernama). Misalnya, Anda dapat membuat volume bernama dan melakukan apa yang Anda lakukan dengan # 2 -vsebagai gantinya.

Buat volume bernama:

$ docker volume create --name test

Pasang dan tulis beberapa data ke volume itu dari sebuah wadah:

$ docker run -v test:/opt/test alpine touch /opt/test/hello

Anda kemudian dapat memasang testvolume yang sama di wadah lain dan membaca data:

$ docker run -v test:/opt/test alpine ls -al /opt/test     
total 8
drwxr-xr-x    2 root     root          4096 Jan 23 22:28 .
drwxr-xr-x    3 root     root          4096 Jan 23 22:29 ..
-rw-r--r--    1 root     root             0 Jan 23 22:28 hello

Keuntungannya di sini adalah bahwa volume tidak akan hilang secara tidak sengaja jika Anda menghapus wadah data saja. Anda sekarang mengelolanya dengan docker volumesub-perintah.

$ d volume ls
DRIVER              VOLUME NAME
local               test

Ini juga membuka kemungkinan untuk driver volume di jalan sehingga Anda mungkin dapat melakukan volume bersama antara host (mis. Volume bernama lebih dari NFS). Contohnya adalah Flocker dan Convoy . Untuk poin Anda secara khusus tentang memindahkan atau mencadangkan data, Konvoi memiliki sub-perintah khusus untuk membuat cadangan data dan memungkinkan untuk penyimpanan di NFS atau EBS eksternal ke host Anda.

Untuk alasan ini, saya pikir cara sekolah yang lebih baru (Docker 1.9+) adalah dengan menggunakan volume bernama daripada wadah data saja.

Andy Shinn
sumber
Terima kasih, Anda menjawab sebagian besar pertanyaan saya, tetapi poin tentang mengelola data kontainer dalam tingkat volume fisik yang berbeda masih belum terjawab dan itu adalah yang kritis ... anggap ini adalah solusi manajemen git repo dan saya memerlukan bagian dari wadah itu data (yang merupakan volume yang ditentukan dalam dockerfile) di penyimpanan Tier 0 yang terletak di volume host fisik yang berbeda (yaitu partisi lain, disk fisik, atau apa pun)
dukeofgaming
Saya semacam melakukannya dengan menyebutkan driver volume. Saat ini, untuk menyimpan data di luar driver penyimpanan lokal fisik, Anda harus menggunakan salah satu yang secara khusus melakukan apa yang ingin Anda lakukan. Dari atas kepala saya, ada github.com/rancher/convoy dan github.com/ClusterHQ/flocker . Konvoi memiliki dukungan untuk NFS dan GlusterFS pada saat ini yang terdengar lebih dekat dengan apa yang Anda cari. Saya akan memodifikasi jawaban untuk memperjelas ini.
Andy Shinn
Menggunakan driver devicemapper tampaknya menjawab pertanyaan saya, terima kasih! docs.docker.com/engine/userguide/storagedriver/…
dukeofgaming
the volume won't accidentally disappear if you remove the data-only container. Bisakah Anda menguraikan? Terima kasih.
Stephane
22

Pada Docker 1.9, membuat Volume Bernama dengan Volumes API ( docker volume create --name mydata) lebih disukai daripada Kontainer Volume Data. Pada Februari 2016, dokumentasi volume Docker sudah ketinggalan zaman. Orang-orang di Docker sendiri menyarankan bahwa Wadah Volume Data " tidak lagi dianggap sebagai pola yang direkomendasikan ," " 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 . "

Rekomendasi Quinn
sumber