Skip to content
VDS · Docker dan kontainer

Volume: di mana data kontainer sebenarnya disimpan

Perbedaan volume bernama dengan bind mount, lokasi fisiknya di disk, dan cara agar database tidak hilang saat kontainer dibuat ulang.

Diperbarui 23 Agustus 2026

Sebuah container bersifat sekali pakai. Semua yang ditulis di dalamnya ikut hilang bersamanya. Data harus berada di luar, dan hanya ada dua cara: named volume dan bind mount direktori host.

Dua cara dan kapan menggunakannya

services:
  db:
    image: postgres:17
    volumes:
      - db-data:/var/lib/postgresql/data   # named volume
  app:
    image: nginx:1.27
    volumes:
      - ./site:/usr/share/nginx/html:ro    # directory bind mount
      - ./nginx.conf:/etc/nginx/nginx.conf:ro

volumes:
  db-data:

Named volume dibuat dan disimpan oleh Docker sendiri, di /var/lib/docker/volumes/<name>/_data. Izin di dalamnya diatur otomatis oleh image. Inilah cara menyimpan basis data dan state layanan internal.

Bind mount direktori adalah path biasa di disk mesin. Inilah cara Anda menyediakan file konfigurasi, aset statis website, dan sertifikat: semuanya mudah diedit di editor dan disimpan di repositori.

Flag :ro membuat mount menjadi read-only. Gunakan di mana pun container tidak memerlukan akses tulis — ini perlindungan yang murah.

Di mana semuanya disimpan secara fisik

docker volume ls
docker volume inspect db-data
docker inspect -f '{{json .Mounts}}' <container> | python3 -m json.tool
sudo du -sh /var/lib/docker/volumes/* | sort -h | tail

Perintah terakhir adalah hal pertama yang harus dijalankan saat ruang disk habis. Detail selengkapnya: ruang disk.

docker compose down -v dan docker volume prune menghapus volume secara permanen. Volume berisi basis data terlihat “tidak terpakai” selama container berhenti dan ikut terkena pembersihan. Sebelum membersihkan, lihat daftarnya: docker volume ls -f dangling=true.

Menyalin dan migrasi

Menyalin named volume dengan container sekali pakai:

docker run --rm -v db-data:/from -v $(pwd):/to alpine \
  tar czf /to/db-data.tar.gz -C /from .

Memulihkan:

docker volume create db-data
docker run --rm -v db-data:/to -v $(pwd):/from alpine \
  tar xzf /from/db-data.tar.gz -C /to

Untuk basis data, metode ini hanya cocok saat container berhenti: penyalinan tingkat file pada basis data yang sedang berjalan bisa menghasilkan data yang tidak konsisten. Lebih baik lakukan dump menggunakan alat bawaan basis data — pg_dump, mysqldump. Lihat apa saja yang perlu disalin.

Izin

Kesalahan paling umum pada bind mount adalah ketidakcocokan owner. Di dalam container, proses berjalan dengan UID-nya sendiri, dan file yang dibuat host sebagai root tidak dapat diakses olehnya.

docker compose exec app id
sudo chown -R 1000:1000 ./data

Banyak image menerima variabel PUID/PGID — ini lebih praktis daripada mengubah owner direktori.

Kesalahan umum

  • Data ditulis di dalam container. Anda membuat ulang container saat pembaruan — datanya hilang. Periksa: docker diff <container> akan menunjukkan apa yang berubah di filesystem-nya; penulisan besar di sana adalah tanda peringatan.
  • Anda melakukan bind mount direktori ke path yang tidak kosong di dalam image. Isi image menjadi tersembunyi, dan layanan tidak dapat menemukan file-nya.
  • Path relatif pada bind mount. Path ini diselesaikan dari direktori yang berisi compose.yaml, bukan dari direktori saat ini. Menjalankannya dari lokasi lain akan membuat direktori kosong baru.
  • Volume terlupakan saat instalasi ulang OS. Instalasi ulang menghapus seluruh disk. Salinannya harus disimpan bukan di mesin ini.