Pengelolaan Volume

Menampilkan, memeriksa, membersihkan, dan mencadangkan volume di host.

Daftar isi

Volume adalah penyimpanan yang dikelola Docker di luar container, dan penggunaan jangka panjang menuntut perawatan seperti bagian infrastruktur lain. Topik ini membahas cara melihat daftar volume beserta pemakaiannya, menemukan volume yang tidak terpasang, dan membersihkannya melalui prune, istilah pemangkasan objek yang tidak terpakai. Pembahasan ditutup dengan pembuatan backup atau cadangan isi volume ke direktori host, yaitu mesin tempat Docker berjalan. Pola pencadangannya memakai container alpine sementara yang menjalankan tar, dan inti pola itu dijalankan langsung sebagai simulasi di akhir topik.

Melihat volume dan pemakaiannya#

Perintah dasarnya adalah docker volume ls, yang menampilkan tabel berisi kolom DRIVER dan VOLUME NAME untuk setiap volume di host. Daftar ini bertambah sendiri seiring waktu, misalnya ketika image dengan deklarasi VOLUME dijalankan tanpa volume bernama. Apabila daftar mulai panjang, opsi -f dangling=true menyaring hanya volume yang tidak terpasang ke container mana pun, yang sering disebut dangling, yaitu objek yang menggantung tanpa pemakai.

Detail satu volume dibaca dengan docker volume inspect nama_volume, dan keluarannya berupa JSON yang memuat kunci Mountpoint, tanggal pembuatan, serta labelnya. Untuk gambaran besar, docker system df meringkas pemakaian disk oleh images, containers, local volumes, dan build cache dalam satu tabel, lengkap dengan jumlah objek dan ukurannya. Angka pada baris local volumes memperlihatkan total ukuran seluruh volume, sehingga pertumbuhan data aplikasi catatan terlihat sebelum disk habis.

Kolom DRIVER hampir selalu berisi local karena Docker menulis volume pada penyimpanan lokal host, sedangkan driver lain tersedia bagi sistem berkas jaringan pada pengaturan tertentu. Daftar yang bersih memudahkan langkah pembersihan karena objek yang masih layak diselamatkan sudah terlihat sejak awal. Penamaan yang jelas pada volume bernama membuat daftar itu cepat dibaca tanpa perlu membuka detail satu per satu.

Membersihkan volume yang tidak terpakai#

Volume yang sudah diperiksa dan memang tidak terpakai dihapus dengan docker volume rm. Docker menolak menghapus volume yang masih terpasang ke sebuah container, sehingga penghapusan selalu diawali dengan memastikan tidak ada container yang memakainya. Dua perintah berikut menjadi urutan pemeriksaan dan penghapusan yang lazim.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menampilkan volume yang tidak terpasang ke container mana pun
docker volume ls -f dangling=true

# menghapus satu volume tertentu
docker volume rm catatan-data-lama

Untuk pembersihan massal, docker volume prune menghapus volume yang tidak dirujuk container mana pun. Perilakunya berubah pada Docker Engine 23.0. Sejak versi itu, perintah ini secara bawaan hanya menghapus volume anonymous, yaitu volume tanpa nama, yang tidak terpakai, sedangkan opsi --all diperlukan untuk menyertakan volume bernama yang tidak terpasang. Pada versi sebelumnya, seluruh volume yang tidak terpasang dihapus sekaligus. Opsi -f melewati pertanyaan konfirmasi, dan kombinasi --all dengan -f adalah kombinasi yang paling perlu dijaga.

Pola cadangan dengan container alpine#

Backup adalah salinan yang disimpan terpisah dari asalnya. Volume memang tersimpan di direktori milik Docker pada host, tetapi menyalin direktori Mountpoint secara langsung tidak dianjurkan karena tata letaknya milik Docker. Pola yang dianjurkan dokumentasi Docker adalah menjalankan container alpine sementara yang memasang dua lokasi sekaligus, yaitu volume data di /data dan direktori kerja host saat ini di /backup, lalu mengarsipkan isinya dengan tar.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# container alpine sementara mengarsipkan volume catatan-data ke direktori host
docker run --rm -v catatan-data:/data -v "$(pwd)":/backup alpine tar czf /backup/catatan-data.tar.gz /data

Opsi --rm menghapus container sementara itu segera setelah tar selesai, sehingga tidak ada sisa container untuk dirapikan. Berkas catatan-data.tar.gz muncul di direktori kerja host berisi salinan seluruh volume. Pemulihannya memakai pola yang sama dengan arah terbalik, yaitu container alpine sementara yang membongkar arsip ke volume kosong dengan tar xzf. Arsip itu juga siap dipindahkan ke mesin lain sebagai berkas cadangan.

Container alpine dipilih karena image-nya kecil dan sudah memuat perintah tar, sehingga container cadangan berjalan dalam hitungan detik. Dua opsi -v pada perintah yang sama memasang dua lokasi berbeda ke satu container. Container itu sendiri tidak menjalankan layanan apa pun selain tar, lalu selesai dan terhapus.

Simulasi pola cadangan dengan tar#

Sandbox tempat topik ini ditulis tidak memiliki daemon Docker, yaitu proses latar yang menjalankan seluruh pekerjaan Docker. Inti pola di atas karenanya dijalankan langsung dengan tar sebagai simulasi. Direktori data berisi tiga berkas catatan dan berperan sebagai volume. Tahapannya sama dengan yang dijalankan container alpine, yaitu mengarsipkan seluruh isi direktori, memeriksa isi arsipnya, lalu membersihkan contoh.

bash
# direktori data berperan sebagai isi volume
cd "$(mktemp -d)"
mkdir data
echo "catatan pertama" > data/catatan-1.txt
echo "catatan kedua" > data/catatan-2.txt
echo "catatan ketiga" > data/catatan-3.txt
# mengarsipkan seluruh isi direktori data dengan tar
tar czf cadangan.tar.gz data
# menampilkan isi arsip hasil cadangan, diurutkan agar mudah dibaca
tar tzf cadangan.tar.gz | sort
# membersihkan contoh setelah selesai
rm -rf data cadangan.tar.gz
text Keluaran
data/
data/catatan-1.txt
data/catatan-2.txt
data/catatan-3.txt

Empat baris di atas adalah keluaran asli dari tar tzf, yaitu entri direktori beserta ketiga berkasnya. Pada pola Docker, tar czf dijalankan oleh container alpine terhadap /data yang merupakan volume terpasang. Arsipnya ditulis ke /backup yang dipetakan ke host, alih-alih ke berkas cadangan.tar.gz di direktori kerja. Langkah tar tzf pada contoh ini adalah verifikasi tambahan yang dapat dijalankan dengan pola container yang sama. Prinsip keduanya identik, yaitu mengarsipkan sumber ke satu berkas yang dapat dibaca ulang untuk verifikasi.

Keluaran yang diurutkan dengan sort memudahkan perbandingan antar eksekusi karena isi arsip selalu terbaca dengan urutan yang sama. Pada arsip nyata, urutan entri mengikuti urutan baca sistem berkas dan tidak menjamin apa pun. Pemeriksaan yang membandingkan dua arsip karenanya perlu menyamakan urutannya terlebih dahulu.

Kesalahan umum#

Pengelolaan volume memunculkan tiga kesalahan yang berulang, dan ketiganya dapat dicegah dengan kebiasaan pemeriksaan sederhana.

  • Mencadangkan volume saat container masih menulis. tar membaca berkas pada saat tertentu, sedangkan basis data yang sedang menerima tulisan dapat menghasilkan arsip yang tidak konsisten. Cadangan basis data diambil setelah container dihentikan sementara atau dengan alat bawaan basis data itu sendiri seperti pg_dump.
  • Menganggap volume ikut hilang bersama container. Volume catatan-data tetap ada dan tetap menempati disk setelah container-nya dibuang, sedangkan docker ps tidak menunjukkan apa pun tentangnya. Pemeriksaan rutin docker volume ls -f dangling=true dan docker system df mencegah pemakaian disk yang membengkak tanpa terlihat.
  • Memasang nama volume yang berbeda. Data tidak muncul di container baru karena -v menunjuk nama lain, sehingga Docker menciptakan volume kosong dengan nama tersebut. Memeriksa nama pada docker volume ls sebelum memasang adalah pemeriksaan yang murah.

Ketiga kesalahan ini bermuara pada satu kebiasaan, yaitu memperlakukan volume sebagai objek yang bernama dan terdokumentasi, bukan penyimpanan tak terlihat di belakang container.

Ringkasan#

  • docker volume ls dengan filter dangling=true menemukan volume yang tidak terpasang, sedangkan docker volume inspect dan docker system df melengkapi detail serta ringkasan disknya.
  • docker volume rm menghapus satu volume tertentu, dan docker volume prune menghapus volume anonymous yang tak terpakai secara bawaan, dengan opsi --all untuk menyertakan volume bernama.
  • Pola cadangan menjalankan container alpine sementara yang memasang volume dan direktori host, lalu mengarsipkannya dengan tar czf ke direktori host.
  • Opsi --rm menjaga container cadangan tidak meninggalkan sisa, dan cadangan basis data paling aman diambil saat tidak ada penulisan.

Referensi#