TLDR #
Container bisa dihapus dan dibuat ulang kapan saja — tapi data di dalam volume adalah yang harus dijaga. Backup volume Docker dilakukan dengan menyalin isi volume ke file archive (tar) lewat container sementara. Artikel ini memandu backup manual, otomatisasi, dan cara restore yang benar.
Pendahuluan #
Prinsip dasar Docker: container itu ephemeral (bisa dibuang), tapi data itu permanen. Volume Docker menyimpan data di luar siklus hidup container, sehingga saat container di-update atau dihapus, datanya tetap ada.
Namun volume juga bisa hilang — salah ketik docker compose down -v, kegagalan disk, atau human error. Karena itu backup volume adalah keharusan, terutama untuk database.
Memahami Volume vs Bind Mount #
| Jenis | Lokasi | Backup |
|---|---|---|
| Named volume | Dikelola Docker (/var/lib/docker/volumes/) |
Butuh container perantara |
| Bind mount | Path host langsung | Bisa di-tar langsung dari host |
Untuk named volume, cara paling aman adalah memakai container perantara yang me-mount volume lalu menyalin isinya.
Backup Volume (Manual) #
Backup volume bernama db_data:
docker run --rm \
-v db_data:/data \
-v "$(pwd)":/backup \
alpine \
tar czf /backup/db_data-backup.tar.gz -C /data .Penjelasan:
--rm— container otomatis dihapus setelah selesai.-v db_data:/data— mount volume yang akan di-backup.-v $(pwd):/backup— mount direktori host untuk menyimpan hasil.alpine— image ringan yang punyatar.tar czf ... -C /data .— kompres isi volume.
Hasilnya file db_data-backup.tar.gz di direktori kerja.
Backup Database yang Konsisten #
Untuk database, backup saat server berjalan bisa menghasilkan data tidak konsisten. Solusi: gunakan tool dump bawaan database.
MariaDB/MySQL #
docker exec db_container \
mariadb-dump -u root -p database_name > backup.sqlPostgreSQL #
docker exec db_container \
pg_dump -U user database_name > backup.sqlDump SQL lebih aman daripada menyalin file mentah untuk database yang sedang berjalan.
Otomatisasi Backup dengan Cron #
Simpan script backup:
#!/bin/bash
# backup-volume.sh
TIMESTAMP=$(date +%F-%H%M)
docker run --rm \
-v db_data:/data \
-v /backup:/backup \
alpine \
tar czf /backup/db_data-$TIMESTAMP.tar.gz -C /data .Buat executable dan daftarkan di cron (crontab -e):
0 2 * * * /path/ke/backup-volume.shBackup jalan tiap hari jam 02:00.
Restore Volume #
Buat volume baru lalu ekstrak backup ke dalamnya:
# 1. Buat volume baru (jika belum ada)
docker volume create db_data
# 2. Restore dari backup
docker run --rm \
-v db_data:/data \
-v "$(pwd)":/backup \
alpine \
tar xzf /backup/db_data-backup.tar.gz -C /dataBackup & Restore Semua Volume #
Backup semua volume #
for v in $(docker volume ls --format '{{.Name}}'); do
docker run --rm -v "$v":/data -v /backup:/backup alpine \
tar czf "/backup/$v.tar.gz" -C /data .
doneRestore volume dari file #
for f in /backup/*.tar.gz; do
name=$(basename "$f" .tar.gz)
docker volume create "$name"
docker run --rm -v "$name":/data -v /backup:/backup alpine \
tar xzf "/backup/$f" -C /data
doneMenguji Backup #
Backup yang tidak pernah diuji adalah backup yang tidak bisa diandalkan. Uji secara berkala:
- Restore ke volume sementara.
- Mount ke container uji.
- Pastikan data terbaca.
docker volume create db_data_test
docker run --rm -v db_data_test:/data -v /backup:/backup alpine \
tar xzf /backup/db_data-backup.tar.gz -C /data
docker run --rm -v db_data_test:/data alpine ls -la /dataBest Practices #
- Backup rutin dengan cron, simpan di lokasi terpisah (bahkan off-site).
- Backup database pakai dump SQL, bukan tar file mentah.
- Uji restore secara berkala — backup baru berguna jika bisa dipulihkan.
- Simpan beberapa versi backup, bukan hanya satu terbaru.
- Enkripsi backup jika berisi data sensitif.
- Dokumentasikan prosedur restore agar cepat saat insiden.
Troubleshooting #
Volume tidak ditemukan #
Periksa nama volume:
docker volume lsRestore ke volume yang sudah berisi data #
Ekstrak tar akan menimpa file yang sama. Untuk kasus ini, lebih aman restore ke volume baru lalu tukar.
Backup besar & lambat #
Pisahkan backup per volume, dan pertimbangkan backup inkremental untuk data yang sangat besar.
Ringkasan #
| Operasi | Perintah inti |
|---|---|
| Backup | docker run --rm -v volume:/data ... tar czf |
| Restore | docker run --rm -v volume:/data ... tar xzf |
| Backup DB | docker exec ... mariadb-dump/pg_dump |
| Otomatisasi | cron + script |
Dokumentasi: docs.docker.com/storage/volumes/