Lewati ke konten

4. Volume & Data

Perubahan file di dalam container disimpan di lapisan milik container itu sendiri. Begitu container dihapus, semua perubahan ikut hilang. Ini disengaja: container boleh dibuang dan dibuat ulang kapan saja. Data yang perlu bertahan — database, file upload, konfigurasi — harus disimpan di luar container.

Docker menyediakan dua cara:

Named volume Bind mount
Lokasi data dikelola Docker (/var/lib/docker/volumes/...) folder pilihanmu di host
Penulisan -v data-web:/path -v ~/situs:/path atau -v /opt/app/html:/path
Cocok untuk database, data aplikasi file yang ingin kamu edit langsung: HTML, konfigurasi
Terminal window
docker volume create data-web
docker run -d --name web1 -p 8081:80 \
-v data-web:/usr/share/nginx/html nginx
docker volume ls

Saat volume kosong dipasang pertama kali, Docker menyalin isi folder tujuan dari image ke volume. Setelah itu, volume hidup terpisah dari container: hapus container, buat container baru dengan volume yang sama, datanya tetap ada.

Terminal window
docker run -d --name web3 -p 8082:80 \
-v ~/situs:/usr/share/nginx/html nginx

Folder ~/situs di host dipakai langsung oleh container. Ubah file di host, hasilnya langsung terlihat tanpa restart. Halaman utama GSTNV-LAB dijalankan dengan cara ini.

Tambahkan :ro di akhir (-v ~/situs:/usr/share/nginx/html:ro) agar container hanya bisa membaca, tidak bisa mengubah file di host.

Lab: Menyimpan data dengan volume
Misi 0/7
  1. Buat volume bernama data-web.
    Petunjukdocker volume create data-web
  2. Jalankan nginx web1 di port 8081 dengan volume data-web di /usr/share/nginx/html.
    Petunjukdocker run -d --name web1 -p 8081:80 -v data-web:/usr/share/nginx/html nginx
  3. Ubah index.html di dalam container lewat docker exec.
    Petunjukdocker exec web1 sh -c "echo '<h1>Data saya</h1>' > /usr/share/nginx/html/index.html"
  4. Hapus container web1. Volume-nya tetap ada.
    Petunjukdocker rm -f web1
  5. Buat container baru web2 dengan volume yang sama, lalu buktikan dengan curl localhost:8081 bahwa datanya masih ada.
    Petunjukdocker run -d --name web2 -p 8081:80 -v data-web:/usr/share/nginx/html nginx lalu curl localhost:8081
  6. Pakai bind mount: sajikan folder ~/situs milikmu lewat container web3 di port 8082.
    Petunjukdocker run -d --name web3 -p 8082:80 -v ~/situs:/usr/share/nginx/html nginx
  7. Ubah ~/situs/index.html dari host, lalu curl localhost:8082 — perubahannya langsung terlihat.
    Petunjukecho '<h1>Diubah dari host</h1>' > ~/situs/index.html lalu curl localhost:8082