Docker Volume dan Presistent Data
Docker Volume
Volume adalah mekanisme yang dipilih untuk persisting data yang dihasilkan oleh dan digunakan oleh kontainer Docker. Sementara bind mount bergantung pada struktur direktori dan OS mesin host, volume sepenuhnya dikelola oleh Docker. Volume memiliki beberapa keunggulan dibandingkan dudukan bind:
- Volume lebih mudah untuk dicadangkan atau dimigrasi daripada bind mount.
- Pengguna dapat mengelola volume menggunakan perintah Docker CLI atau API Docker.
- Volume berfungsi pada container Linux dan Windows.
- Volume dapat dibagikan dengan lebih aman di antara beberapa kontainer.
- Driver volume memungkinkan Pengguna menyimpan volume di host jarak jauh atau penyedia cloud, untuk mengenkripsi konten volume, atau menambahkan fungsionalitas lainnya.
- Volume baru dapat memiliki kontennya yang telah diisi sebelumnya oleh sebuah container.
- Volume di Desktop Docker memiliki kinerja yang jauh lebih tinggi daripada bind mount dari host Mac dan Windows.
Selain itu, volume sering kali merupakan pilihan yang lebih baik daripada persisting data di lapisan container yang dapat ditulis, karena volume tidak meningkatkan ukuran container yang menggunakannya, dan konten volume berada di luar siklus hidup container tertentu.
Jika container Pengguna menghasilkan data status non-persisten, pertimbangkan untuk menggunakan pemasangan tmpfs untuk menghindari penyimpanan data di mana pun secara permanen, dan untuk meningkatkan kinerja container dengan menghindari penulisan ke dalam lapisan container yang dapat ditulis.
Volume menggunakan rprivatepropagasi mengikat, dan propagasi ikatan tidak dapat dikonfigurasi untuk volume.
Pilih -v atau --mount flag
Secara umum, --mountlebih eksplisit dan bertele-tele. Perbedaan terbesar adalah -vsintaksnya menggabungkan semua opsi menjadi satu dalam satu bidang, sedangkan --mountsintaks memisahkannya. Berikut adalah perbandingan sintaks untuk setiap bendera.
Jika Pengguna perlu menentukan opsi driver volume, Pengguna harus menggunakan --mount.
- -v atau --volume : Terdiri dari tiga bidang, dipisahkan oleh karakter titik dua ( :). Urutan kolom harus benar, dan arti setiap kolom tidak langsung terlihat.
- Dalam kasus volume bernama, bidang pertama adalah nama volume, dan unik pada mesin host tertentu. Untuk volume anonim, bidang pertama dihilangkan.
- Bidang kedua adalah jalur tempat file atau direktori dipasang di container.
- Bidang ketiga adalah opsional, dan merupakan daftar opsi yang dipisahkan koma, seperti ro. Opsi-opsi hal ini dibahas di bawah.
- --mount: Terdiri dari beberapa pasangan nilai kunci, dipisahkan dengan koma dan masing-masing terdiri dari <key>=<value>tupel. --mountsintaks lebih verbose dari -vatau --volume, tetapi urutan tombol tidak signifikan, dan nilai bendera adalah lebih mudah untuk memahami.
- typedari mount, yang dapat bind, volumeatau tmpfs. Topik hal ini membahas volume, jadi tipenya selalu volume.
- sourcedari mount. Untuk volume bernama, hal ini adalah nama volume. Untuk volume anonim, bidang hal ini dihilangkan. Dapat ditentukan sebagai sourceatau src.
- Nilai tersebut destinationmengambil jalur tempat file atau direktori dipasang di container. Dapat ditentukan sebagai destination, dst, atau target.
- readonlypilihan, jika ada, menyebabkan mengikat mount untuk dipasang ke dalam container sebagai read-only .
- volume-optpilihan, yang dapat ditentukan lebih dari sekali, mengambil sepasang kunci-nilai yang terdiri dari nama pilihan dan nilainya.
Nilai keluar dari parser CSV luar
Jika driver volume Pengguna menerima daftar yang dipisahkan koma sebagai opsi, Pengguna harus melepaskan nilai dari parser CSV luar. Untuk meloloskan diri dari a volume-opt, kelilingi dengan tpengguna kutip gpengguna ( ") dan kelilingi seluruh parameter pemasangan dengan tpengguna kutip tunggal ( ').
Misalnya, localdriver menerima opsi pemasangan sebagai daftar yang dipisahkan koma di oparameter. Contoh hal ini menunjukkan cara yang benar untuk keluar dari daftar.
$ docker service create \
--mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
--name myservice \
<IMAGE>
Contoh di bawah hal ini menunjukkan sintaks –mount dan -vjika memungkinkan, dan --mountdisajikan terlebih dahulu.
Perbedaan antara –v dan –mount secara sifat
Berbeda dengan bind mount, semua opsi untuk volume tersedia untuk keduanya –mount dan -vflag.
Saat menggunakan volume dengan service, hanya –mount didukung.
Buat dan kelola volume
Tidak seperti dudukan bind, Pengguna dapat membuat dan mengelola volume di luar cakupan container apa pun.
Buat volume :
$ docker volume create my-vol
Daftar volume:
$ docker volume ls local my-vol
Periksa volume :
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
Hapus volume :
$ docker volume rm my-vol
Mulai container dengan volume
Jika Pengguna memulai container dengan volume yang belum ada, Docker membuat volume untuk Pengguna. Contoh berikut memasang volume myvol2ke /app/dalam container.
–v dan –mount contoh di bawah menghasilkan hasil yang sama. Pengguna tidak dapat menjalankan keduanya kecuali Pengguna menghapus devtestcontainer dan myvol2volume setelah menjalankan yang pertama.
- --mount
- -v
$ docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
Gunakan docker inspect devtest untuk memverifikasi bahwa volume telah dibuat dan dipasang dengan benar. Cari Mountsbagiannya:
"Mounts": [ { "Type": "volume", "Name": "myvol2", "Source": "/var/lib/docker/volumes/myvol2/_data", "Destination": "/app", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
Hal ini menunjukkan bahwa mount adalah sebuah volume, hal ini menunjukkan sumber dan tujuan yang benar, dan mount tersebut adalah read-write.
Hentikan container dan keluarkan volumenya. Penghapusan volume catatan adalah langkah terpisah.
$ docker container stop devtest
$ docker container rm devtest
$ docker volume rm myvol2
Gunakan volume dengan docker-compose
Sebuah docker compose service dengan volume berbentuk seperti ini:
version: "3.9"
service:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
Pada pemanggilan pertama docker-compose up volume akan dibuat. Volume yang sama akan digunakan kembali pada pemanggilan berikutnya.
Volume dapat dibuat langsung di luar compose dengan docker volume createdan kemudian direferensikan di dalamnya docker-compose.yml sebagai berikut:
version: "3.9"
service:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
external: true
Mulai service dengan volume
Saat Pengguna memulai service dan menentukan volume, setiap kontainer service menggunakan volume lokalnya sendiri. Tidak ada kontainer yang dapat membagikan data hal ini jika Pengguna menggunakan localdriver volume, tetapi beberapa driver volume mendukung penyimpanan bersama. Docker untuk AWS dan Docker untuk Azure, keduanya mendukung penyimpanan persisten menggunakan plugin Cloudstor.
Contoh berikut memulai nginxservice dengan empat replika, yang masing-masing menggunakan volume lokal yang dipanggil myvol2.
$ docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=myvol2,target=/app \
nginx:latest
Gunakan docker service ps devtest-serviceuntuk memverifikasi bahwa service sedang berjalan:
$ docker service ps devtest-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
4d7oz1j85wwn devtest-service.1 nginx:latest moby Running Running 14 seconds ago
Hapus service, yang menghentikan semua tugasnya:
$ docker service rm devtest-service
Menghapus service tidak menghapus volume apa pun yang dibuat oleh service. Penghapusan volume adalah langkah terpisah.
Perbedaan sintaks untuk service
docker service createperintah tidak mendukung -vatau --volumebendera. Saat memasang volume ke dalam kontainer service, Pengguna harus menggunakan --mountbendera.
Isi volume menggunakan container
Jika Pengguna memulai container yang membuat volume baru, seperti di atas, dan container tersebut memiliki file atau direktori di direktori yang akan dipasang (seperti di /app/atas), konten direktori akan disalin ke dalam volume. Container kemudian memasang dan menggunakan volume, dan container lain yang menggunakan volume juga memiliki akses ke konten yang telah terisi sebelumnya.
Untuk mengilustrasikan hal hal ini, contoh hal ini memulai sebuah nginxcontainer dan mengisi volume baru nginx-voldengan konten /usr/share/nginx/htmldirektori container , di mana Nginx menyimpan konten HTML defaultnya.
--mountdan -vcontoh memiliki hasil akhir yang sama.
- --mount
- -v
$ docker run -d \
--name=nginxtest \
--mount source=nginx-vol,destination=/usr/share/nginx/html \
nginx:latest
Setelah menjalankan salah satu dari contoh hal ini, jalankan perintah berikut untuk membersihkan container dan volume. Penghapusan volume catatan adalah langkah terpisah.
$ docker container stop nginxtest
$ docker container rm nginxtest
$ docker volume rm nginx-vol
Gunakan volume read-only
Untuk beberapa aplikasi pengembangan, container perlu menulis ke bind mount agar perubahan disebarkan kembali ke host Docker. Di lain waktu, container hanya memerlukan akses baca ke data. Ingatlah bahwa beberapa kontainer dapat memasang volume yang sama, dan dapat dipasang baca-tulis untuk beberapa di antaranya dan hanya-baca untuk yang lain, pada saat yang bersamaan.
Contoh hal ini memodifikasi yang di atas tetapi memasang direktori sebagai volume hanya-baca, dengan menambahkan roke daftar opsi (kosong secara default), setelah titik pemasangan di dalam container. Jika ada beberapa opsi, pisahkan dengan koma.
--mount dan –v contoh memiliki hasil yang sama.
- --mount
- -v
$ docker run -d \
--name=nginxtest \
--mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
nginx:latest
Gunakan docker inspect nginxtestuntuk memverifikasi bahwa pemasangan hanya-baca telah dibuat dengan benar. Cari Mountsbagiannya:
"Mounts": [ { "Type": "volume", "Name": "nginx-vol", "Source": "/var/lib/docker/volumes/nginx-vol/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "", "RW": false, "Propagation": "" } ],
Hentikan dan keluarkan container, dan keluarkan volumenya. Penghapusan volume adalah langkah terpisah.
$ docker container stop nginxtest
$ docker container rm nginxtest
$ docker volume rm nginx-vol
Bagikan data di antara mesin
Saat membuat aplikasi yang toleran terhadap kesalahan, Pengguna mungkin perlu mengonfigurasi beberapa replika dari service yang sama untuk memiliki akses ke file yang sama.
Ada beberapa cara untuk mencapai hal ini saat mengembangkan aplikasi Pengguna. Salah satunya adalah menambahkan logika ke aplikasi Pengguna untuk menyimpan file di sistem penyimpanan objek cloud seperti Amazon S3. Cara lainnya adalah membuat volume dengan driver yang mendukung penulisan file ke sistem penyimpanan eksternal seperti NFS atau Amazon S3.
Driver volume memungkinkan Pengguna mengabstraksi sistem penyimpanan yang mendasarinya dari logika aplikasi. Misalnya, jika service Pengguna menggunakan volume dengan driver NFS, Pengguna dapat memperbarui service untuk menggunakan driver yang berbeda, sebagai contoh untuk menyimpan data di awan, tanpa mengubah logika aplikasi.
Gunakan driver volume
Saat Pengguna membuat volume menggunakan docker volume create, atau saat Pengguna memulai container yang menggunakan volume yang belum dibuat, Pengguna dapat menentukan driver volume. Contoh berikut menggunakan vieux/sshfspengpenggunar volume, pertama saat membuat volume mandiri, dan kemudian saat memulai container yang membuat volume baru.
awal
Contoh hal ini mengasumsikan bahwa Pengguna memiliki dua node, yang pertama adalah host Docker dan dapat terhubung ke yang kedua menggunakan SSH.
Di host Docker, instal vieux/sshfsplugin:
$ docker plugin install --grant-all-permissions vieux/sshfs
Buat volume menggunakan driver volume
Contoh hal ini menentukan kata sandi SSH, tetapi jika kedua host memiliki kunci bersama yang dikonfigurasi, Pengguna dapat menghilangkan kata sandi. Setiap driver volume mungkin memiliki nol atau lebih opsi yang dapat dikonfigurasi, yang masing-masing ditentukan menggunakan sebuah -obendera.
$ docker volume create --driver vieux/sshfs \
-o sshcmd=test@node2:/home/test \
-o password=testpassword \
sshvolume
Mulai container yang membuat volume menggunakan driver volume
Contoh hal ini menentukan kata sandi SSH, tetapi jika kedua host memiliki kunci bersama yang dikonfigurasi, Pengguna dapat menghilangkan kata sandi. Setiap driver volume mungkin memiliki nol atau lebih opsi yang dapat dikonfigurasi. Jika pengpenggunar volume meminta Pengguna untuk memberikan opsi, Pengguna harus menggunakan --mountbendera untuk memasang volume, daripada -v.
$ docker run -d \
--name sshfs-container \
--volume-driver vieux/sshfs \
--mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
nginx:latest
Buat service yang membuat volume NFS
Contoh hal ini menunjukkan bagaimana Pengguna dapat membuat volume NFS saat membuat service. Contoh hal ini digunakan 10.0.0.10sebagai server NFS dan /var/docker-nfssebagai direktori yang diekspor di server NFS. Perhatikan bahwa pengpenggunar volume yang ditentukan adalah local.
NFSv3
$ docker service create -d \
--name nfs-service \
--mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
nginx:latest
NFSv4
docker service create -d \
--name nfs-service \
--mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=addr=10.0.0.10,rw,nfsvers=4,async"' \
nginx:latest
Buat volume CIFS / Samba
Pengguna dapat memasang share Samba secara langsung di buruh pelabuhan tanpa mengkonfigurasi titik pemasangan di host Pengguna.
docker volume create \
--driver local \
--opt type=cifs \
--opt device=//uxxxxx.your-server.de/backup \
--opt o=addr=uxxxxx.your-server.de,username=uxxxxxxx,password=*****,file_mode=0777,dir_mode=0777 \
--name cif-volume
Perhatikan bahwa addropsi hal ini diperlukan jika menggunakan nama host dan bukan IP sehingga pekerja galangan dapat melakukan pencarian nama host.
Cadangkan, pulihkan, atau migrasikan volume data
Volume berguna untuk pencadangan, pemulihan, dan migrasi. Gunakan --volumes-frombendera untuk membuat container baru yang memasang volume itu.
Cadangkan container
Misalnya, buat container baru bernama dbstore:
$ docker run -v /dbdata --name dbstore ubuntu /bin/bash
Kemudian pada perintah selanjutnya, kita:
- Luncurkan container baru dan pasang volume dari dbstorecontainer
- Pasang direktori host lokal sebagai /backup
- Berikan perintah yang mengubah konten dbdatavolume ke backup.tarfile di dalam /backupdirektori kami .
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Ketika perintah selesai dan kontainer berhenti, kita memiliki cadangan dbdatavolume kita .
Pulihkan kontainer dari cadangan
Dengan cadangan yang baru saja dibuat, Pengguna dapat memulihkannya ke container yang sama, atau container lain yang Pengguna buat di tempat lain.
Misalnya, buat container baru bernama dbstore2:
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
Kemudian hapus tar file cadangan di volume data container baru:
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
Pengguna dapat menggunakan teknik di atas untuk mengotomatiskan pencadangan, migrasi, dan pemulihan pengujian menggunakan alat pilihan Pengguna.
Hapus volume
Volume data Docker tetap ada setelah kontainer dihapus. Ada dua jenis volume yang perlu dipertimbangkan:
- Volume bernama memiliki sumber tertentu dari luar container, misalnya awesome:/bar.
- Volume anonim tidak memiliki sumber khusus, jadi ketika container dihapus, perintahkan daemon Docker Engine untuk menghapusnya.
Hapus volume anonim
Untuk secara otomatis menghapus volume anonim, gunakan --rmopsi. Misalnya, perintah hal ini membuat /foovolume anonim . Saat container dilepas, Mesin Docker menghapus /foovolume tetapi tidak menghapus awesomevolumenya.
$ docker run --rm -v /foo -v awesome:/bar busybox top
Hapus semua volume
Untuk menghapus semua volume yang tidak terpakai dan mengosongkan ruang:
$ docker volume prune
Comments
Post a Comment