Cara Backup dan Restore Docker Volume di VPS Biar Data Gak Ilang

Data di dalam Docker volume itu gampang banget ilang kalau kamu gak punya backup, apalagi kalau kamu asal jalanin docker system prune atau docker volume rm tanpa mikir dua kali. Beda sama container yang bisa dibuat ulang dari image kapan aja, data di volume itu unik, sekali ilang ya ilang beneran.

Di artikel ini kita bahas cara backup Docker volume dan restore-nya pakai cara paling simpel: manfaatin container sementara dan tar. Gak perlu install tools tambahan apapun.

Kenapa Docker Volume Perlu Dibackup Terpisah

Banyak yang salah kaprah, ngira backup image atau backup docker-compose.yml udah cukup. Padahal file konfigurasi itu cuma “resep”, sedangkan data asli (database, upload user, config aplikasi yang di-generate runtime) itu tersimpan di volume yang lokasinya biasanya di /var/lib/docker/volumes/. Kalau server kena masalah atau kamu migrasi ke VPS baru, tanpa backup volume, semua data itu bakal ketinggalan meskipun docker-compose.yml-nya kamu bawa.

Buat referensi lebih lengkap soal cara kerja volume, kamu bisa baca dokumentasi resmi Docker soal volumes.

Cek Dulu Volume yang Ada

Sebelum backup, lihat dulu volume apa aja yang ada di server kamu. Ini penting biar kamu gak salah backup volume yang bukan itu, apalagi kalau server kamu udah jalanin banyak container sekaligus dengan nama volume yang mirip-mirip.

docker volume ls

Catat nama volume yang mau kamu backup, misalnya mydata.

1. Backup Volume ke File Tar

Cara paling gampang backup Docker volume itu pakai container Alpine sementara buat compress isi volume jadi satu file tar. Kita pakai Alpine karena image-nya kecil banget (cuma beberapa MB), jadi prosesnya cepat dan gak makan banyak resource server, cocok dijalanin bahkan di VPS spek rendah.

docker run --rm 
  -v mydata:/source:ro 
  -v $(pwd)/backups:/backup 
  alpine tar czf /backup/mydata-$(date +%Y%m%d).tar.gz -C /source .

Penjelasan command-nya: -v mydata:/source:ro mount volume yang mau dibackup dalam mode read-only (biar gak sengaja keubah pas proses backup), -v $(pwd)/backups:/backup mount folder lokal buat nyimpen hasil backup-nya, dan tar czf compress semua isi volume jadi satu file .tar.gz dengan nama yang otomatis include tanggal.

Kalau volume-nya dipakai database (MySQL, PostgreSQL, dll), sebaiknya stop dulu container yang pakai volume itu sebelum backup, biar datanya konsisten dan gak ada proses tulis yang lagi jalan pas di-backup:

docker stop nama_container
# jalanin backup di sini
docker start nama_container

2. Restore Volume dari File Backup

Kalau kamu perlu restore (misal abis migrasi VPS atau data kesenggol rusak), pertama bikin volume baru dulu. Proses restore ini bisa dilakuin di server yang sama atau server baru sama sekali, selama kamu udah pindahin file backup tar.gz-nya ke server tujuan lebih dulu (pakai scp, rsync, atau cara transfer file lain).

docker volume create mydata

Terus extract isi backup ke volume itu, prosesnya cuma butuh command sekali jalan aja:

docker run --rm 
  -v mydata:/target 
  -v $(pwd)/backups:/backup 
  alpine tar xzf /backup/mydata-20260710.tar.gz -C /target

Ganti nama file tar.gz-nya sesuai backup yang mau kamu restore. Setelah selesai, tinggal jalanin container yang pakai volume itu seperti biasa, datanya bakal langsung kebaca tanpa perlu konfigurasi tambahan apapun, karena struktur file di dalam volume udah persis sama kayak sebelum di-backup.

3. Otomatisasi Pakai Cron

Biar proses backup Docker volume ini gak perlu dilakuin manual tiap hari, bikin script backup dan jadwalin pakai cron. Bikin file backup-docker.sh:

#!/bin/bash
BACKUP_DIR=/home/user/docker-backups
mkdir -p $BACKUP_DIR

docker run --rm 
  -v mydata:/source:ro 
  -v $BACKUP_DIR:/backup 
  alpine tar czf /backup/mydata-$(date +%Y%m%d).tar.gz -C /source .

# Hapus backup yang lebih lama dari 7 hari
find $BACKUP_DIR -name "mydata-*.tar.gz" -mtime +7 -delete

Kasih izin eksekusi, terus daftarin ke crontab biar jalan otomatis tiap hari jam 2 pagi:

chmod +x backup-docker.sh
crontab -e

Tambahin baris ini di crontab:

0 2 * * * /home/user/backup-docker.sh

Script di atas juga otomatis hapus backup yang lebih lama dari 7 hari, biar storage VPS kamu gak penuh sama file backup lama yang menumpuk.

Kendala yang Sering Muncul

  • Backup file-nya 0 byte atau kosong
    Biasanya karena nama volume yang kamu tulis di command salah/typo. Cek lagi pakai docker volume ls buat mastiin nama volume-nya persis.
  • Restore berhasil tapi aplikasi tetap error/data gak muncul
    Cek permission file hasil restore, kadang UID/GID di dalam container beda sama yang ada di file backup. Coba jalanin docker exec container_name chown -R user:group /path/data.
  • Cron job gak jalan otomatis
    Cek log cron dengan grep CRON /var/log/syslog, dan pastikan path di script pakai absolute path, bukan relative path, karena environment cron beda dari terminal interaktif biasa.
  • Backup database jadi corrupt/gak konsisten
    Ini biasanya karena backup dilakuin sambil database masih aktif nulis data. Selalu stop container database dulu sebelum backup, atau pakai tools backup khusus database (mysqldump, pg_dump) buat hasil yang lebih aman dibanding backup volume mentah.

Penutup

Nah, segitu aja cara backup Docker volume dan restore-nya di VPS. Metode tar ini simpel dan gak butuh tools tambahan, cocok buat kebanyakan use case. Kalau kamu udah pakai Portainer buat manage container, kamu juga bisa cek volume yang ada langsung dari dashboard-nya sebelum backup.

Yang paling penting: jangan nunggu sampai data ilang baru mikirin backup. Setup cron job-nya dari awal, biar backup jalan otomatis tanpa kamu perlu ingetin terus. Kalau ada yang error atau nyangkut, drop komentar aja bro.

Jundi Husni Mubaraq

Jundi Husni Mubaraq

Saya seorang software engineer yang sejak awal 2026 megang penuh (sendirian) tanggung jawab infrastruktur server di tempat saya kerja: deploy dan maintain server Linux Ubuntu on-premises, bangun keamanan berlapis pakai CrowdSec dan Cloudflare, kelola job scheduling dan monitoring pakai Cronicle, deploy aplikasi containerized pakai Docker, sampai ngurusin mail server korporat dari nol. Sebelumnya saya 3+ tahun jadi Software Engineer/Fullstack Developer di beberapa perusahaan, termasuk proyek skala internasional (EUDR compliance system buat Lindt & Sprungli) dan sistem rumah sakit (SIMRS, rekam medis elektronik, integrasi BPJS Kesehatan) di RS PKU Muhammadiyah Surakarta. jundi.hm ini tempat saya dokumentasiin apa yang beneran saya kerjain dan pelajarin di lapangan, bukan sekadar riset teori, S.Kom dari Universitas Duta Bangsa Surakarta jadi bekal awal, tapi yang nulis di sini adalah pengalaman langsung ngelola server production sehari-hari. Selengkapnya: https://iam.jundi.hm

Lihat Juga Nih

Selanjutnya Nih

Kasih Komentar

Email kamu gak bakal ditampilin ke publik. Kalau ada tanda ini artinya wajib diisi ya *

Rekomendasi.

Lagi Viral.