Volume Bernama

Volume yang dikelola Docker sebagai penyimpanan persisten dan pola pemasangannya ke service basis data.

Daftar isi

Volume adalah mekanisme utama Docker untuk data persisten, yaitu data yang tetap ada melewati umur container. Topik ini membahas pembuatan volume bernama, pemeriksaan detailnya, pemasangan ke container basis data PostgreSQL, serta perbedaan volume bernama dengan volume anonymous, yaitu volume tanpa nama. Contoh yang dibangun memakai image postgres:18-alpine untuk basis data aplikasi catatan. Setelah volume terpasang dengan benar, isinya tetap utuh meskipun container yang memakainya diganti berkali-kali.

Volume sebagai penyimpanan milik Docker#

Volume adalah direktori yang dibuat dan dikelola oleh daemon Docker, proses latar yang menjalankan seluruh pekerjaan Docker pada host, yaitu mesin tempat Docker terpasang. Isinya tersimpan di bagian penyimpanan milik Docker, yaitu /var/lib/docker/volumes/ pada Linux, dan tidak dimaksudkan untuk disentuh proses lain di luar Docker. Karena dikelola Docker, volume dapat dibuat, diperiksa, dan dihapus melalui perintah docker volume tanpa perlu mengetahui tata letak berkasnya.

Umur volume terpisah dari umur container. Container dibuat dan dibuang sesering mungkin, sedangkan volume tetap ada sampai dihapus secara eksplisit. Dua sifat itu menjadikan volume cocok untuk berkas basis data. Image postgres:18-alpine sendiri sudah menyatakan kebutuhan penyimpanannya melalui deklarasi VOLUME pada Dockerfile, sehingga berkas basis data selalu ditulis ke penyimpanan yang terpisah dari lapisan tulis.

Dokumentasi Docker menempatkan volume sebagai jenis penyimpanan yang paling mudah dipakai karena pembuatan dan penghapusannya ditangani Docker, sedangkan pembaca cukup mengurus namanya. Lokasi yang terpusat pada satu direktori induk juga membuat aturan cadangan menjadi seragam. Seluruh volume dapat diperlakukan dengan cara yang sama tanpa menyesuaikan diri pada struktur direktori masing-masing aplikasi.

Membuat dan memeriksa volume#

Volume bernama dibuat dengan docker volume create disertai nama yang dipilih sendiri. Nama catatan-data dipakai sebagai contoh sepanjang topik ini karena langsung menyatakan pemiliknya. Tiga perintah berikut membuat volume, menampilkan daftar volume, lalu membaca detailnya.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# membuat volume bernama untuk data aplikasi catatan
docker volume create catatan-data

# menampilkan daftar seluruh volume di host
docker volume ls

# menampilkan detail volume catatan-data dalam bentuk JSON
docker volume inspect catatan-data

docker volume create menampilkan nama volume yang baru dibuat, sedangkan docker volume ls menampilkan tabel berisi kolom DRIVER dan VOLUME NAME untuk setiap volume di host. docker volume inspect mencetak detail satu volume sebagai JSON, dan kunci yang paling penting adalah Mountpoint, yang pada Linux berisi /var/lib/docker/volumes/catatan-data/_data. Di situlah berkas data benar-benar berada. Kunci lain seperti CreatedAt dan Scope melengkapi informasi tersebut. Keluaran lengkap dapat berbeda antar versi Docker, sehingga cara membacanya yang paling andal adalah menjalankan perintahnya sendiri.

Perintah-perintah di atas tidak memerlukan container yang sedang berjalan. Volume dapat dibuat lebih dahulu sebelum container apa pun memakainya, dan pemeriksaannya dapat dilakukan kapan saja. Kebiasaan membuat volume bernama terlebih dahulu berguna pada lingkungan produksi karena volume dengan nama yang akan dipasang sudah pasti tersedia sebelum container pertama membutuhkannya. Apabila volume dibiarkan dibuat otomatis pada pemasangan pertama, salah ketik pada nama akan menciptakan volume baru yang kosong tanpa pesan error, sehingga data tersimpan pada volume yang tidak direncanakan.

Memasang volume ke container#

Volume dihubungkan ke container melalui mount, proses menempelkan penyimpanan ke sebuah jalur di dalam container. Opsi -v menerima bentuk nama_volume:jalur_container, sehingga -v catatan-data:/var/lib/postgresql memasang volume bernama ke jalur data PostgreSQL. Perintah berikut menjalankan basis data aplikasi catatan secara lengkap.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menjalankan PostgreSQL dengan volume bernama untuk seluruh datanya
docker run -d \
  --name catatan-db \
  -e POSTGRES_PASSWORD=rahasia-catatan \
  -e POSTGRES_DB=catatan \
  -v catatan-data:/var/lib/postgresql \
  postgres:18-alpine

Opsi -e mengirim variabel lingkungan yang dibaca image PostgreSQL saat pertama kali dijalankan. POSTGRES_PASSWORD adalah kata sandi wajib bagi pengguna postgres, sedangkan POSTGRES_DB memerintahkan pembuatan basis data bernama catatan. Pada container pertama, isi volume masih kosong, sehingga proses inisialisasi image membuat berkas basis data baru langsung di dalam volume. Tanda garis miring terbalik di akhir baris memecah satu perintah panjang menjadi beberapa baris agar mudah dibaca.

Jalur /var/lib/postgresql pada contoh mengikuti deklarasi terbaru tersebut. Perubahan ini dapat diverifikasi pada Dockerfile resmi image postgres:18-alpine. Kebiasaan memeriksa deklarasi VOLUME sebuah image sebelum memasang volume mencegah kesalahan serupa pada image lain.

Volume anonymous dan volume bernama#

Menulis -v dengan jalur container tanpa nama, misalnya -v /var/lib/postgresql, membuat Docker menciptakan volume anonymous, volume tanpa nama yang ditandai kode acak panjang. Volume anonymous memenuhi deklarasi VOLUME image secara otomatis dan cocok untuk container uji coba yang datanya boleh dibuang. Volume bernama seperti catatan-data memberi kontrol penuh, karena namanya mudah dirujuk, dicadangkan, dan dipasang kembali. Tabel berikut menyandingkan keduanya.

AspekVolume anonymousVolume bernama
NamaKode acak panjang dari DockerDipilih sendiri, misalnya catatan-data
Cara terbentukOtomatis saat -v hanya memuat jalur containerMelalui docker volume create atau -v dengan nama
Kemudahan dipakai ulangSulit dilacak di antara volume lainMudah dirujuk oleh container baru
KecocokanData sementara yang boleh dibuangData yang harus bertahan

Pilihan nama juga merupakan bentuk dokumentasi. Nama catatan-data langsung menyatakan pemiliknya, sehingga daftar docker volume ls tetap terbaca bermakna ketika jumlah volume bertambah. Seluruh contoh pada modul ini memakai volume bernama karena aplikasi catatan menuntut datanya dapat dipakai ulang oleh container mana pun yang menggantikan container sebelumnya.

Data bertahan melewati penggantian container#

Kegunaan volume terlihat saat container diganti. Perintah berikut menghapus container basis data beserta lapisan tulisnya, sedangkan volume catatan-data tidak tersentuh.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menghapus container, sedangkan volume catatan-data tetap ada
docker rm -f catatan-db

Menjalankan ulang perintah docker run pada bagian Memasang volume ke container memunculkan container baru yang terhubung ke volume yang sama. Proses inisialisasi image mendeteksi berkas basis data yang sudah terisi, sehingga langkah pembuatan awal dilewati dan basis data catatan langsung siap dipakai. Yang hilang dari container lama hanyalah lapisan tulis yang tidak terpakai.

Sifat ini memisahkan dua hal yang sebelumnya menyatu. Container kini bebas diganti setiap rilis, diganti versi image, atau dipindahkan, sedangkan data tetap berada di tempat yang sama. Satu volume juga dapat dipasang ke lebih dari satu container bila dibutuhkan, misalnya untuk keperluan cadangan, meskipun penulisan bersamaan pada basis data tetap menjadi urusan PostgreSQL itu sendiri.

Dari sisi pengguna aplikasi catatan, penggantian container tidak terasa sama sekali. Catatan yang ditulis sebelum penggantian tetap muncul setelahnya, karena yang diganti hanya tempat proses berjalan, bukan tempat data disimpan. Inilah sifat yang dicari pada penyimpanan basis data, yaitu pergantian container tidak menimbulkan perubahan pada data.

Ringkasan#

  • Volume adalah direktori yang dikelola Docker pada /var/lib/docker/volumes di Linux, dengan umur terpisah dari container yang memasangnya.
  • Opsi -v catatan-data:/var/lib/postgresql memasang volume bernama ke container, dan image postgres:18-alpine menaruh datanya di sana setelah dikonfigurasi melalui POSTGRES_PASSWORD dan POSTGRES_DB.
  • Volume anonymous terbentuk tanpa nama saat -v hanya memuat jalur container, sedangkan volume bernama mudah dirujuk dan dicadangkan.
  • Container yang dihapus dan diganti tidak menyentuh isi volume, sehingga container baru memakai ulang data yang sama.

Referensi#