Docker Volume Cheatsheet — Persistent Data & Storage
Containers are ephemeral by design — data is lost when they stop. Volumes and bind mounts let you persist data, share files between containers, and manage storage independently of the container lifecycle.
Quick Reference
| Scenario | Command |
| List volumes | docker volume ls |
| Create a volume | docker volume create my-data |
| Inspect a volume | docker volume inspect my-data |
| Remove a volume | docker volume rm my-data |
| Prune unused volumes | docker volume prune |
| Run container with volume | docker run -v my-data:/app/data nginx |
| Run with bind mount | docker run -v $(pwd):/app nginx |
| Run with read-only volume | docker run -v my-data:/app/data:ro nginx |
Volume vs Bind Mount
| Feature | Volume | Bind Mount |
| Managed by Docker | ✅ Yes | ❌ No |
| Location | /var/lib/docker/volumes/ | Any host path |
| Backup/Restore | Easy (docker CLI) | Manual |
| Cross-host portable | ✅ Yes | ❌ Path-dependent |
| Development live-reload | ❌ | ✅ Yes (syncs host edits) |
| Recommended for | Production data, databases | Development, config files |
Core Commands
### Managing Volumes
``bash
# Create a named volume
docker volume create postgres-data
# List volumes docker volume ls
# Inspect volume details (mountpoint, driver, labels) docker volume inspect postgres-data
# Remove a specific volume (container must not be using it) docker volume rm postgres-data
# Remove all unused volumes
docker volume prune
`
### Using Volumes with Containers
`bash
# Named volume — Docker manages the storage location
docker run -d --name db -v postgres-data:/var/lib/postgresql/data postgres:16
# Anonymous volume — Docker generates a random name docker run -d -v /var/lib/postgresql/data postgres:16
# Read-only volume (container cannot write) docker run -d -v config-data:/etc/nginx/conf.d:ro nginx
# Multiple volumes
docker run -d \
-v app-data:/app/data \
-v config-data:/etc/nginx/conf.d:ro \
nginx
`
### Bind Mounts
`bash
# Mount current directory to /app inside container
docker run -v $(pwd):/app node:20 npm run dev
# Mount with read-only docker run -v $(pwd):/app:ro node:20 npm test
# Mount specific directory (absolute path)
docker run -v /home/user/project:/app node:20 npm start
`
### Backup & Restore
`bash
# Backup a volume to a tar file
docker run --rm \
-v my-volume:/source \
-v $(pwd):/backup \
alpine tar czf /backup/my-volume-backup.tar.gz -C /source .
# Restore a volume from a tar file docker run --rm \ -v my-volume:/target \ -v $(pwd):/backup \ alpine tar xzf /backup/my-volume-backup.tar.gz -C /target ``
Volume(23)
| Command | Level | ||
|---|---|---|---|
docker volume createCreate a new volume | Basic | docker volume create my-volume | |
docker volume lsList all volumes | Basic | docker volume ls | |
docker volume inspectInspect volume details | Basic | docker volume inspect my-volume | |
docker volume rmRemove one or more volumes | Basic | docker volume rm my-volume | |
docker volume pruneRemove all unused volumes | Expert | docker volume prune | |
docker run -vRun a container with a volume mount | Intermediate | docker run -v my-volume:/data nginx | |
docker run --mountRun a container with advanced mount options | Expert | docker run --mount type=volume,source=my-volume,target=/data nginx | |
docker volume --helpDisplay docker volume help information | Basic | docker volume --help | |
docker volume create --driverCreate a volume with a specific driver | Intermediate | docker volume create --driver local my-volume | |
docker volume create --labelCreate a volume with labels | Intermediate | docker volume create --label env=prod --label app=db my-volume | |
docker volume create -o type=btrfsCreate a volume with a specific filesystem type | Expert | docker volume create -o type=btrfs -o device=/dev/sdb my-volume | |
docker volume ls -qShow only volume names | Basic | docker volume ls -q | |
docker volume ls --filterList volumes filtered by criteria | Intermediate | docker volume ls --filter label=env=prod | |
docker volume inspect --formatCustom format volume inspection output | Expert | docker volume inspect --format '{{.Name}} {{.Driver}} {{.Mountpoint}}' my-volume | |
docker volume prune -fForce remove all unused volumes without prompt | Basic | docker volume prune -f | |
docker volume prune --filterPrune unused volumes with filter | Expert | docker volume prune --filter "label!=keep" --filter "until=24h" | |
docker run -v (bind mount)Run a container with a host directory bind mount | Intermediate | docker run -v /host/path:/container/path nginx | |
docker run -v $(pwd):/appMount current directory into container (hot-reload for dev) | Basic | docker run -v $(pwd):/app -w /app node:20 node server.js | |
docker run --mount type=bindUse --mount syntax for bind mounting | Intermediate | docker run --mount type=bind,source=/host/path,target=/container/path nginx | |
docker run --mount type=tmpfsRun a container with a tmpfs mount (in-memory) | Expert | docker run --mount type=tmpfs,target=/cache,tmpfs-size=100m nginx | |
docker run --mount type=volume,readonlyRun a container with a read-only volume mount | Intermediate | docker run --mount type=volume,source=my-volume,target=/data,readonly nginx | |
docker run --mount type=volume,volume-driverRun a container with a third-party volume driver | Expert | docker run --mount type=volume,source=my-volume,target=/data,volume-driver=vieus/sshfs nginx | |
docker run --mount type=volume,volume-optRun a container with volume driver options | Expert | docker run --mount type=volume,source=myshare,target=/data,volume-driver=nfs,volume-opt=addr=10.0.0.1,volume-opt=nfsvers=4 nginx |