Backup & Restore #
Dalam dunia container, data adalah aset paling kritikal. Container Docker bersifat ephemeral (mudah dibuat dan dihancurkan), tetapi data tidak boleh ikut hilang. Di sinilah konsep backup & restore menjadi sangat penting.
Banyak developer pemula beranggapan bahwa membackup container berarti membackup seluruh container image. Padahal, praktik yang benar adalah membackup data, bukan container-nya.
Agar lebih mudah dipahami, perhatikan diagram berikut.
+------------------+ +------------------+
| Container App | | Container DB |
| | | |
| /app | | /var/lib/mysql |
+--------+---------+ +--------+---------+
| |
| Volume |
+-----------+---------------+
|
+------+-------+
| Docker Volume|
| /data |
+------+-------+
|
Backup (tar, rsync, dump)
|
+------+------+
| Backup File |
| (.tar/.sql) |
+-------------+
Diagram ini menunjukkan bahwa backup dilakukan pada volume atau data, bukan pada container itu sendiri.
Prinsip Dasar Backup & Restore #
Sebelum masuk ke teknis, ada beberapa prinsip penting:
Container bersifat stateless
- Container bisa dihapus dan dibuat ulang kapan saja
- Jangan menyimpan data penting di filesystem container
Data harus disimpan di volume atau bind mount
- Docker Volume (recommended)
- Bind mount ke filesystem host
Backup fokus pada data
- File data
- Database dump
- Konfigurasi penting
Apa yang Perlu Dibackup di Docker? #
Tidak semua hal perlu dibackup. Berikut klasifikasinya:
Docker Image (❌ Tidak Wajib) #
- Image bisa dibuild ulang dari Dockerfile
- Simpan Dockerfile di Git, bukan di backup
Container (❌ Tidak Dianjurkan) #
- Container adalah hasil runtime
- Backup container = praktik buruk
Docker Volume (✅ Wajib) #
- Database data
- Uploaded files
- Cache penting
Config & Environment (✅ Wajib) #
.envdocker-compose.yml- File konfigurasi aplikasi
Backup Docker Volume #
Melihat Daftar Volume #
docker volume ls
Inspect Volume #
docker volume inspect my_volume
Ini akan menunjukkan lokasi volume di host.
Backup dengan Container Helper #
Cara paling umum dan aman:
docker run --rm \
-v my_volume:/data \
-v $(pwd):/backup \
alpine \
tar czf /backup/my_volume_backup.tar.gz /data
Penjelasan:
my_volume:/data→ mount volume$(pwd):/backup→ simpan hasil backup ke hosttar→ kompres seluruh data volume
Restore Volume dari Backup #
docker run --rm \
-v my_volume:/data \
-v $(pwd):/backup \
alpine \
tar xzf /backup/my_volume_backup.tar.gz -C /
Setelah ini, volume akan kembali seperti kondisi saat backup.
Backup Database di Docker #
Untuk database, backup file volume saja sering tidak cukup. Praktik terbaik adalah logical backup (dump).
Contoh: Backup MySQL #
docker exec mysql_container \
mysqldump -u root -p mydb > mydb_backup.sql
Restore MySQL #
docker exec -i mysql_container \
mysql -u root -p mydb < mydb_backup.sql
Keuntungan dump database:
- Konsisten
- Mudah dipindahkan
- Tidak tergantung filesystem internal DB
Backup dengan Docker Compose #
Struktur umum:
project/
├── docker-compose.yml
├── .env
├── backups/
└── volumes/
Backup volume via service sementara:
services:
backup:
image: alpine
volumes:
- db_data:/data
- ./backups:/backup
command: tar czf /backup/db_data.tar.gz /data
volumes:
db_data:
Jalankan:
docker compose run --rm backup
Automasi Backup #
Di production, backup harus otomatis.
Opsi Umum: #
- Cron di host
- Cron container
- CI/CD pipeline
- Backup ke cloud storage (S3, GCS)
Contoh cron di host:
0 2 * * * docker run --rm \
-v db_data:/data \
-v /backup:/backup \
alpine tar czf /backup/db_$(date +\%F).tar.gz /data
Kesalahan Umum #
- Menyimpan data langsung di container
- Backup image sebagai pengganti data
- Tidak pernah mengetes restore
- Backup manual tanpa automasi
Best Practice #
- Selalu gunakan volume untuk data
- Backup data, bukan container
- Gunakan database dump untuk DB
- Uji proses restore secara berkala
- Simpan backup di lokasi berbeda (off-site)
- Enkripsi backup untuk data sensitif
- Dokumentasikan prosedur restore
Penutup #
Backup & restore di Docker bukan soal Docker-nya, tetapi soal mengelola data dengan benar. Dengan memahami bahwa container bersifat sementara dan data harus dipisahkan melalui volume, proses backup menjadi sederhana, aman, dan scalable.
Jika prinsip ini diterapkan sejak awal, migrasi server, recovery insiden, hingga scaling aplikasi akan jauh lebih mudah dan minim risiko.
Ingat: Container bisa dibuat ulang, data tidak.