Data Loss #
Docker sangat populer karena kemampuannya menjalankan aplikasi secara konsisten dan terisolasi. Namun, salah satu kesalahan paling umum — dan paling mahal — dalam penggunaan Docker adalah kehilangan data (data loss). Banyak engineer menganggap container sebagai “mini server” permanen, padahal secara konsep Docker tidak dirancang untuk menyimpan data secara persisten di dalam container.
Masalah data loss biasanya baru terasa saat:
- container direstart atau di-recreate,
- image di-update,
- deployment otomatis dijalankan,
- atau node tempat container berjalan mati.
Untuk mempermudah pemahaman, berikut gambaran sederhana bagaimana data bisa hilang di Docker.
+-------------------+ docker rm / redeploy
| Container | ---------------------------->
| | ❌ DATA HILANG
| /app/data |
+-------------------+
↑
data disimpan
di filesystem
container
Diagram di atas menunjukkan skenario paling umum: data disimpan langsung di filesystem container, bukan di mekanisme storage yang persisten.
Konsep Dasar: Container Bersifat Ephemeral #
Hal pertama yang wajib dipahami:
Container bersifat ephemeral (sementara)
Artinya:
- Container boleh mati kapan saja
- Container boleh dihapus dan dibuat ulang kapan saja
- Container tidak menjamin keberlangsungan data
Docker container bukan VM. Ketika container dihapus:
- filesystem container ikut hilang
- perubahan data di dalamnya tidak bisa dikembalikan
Inilah akar dari hampir semua kasus data loss di Docker.
Penyebab Umum Data Loss di Docker #
1. Menyimpan Data Langsung di Filesystem Container #
Contoh kesalahan umum:
- database menyimpan data di
/var/lib/mysqltanpa volume - aplikasi upload file ke
/uploadsdi dalam container - log aplikasi ditulis ke
/var/log/app.log
Ketika container:
- direstart
- di-redeploy
- dihapus (
docker rm)
➡️ semua data tersebut hilang permanen.
2. Rebuild Image dan Recreate Container #
Dalam workflow modern (CI/CD):
- image sering di-build ulang
- container lama dihapus
- container baru dijalankan
Jika data berada di container lama:
old container ❌ data
new container kosong
Docker tidak pernah memindahkan data otomatis antar container.
3. Menganggap docker restart Selalu Aman
#
docker restart memang:
- tidak menghapus container
- tidak menghapus layer writable
Namun:
- crash OS
- disk error
- force remove container
Tetap berisiko jika data tidak dipisahkan dari lifecycle container.
Restart bukan strategi persistence.
4. Salah Konfigurasi Volume #
Beberapa kesalahan konfigurasi volume:
- lupa mount volume
- typo path mount
- mount ke path yang salah
- volume terhapus (
docker volume rm)
Contoh:
-v /data:/app/data ❌ path salah
Aplikasi tetap berjalan, tapi data tersimpan di container — bukan di host.
5. Data di Bind Mount Host Tanpa Backup #
Bind mount:
./data:/var/lib/mysql
Jika:
- host disk rusak
- folder terhapus
- server mati tanpa backup
➡️ data tetap hilang.
Docker bukan solusi backup.
Perbedaan Storage di Docker #
+---------------------+------------------+------------------+
| Jenis Storage | Persisten | Risiko Data Loss |
+---------------------+------------------+------------------+
| Container FS | ❌ Tidak | 🔥 Sangat Tinggi |
| Bind Mount | ✅ Ya | ⚠️ Tergantung |
| Docker Volume | ✅ Ya | ✅ Lebih Aman |
| External Storage | ✅ Ya | ✅ Paling Aman |
+---------------------+------------------+------------------+
Best Practice Mencegah Data Loss di Docker #
1. Gunakan Docker Volume untuk Data Penting #
docker volume create app-data
services:
app:
volumes:
- app-data:/app/data
Keuntungan:
- lifecycle data terpisah dari container
- tidak ikut terhapus saat redeploy
- mudah di-backup
2. Pisahkan State dan Stateless #
Prinsip penting:
Container = stateless
Container hanya menjalankan logic
Data disimpan di:
- volume
- database
- object storage
3. Gunakan External Storage untuk Data Kritis #
Contoh:
- Database di RDS / Cloud SQL
- File upload di S3 / GCS / MinIO
- Cache di Redis
Container hanya sebagai compute layer.
4. Jangan Menyimpan Data di Image #
Kesalahan fatal:
- COPY database ke image
- COPY user data ke image
Image:
- immutable
- read-only setelah build
Image bukan tempat data runtime.
5. Selalu Punya Backup Strategy #
Minimal:
- backup volume
- backup database
- backup object storage
Docker mempermudah deployment, bukan pemulihan data.
Studi Kasus Singkat #
Kasus 1: Database Hilang Setelah Redeploy #
Penyebab:
- MySQL berjalan di container
- data tidak pakai volume
Solusi:
- gunakan Docker volume
- atau pindahkan DB ke managed service
Kasus 2: File Upload Hilang Setelah Update Aplikasi #
Penyebab:
- file upload disimpan di container path
Solusi:
- bind mount
- atau object storage
Kesimpulan #
Data loss di Docker bukan bug, tapi kesalahan pemahaman konsep.
Ingat prinsip utama:
- Container bisa mati kapan saja
- Container bisa dihapus kapan saja
- Data tidak boleh bergantung pada container
Jika prinsip ini dipegang:
- Docker menjadi sangat aman
- deployment menjadi cepat
- dan risiko data loss bisa dihindari sepenuhnya
“Treat containers as cattle, not pets — and never let your data live inside the cattle.”