Appearance
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:16Pada 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:16pgdata 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:16Pada contoh tersebut:
pgdataadalah nama named volume yang dikelola Docker./var/lib/postgresql/dataadalah lokasi data PostgreSQL di dalam container.- Data yang ditulis PostgreSQL ke path tersebut disimpan di
pgdata. - Jika container
dbdihapus, volumepgdatatetap ada.
Informasi Volume
Untuk melihat informasi volume, termasuk lokasi yang digunakan Docker:
sh
docker volume inspect pgdataGunakan 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:16Untuk membuktikan bahwa named volume tetap menyimpan data setelah container dihapus, sekarang hapus container db:
sh
docker rm -f dbLalu, cek daftar volume:
sh
docker volume lsData 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.