Volume Docker digunakan untuk menyimpan data persisten di luar container Anda. Mereka mengizinkan file konfigurasi, database, dan cache yang digunakan oleh aplikasi Anda untuk hidup lebih lama dari instance container individual.
Volume dapat dipasang saat Anda memulai wadah dengan docker run
perintah -v
bendera. Ini dapat mereferensikan volume bernama atau mengikat mount direktori Host ke dalam sistem file penampung.
Dimungkinkan juga untuk menentukan volume pada waktu pembuatan gambar dengan menggunakan VOLUME
instruksi di Dockerfiles Anda. Mekanisme ini menjamin bahwa container yang dimulai dari image akan memiliki penyimpanan persisten yang tersedia. Dalam artikel ini Anda akan mempelajari cara menggunakan instruksi ini dan kasus penggunaan yang masuk akal.
Mendefinisikan Volume Di Dockerfiles
File Docker VOLUME
instruksi membuat titik pemasangan volume pada jalur wadah yang ditentukan. Volume akan dipasang dari sistem file host Docker Anda setiap kali wadah dimulai.
Dockerfile dalam contoh berikut mendefinisikan volume pada /opt/app/data
jalur kontainer. Wadah baru akan secara otomatis memasang volume ke direktori.
FROM ubuntu:22.04 VOLUME /opt/app/data
Bangun gambar Anda sehingga Anda dapat menguji pemasangan volume:
$ docker build -t volumes-test:latest .
Ambil daftar volume yang ada sebagai referensi:
$ docker volume ls DRIVER VOLUME NAME local demo-volume
Sekarang mulai wadah menggunakan gambar pengujian Anda:
$ docker run -it volume-test:latest root@07be7bde68c2:/#
Ulangi docker volume ls
perintah untuk mengonfirmasi volume baru telah dibuat:
$ docker volume ls DRIVER VOLUME NAME local 3198bf857fdcbb8758c5ec7049f2e31a40b79e329f756a68725d83e46976b7a8 local demo-volume
Keluar dari cangkang wadah uji Anda sehingga wadah berhenti:
root@07be7bde68c2:/# exit exit
Volume dan datanya akan terus bertahan:
$ docker volume ls DRIVER VOLUME NAME local 3198bf857fdcbb8758c5ec7049f2e31a40b79e329f756a68725d83e46976b7a8 local demo-volume
Anda dapat mendefinisikan beberapa volume dalam satu instruksi sebagai string yang dibatasi spasi atau array JSON. Kedua formulir berikut membuat dan memasang dua volume unik saat kontainer mulai:
VOLUME /opt/app/data /opt/app/config # OR VOLUME ["/opt/app/data", "/opt/app/config"]
Mengisi Konten Volume Awal
Volume secara otomatis diisi dengan konten yang ditempatkan ke direktori mount dengan langkah-langkah pembuatan gambar sebelumnya:
FROM ubuntu:22.04 COPY default-config.yaml /opt/app/config/default-config.yaml VOLUME /opt/app/config
Dockerfile ini mendefinisikan volume yang akan diinisialisasi dengan yang ada default-config.yaml
mengajukan. Wadah akan dapat membaca /opt/app/config/default-config.yaml
tanpa harus memeriksa apakah file tersebut ada.
Perubahan pada konten volume dibuat setelah itu VOLUME
instruksi akan dibuang. Dalam contoh ini, default-config.yaml
file masih tersedia setelah kontainer dimulai karena rm
perintah datang setelah /opt/app/config
ditandai sebagai volume.
FROM ubuntu:22.04 COPY default-config.yaml /opt/app/config/default-config.yaml VOLUME /opt/app/config RUN rm /opt/app/config/default-config.yaml
Mengganti Instruksi VOLUME Saat Memulai Kontainer
Volume yang dibuat oleh VOLUME
instruksi secara otomatis dinamai dengan hash unik yang panjang. Tidak mungkin mengubah namanya sehingga sulit untuk mengidentifikasi volume mana yang secara aktif digunakan oleh wadah Anda.
Anda dapat mencegah volume ini muncul dengan menentukan volume secara manual pada wadah Anda dengan docker run -v
seperti biasanya. Perintah berikut secara eksplisit memasang volume bernama ke wadah /opt/app/config
direktori, membuat Dockerfile’s VOLUME
instruksi berlebihan.
$ docker run -it -v config:/opt/app/config volumes-test:latest
Kapan Anda Harus Menggunakan Instruksi VOLUME?
VOLUME
instruksi dapat membantu dalam situasi di mana Anda ingin menegakkan bahwa ketekunan digunakan, seperti dalam gambar yang mengemas server database atau penyimpanan file. Menggunakan VOLUME
instruksi membuatnya lebih mudah untuk memulai wadah tanpa mengingat -v
bendera untuk diterapkan.
VOLUME
juga berfungsi sebagai dokumentasi jalur kontainer yang menyimpan data persisten. Menyertakan instruksi ini di Dockerfile Anda memungkinkan siapa pun untuk menentukan di mana container Anda menyimpan datanya, meskipun mereka tidak terbiasa dengan aplikasi Anda.
VOLUME Jebakan
VOLUME
bukannya tanpa kekurangan. Masalah terbesarnya adalah bagaimana ia berinteraksi dengan pembuatan gambar. Menggunakan gambar dengan VOLUME
instruksi sebagai gambar dasar build Anda akan berperilaku tidak terduga jika Anda mengubah konten dalam titik pemasangan volume.
Gotcha dari sebelumnya masih berlaku: efek dari perintah setelah VOLUME
instruksi akan dibuang. Sebagai VOLUME
akan berada di gambar dasar, semua yang ada di Dockerfile Anda muncul setelah instruksi dan Anda tidak dapat mengubah konten default direktori. Di balik layar, memulai wadah sementara untuk build akan membuat volume baru di host Anda yang dihancurkan di akhir build. Perubahan tidak akan disalin kembali ke gambar keluaran.
Pemasangan volume otomatis dapat menjadi masalah dalam situasi lain juga. Terkadang pengguna mungkin lebih suka memulai wadah sementara tanpa volume apa pun, mungkin untuk tujuan evaluasi atau debugging. VOLUME
menghilangkan kemungkinan ini karena tidak mungkin untuk menonaktifkan tunggangan otomatis. Hal ini menyebabkan banyak volume redundan menumpuk di host jika kontainer yang menggunakan instruksi dijalankan secara teratur.
Ringkasan
file docker VOLUME
instruksi memungkinkan pemasangan volume ditentukan pada waktu pembuatan gambar. Mereka menjamin bahwa container yang dimulai dari image akan memiliki penyimpanan data persisten yang tersedia, bahkan jika pengguna mengabaikan docker run
perintah -v
bendera.
Perilaku ini dapat berguna untuk gambar di mana ketekunan sangat penting atau banyak volume diperlukan. Namun VOLUME
instruksi juga mematahkan beberapa harapan pengguna dan memperkenalkan perilaku unik sehingga perlu ditulis dengan hati-hati. Menyediakan file Docker Compose yang secara otomatis membuat volume yang diperlukan seringkali merupakan solusi yang lebih baik.