Docker Volumes
Volumes are the preferred way to persist data in Docker.
Volume Types
| Type | Description |
|---|---|
| Named Volume | Managed by Docker, persists |
| Anonymous Volume | No name, temporary |
| Bind Mount | Host directory mapped |
| tmpfs | In-memory only |
Creating Volumes
# Create volume
docker volume create my-data
# Create with options
docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/share \
nfs-dataUsing Volumes
# Mount volume to container
docker run -d \
-v my-data:/app/data \
myapp
# Named volume (long form)
docker run -d \
--mount source=my-data,target=/app/data \
myapp
# Read-only volume
docker run -d \
-v my-data:/app/data:ro \
myappVolume Management
# List volumes
docker volume ls
# Inspect volume
docker volume inspect my-data
# Remove volume
docker volume rm my-data
# Remove unused volumes
docker volume prune
# Remove all volumes (dangerous!)
docker volume prune -aVolume Backup and Restore
# Backup volume
docker run --rm \
-v my-data:/source:ro \
-v $(pwd):/backup \
alpine tar czf /backup/my-data-backup.tar.gz -C /source .
# Restore volume
docker run --rm \
-v my-data:/target \
-v $(pwd):/backup:ro \
alpine tar xzf /backup/my-data-backup.tar.gz -C /targetDatabase Volume Example
# PostgreSQL with volume
docker run -d \
--name postgres \
-v postgres-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
# MySQL with volume
docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8
# MongoDB with volume
docker run -d \
--name mongo \
-v mongo-data:/data/db \
mongo:7Volume Inspection
# Find volume location
docker volume inspect my-data --format '{{.Mountpoint}}'
# /var/lib/docker/volumes/my-data/_data
# View volume contents (requires root)
sudo ls /var/lib/docker/volumes/my-data/_data
# Or use a container
docker run --rm -v my-data:/data alpine ls -la /dataVolume Driver Options
# Local driver with options
docker volume create \
--driver local \
--opt type=btrfs \
--opt device=/dev/sdb1 \
btrfs-vol
# NFS volume
docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw,nfsvers=4 \
--opt device=:/share/data \
nfs-volBest Practices
- Use named volumes for data that should persist
- Backup regularly especially databases
- Use read-only when possible (
:ro) - Prune unused volumes regularly
- Document volumes in compose files
- docker
- volumes
- persistence
- storage
- data