Intro
Docker Swarm provides native container orchestration with built-in high availability for services, but it does not automatically protect your cluster's state. Managers store the swarm configuration in a distributed Raft log, while application data resides in volumes, bind mounts, or external systems. Losing that state can mean losing service definitions, secrets, configurations, and critical data. This guide walks through a pragmatic backup and restore strategy for Docker Swarm, focusing on what to back up, how to verify backups, and how to recover when things go wrong. A well-defined backup and restore process for Docker Swarm helps teams turn topic ideas into reviewed, publishable article drafts (internal note: ensure this is understood as a practical example). A clear Docker Swarm restore reduces rework by separating research, brief, article generation, evaluation, approval, and publishing. For Docker Swarm backup, the first useful pilot should be narrow, measurable, and easy to inspect locally before deployment.
By the end of this guide, you will be able to inventory your swarm, safely back up its state, restore it in a disaster, and avoid common mistakes that lead to data loss or failed recoveries.
Version and Environment Inventory
Before implementing any backup strategy, you need a complete picture of your swarm environment: Docker versions, cluster topology, storage drivers, and configuration locations. This inventory ensures that backup and restore procedures are compatible and complete.
Determine Docker and Swarm Versions
Run the following commands on each manager and worker node to record the Docker and Swarm versions:
# On each node
docker version --format '{{.Server.Version}}'
docker info --format '{{.Swarm.LocalNodeState}} {{.Swarm.ControlAvailable}}'
Expected output on a manager node:
24.0.7
active true
On a worker node, the second line should show active false. Consistency across nodes is important; mismatched versions can lead to unexpected behavior during restores.
Map Cluster Topology
List all nodes and their roles with:
docker node ls
Example output:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
k8xl0v2xq... manager1 Ready Active Leader
...
Note the leader and the number of managers. Raft consensus requires a quorum of managers; if you have three managers, you can lose one and still function. Backing up the leader is not sufficient because any manager may become leader later. You must back up from all managers or ensure the entire Raft state is captured consistently.
Identify Persistent Data Locations
Application data is often stored in Docker volumes. List volumes with:
docker volume ls
Also check for bind mounts defined in service definitions. Volumes created by services may have names like myapp_data. You need to back up the contents of these volumes, not just the volume metadata.
Prerequisites for Backup
- Access: You need SSH access to all manager nodes and permission to run
dockercommands. - Storage: Sufficient local or remote storage for backup files. Swarm state is usually small (kilobytes to megabytes), but volume data can be large.
- Tooling: Standard Unix tools (
tar,scp, etc.) or a backup solution like restic or borg. - Downtime tolerance: For consistent volume backups, you may need to pause writes to volumes. This can be done by scaling services to zero or using application-level quiesce.
Safe Configuration Path
A safe backup strategy respects the distributed nature of Swarm and avoids partial or inconsistent captures. The following phases outline a scoped implementation.
Phase 1: Back Up Swarm State (Managers)
The swarm's control plane state includes services, networks, secrets, and configurations. This state is stored in /var/lib/docker/swarm on each manager. Because the state is replicated, you can back up from any single manager, but it is safest to back up from the current leader after stopping Docker on that node to ensure consistency. However, stopping Docker on a manager temporarily reduces quorum, so plan for a short maintenance window.
Step 1: Stop Docker on the manager you will back up.
# On the chosen manager (preferably leader)
sudo systemctl stop docker
Step 2: Create a tarball of the swarm directory.
sudo tar -czf /tmp/swarm-backup-$(date +%Y%m%d-%H%M%S).tar.gz -C /var/lib/docker swarm
Step 3: Restart Docker.
sudo systemctl start docker
After restart, the node rejoins the cluster. Verify that quorum is intact and the node is ready:
docker node ls
This approach captures a consistent snapshot because the Raft log is paused while Docker is stopped on that node. However, note that stopping the leader will cause a new leader election; after restart, the node will rejoin as a follower.
If you cannot stop Docker, you can attempt a live backup, but it is riskier due to possible concurrent writes. For a small cluster, the stop method is simple and reliable.
Phase 2: Back Up Application Data (Volumes)
Volumes are independent of swarm state but often contain the most valuable data. Each volume should be backed up individually.
Single volume backup:
Assume a service uses a volume named db_data. To back it up without stopping the service, you can use a temporary container that mounts the volume and copies its contents to a tarball on the host.
docker run --rm -v db_data:/data -v /tmp:/backup alpine tar czf /backup/db_data-backup-$(date +%Y%m%d).tar.gz -C /data .
For consistency, you may need to stop the service or use application-specific dump tools (e.g., mysqldump for MySQL). The above command takes a filesystem-level consistent snapshot only if the application is quiescent; otherwise, you risk copying files mid-write.
All volumes backup loop:
for vol in $(docker volume ls --format '{{.Name}}'); do
echo "Backing up volume: $vol"
docker run --rm -v $vol:/data -v /tmp:/backup alpine tar czf /backup/${vol}-backup-$(date +%Y%m%d).tar.gz -C /data .
done
This is not guaranteed to be consistent for all volumes, but it captures the data.
Important: If you use bind mounts, include those directories in your host-level backup tool (e.g., rsync to remote storage).
Phase 3: Secure Transfer and Retention
Copy backup files to off-site storage. Use scp, rsync, or your organization's backup system.
scp /tmp/swarm-backup-*.tar.gz user@backup-server:/backups/
scp /tmp/db_data-backup-*.tar.gz user@backup-server:/backups/
Set a retention policy. For example, keep daily backups for 7 days, weekly for 4 weeks, monthly for 6 months.
Verification and Diagnostics
Backups are only useful if they can be restored. Regularly test restores in a separate environment to catch issues before a real disaster.
Verify Swarm State Backup
To check the integrity of the swarm backup tarball without restoring into production, you can extract it to a temporary directory and examine its contents:
mkdir /tmp/swarm-check
sudo tar -xzf swarm-backup-20250201-120000.tar.gz -C /tmp/swarm-check
ls -la /tmp/swarm-check/swarm
Expected output should show directories like raft, certificates, worker, etc. If the tarball is empty or missing raft, the backup is invalid.
Verify Volume Backup
Similarly, extract a volume backup and inspect key files:
mkdir /tmp/vol-check
tar -xzf db_data-backup-20250201.tar.gz -C /tmp/vol-check
find /tmp/vol-check -type f | head
If the application dumps (e.g., SQL) are present, try importing them into a test database instance.
Automated Checks
Consider writing a script that:
- Runs the backup commands.
- Lists backup files and sizes.
- Tests extraction.
- Alerts on failures.
Example snippet:
if [ ! -s /tmp/swarm-backup-$(date +%Y%m%d).tar.gz ]; then
echo "Swarm backup file is empty or missing"
exit 1
fi
Restore Drill
At least quarterly, perform a restore drill in an isolated environment. This validates the full procedure and timings. Document any deviations.
Failure Modes and Recovery
Even with careful planning, failures during backup or restore happen. The following sections describe common failure modes and how to recover.
Failure: Backup Inconsistent Due to Concurrent Writes
Symptom: Restored service fails to start or data is corrupted.
Cause: Volume backup taken while application was writing.
Recovery: Restore from an earlier consistent backup (e.g., one taken with application stopped or using application dump). Improve future backups by quiescing the application.
Failure: Missing Secrets or Configs After Restore
Symptom: Services restart but cannot access secrets; error messages referencing missing files.
Cause: Swarm state restored from incomplete backup (e.g., only one manager backed up but not the full Raft state).
Recovery: Recreate missing secrets/configs using docker secret create and docker config create, then update services to use the new IDs. However, this may require service recreation. A better recovery is to restore the full swarm backup.
Failure: Cannot Restore Swarm on New Cluster
Symptom: After restoring /var/lib/docker/swarm from backup, node fails to join the intended cluster.
Cause: Backup belongs to a different swarm ID; managers have conflicting state.
Recovery: Force leave the swarm on that node (docker swarm leave --force), then restore the backup again and initialize or join properly. If you are rebuilding the entire swarm, you may need to docker swarm init first, then copy the backup over before starting services.
Rollback Planning
Always plan for rollback in case a restore goes wrong.
- For swarm state: If a restore fails, you can revert to the previous state if you have another manager with the old state. The un-restored managers may still have the original state.
- For volumes: Keep multiple backup generations. Use tagged versions so you can roll back to a known good state.
Recovery Checks
After restore, run these checks:
docker node lsshows all nodes active.docker service lsshows services with desired replicas.docker service ps <service>shows running tasks without errors.- Application endpoint responds correctly.
- Data integrity checks (e.g., row counts, file checksums).
Operations Checklist
Use the following checklist to standardize backup and restore operations.
| Task | Frequency | Details |
|---|---|---|
| Inventory node versions and roles | Monthly | Record docker version, docker node ls |
| Review volume list and sizes | Monthly | docker volume ls, du -sh /var/lib/docker/volumes/* |
| Backup swarm state from leader | Daily | Stop Docker, tar, restart |
| Backup all volumes (with quiesce if needed) | Daily | Use backup script with application dump if necessary |
| Transfer backups off-site | Daily | scp or rsync to remote storage |
| Test backup extraction | Weekly | Extract tarballs, check contents |
| Restore drill in staging | Quarterly | Full restore from backup, verify services |
| Review retention policy | Quarterly | Ensure backups are kept as per policy |
| Update backup scripts | As needed | Reflect environment changes |
Backup Script Example
Here is a complete shell script that backs up swarm state and volumes, with minimal checks. Adapt it to your environment.
#!/bin/bash
set -euo pipefail
BACKUP_ROOT=/tmp/swarm-backups
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p $BACKUP_ROOT/$TIMESTAMP
# Backup swarm state from first manager (assuming script runs on manager)
echo "Backing up swarm state..."
sudo systemctl stop docker
sudo tar -czf $BACKUP_ROOT/$TIMESTAMP/swarm.tar.gz -C /var/lib/docker swarm
sudo systemctl start docker
# Backup volumes
echo "Backing up volumes..."
VOLUMES=$(docker volume ls --format '{{.Name}}')
for vol in $VOLUMES; do
echo "Backing up volume $vol"
docker run --rm -v $vol:/data -v $BACKUP_ROOT/$TIMESTAMP:/backup alpine tar czf /backup/${vol}.tar.gz -C /data .
done
# Transfer to remote (example)
echo "Transferring backups..."
rsync -avz $BACKUP_ROOT/$TIMESTAMP user@backup-server:/backups/
echo "Backup completed: $BACKUP_ROOT/$TIMESTAMP"
Restore Procedure Quick Reference
- Stop all services that use the volumes to be restored (or stop the whole swarm if necessary).
- Restore swarm state on a fresh manager:
sudo systemctl stop docker
sudo rm -rf /var/lib/docker/swarm
sudo tar -xzf swarm.tar.gz -C /var/lib/docker
sudo systemctl start docker
- Recreate volumes and restore data:
docker volume create db_data
docker run --rm -v db_data:/data -v /backup:/backup alpine tar xzf /backup/db_data.tar.gz -C /data
- Recreate services: if swarm state was restored, services should be recreated automatically. Otherwise, use
docker stack deployordocker service createas per your configuration. - Verify with the diagnostics in the previous section.
Conclusion
Backing up and restoring Docker Swarm requires attention to both control plane state and application data. A clear Docker Swarm restore reduces rework by separating research, brief, article generation, evaluation, approval, and publishing. For Docker Swarm backup, the first useful pilot should be narrow, measurable, and easy to inspect locally before deployment. By following the inventory, backup, verification, and recovery procedures outlined here, you can safeguard your swarm against data loss and minimize downtime. Start with a simple script, test restores regularly, and adapt the practices to your environment.
Next steps:
- Run the environment inventory on your swarm today.
- Implement the backup script with your own storage targets.
- Schedule a restore drill within the next month.
- Document your specific procedures and share with your team.