Skip to content

Docker Volume

Filesystem dan data di dalam container hilang saat container dihapus. App yang butuh data persisten (database) atau file dari laptop (source code) harus memakai volume atau bind mount.

Jenis volume

Docker memiliki dua jenis volume:

  • Anonymous volume: volume tanpa nama yang kamu tentukan. Docker akan membuatkan nama atau identifier secara otomatis.
  • Named volume: volume yang kamu beri nama sendiri, misalnya pgdata.

Anonymous Volume

Contoh anonymous volume:

sh
docker run -d \
  -v /var/lib/postgresql/data \
  postgres:16

Pada contoh tersebut, Docker membuat volume tanpa kamu menentukan namanya. Volume ini tetap dikelola Docker, tetapi lebih sulit dikenali dan digunakan kembali karena memiliki nama yang tidak jelas.

Named Volume

Contoh named volume:

sh
docker run -d \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

pgdata adalah nama yang kamu pilih sendiri. Kamu bebas menggunakan nama apa pun yang jelas dan sesuai kebutuhan, misalnya project-db-data atau postgres16-data.

Jadi, baik Anonymous Volume maupun Named Volume, keduanya disimpan di storage laptop atau server, tetapi lokasi penyimpanan ini dikelola oleh Docker. Kamu tidak perlu menentukan atau mengubah lokasi tersebut secara langsung.

Pada lesson ini, kita lebih banyak menggunakan named volume karena namanya mudah diingat, mudah digunakan kembali, dan mudah dikelola melalui Docker CLI.

Tentang Path

Path seperti /var/lib/postgresql/data adalah path di dalam container, bukan path di laptop. Saat volume di-mount, Docker menghubungkan Docker Volume dengan path tersebut:

Loading diagram...

Format mount named volume:

sh
-v <nama-volume>:<path-di-dalam-container>

Contoh:

sh
docker run -d --name db \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

Pada contoh tersebut:

  • pgdata adalah nama named volume yang dikelola Docker.
  • /var/lib/postgresql/data adalah lokasi data PostgreSQL di dalam container.
  • Data yang ditulis PostgreSQL ke path tersebut disimpan di pgdata.
  • Jika container db dihapus, volume pgdata tetap ada.

Informasi Volume

Untuk melihat informasi volume, termasuk lokasi yang digunakan Docker:

sh
docker volume inspect pgdata

Gunakan informasi tersebut saat debugging. Jangan mengubah file secara langsung dari lokasi storage Docker. Kelola volume melalui Docker CLI.

Bind mount vs named volume

Keduanya sama-sama bisa menyediakan data atau file untuk container. Perbedaan utamanya ada pada cara penyimpanan dikelola dan use case-nya.

Bind mount

  • Deskripsi: folder atau file dari laptop di-mount ke path tertentu di dalam container.
  • Lokasi penyimpanan: kamu menentukan dan mengetahui lokasi folder di laptop, misalnya ./html.
  • Use case: source code saat development, atau file config yang perlu kamu edit langsung dari laptop.

Named volume

  • Deskripsi: volume yang diberi nama dan dikelola oleh Docker.
  • Lokasi penyimpanan: disimpan di storage Docker. Kamu tidak perlu mengetahui path fisiknya di laptop atau server.
  • Use case: data database atau data aplikasi yang harus tetap ada meskipun container dihapus.

Gunakan bind mount jika kamu perlu mengakses dan mengubah file langsung dari laptop. Gunakan named volume jika Docker yang sebaiknya mengelola data tersebut.

Contoh Bind mount

Jalankan Nginx, tapi page-nya dari folder html di laptop:

sh
mkdir -p html
echo '<h1>Dari laptop</h1>' > html/index.html

docker run -d --name web -p 8080:80 \
  -v "$(pwd)/html:/usr/share/nginx/html:ro" \
  nginx:1.27-alpine

-v laptop:container menghubungkan folder laptop ke folder di dalam container. :ro berarti read-only di dalam container. Opsi ini bagus untuk file static.

Ubah html/index.html, refresh browser. Tanpa rebuild image.

Di Windows PowerShell, format path-nya berbeda. Gunakan path absolut atau Docker Desktop yang sudah mendukung bind mount dari folder project.

Contoh Named volume

sh
docker volume create pgdata

docker run -d --name db -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

Untuk membuktikan bahwa named volume tetap menyimpan data setelah container dihapus, sekarang hapus container db:

sh
docker rm -f db

Lalu, cek daftar volume:

sh
docker volume ls

Data masih ada di volume pgdata. Container baru dengan -v pgdata:/var/lib/postgresql/data akan dapat melihat data yang sama.

TIP

Command docker rm -f db hanya menghentikan dan menghapus container bernama db. Command ini tidak menghapus named volume pgdata, sehingga data di dalam volume tetap ada.

Untuk menghapus volume dan datanya, kamu harus menjalankan docker volume rm pgdata secara terpisah. Jangan menjalankan command tersebut di mesin pekerjaan kecuali kamu yakin datanya boleh hilang.