Docker Volumes Skill
Master Docker persistent storage including named volumes, bind mounts, tmpfs, and data backup/restore procedures.
Purpose
Implement reliable data persistence for containers with proper volume management, backup strategies, and permission handling.
Parameters
| Parameter |
Type |
Required |
Default |
Description |
| volume_name |
string |
No |
- |
Name for the volume |
| mount_type |
enum |
No |
volume |
volume/bind/tmpfs |
| backup |
boolean |
No |
false |
Include backup commands |
Storage Types
| Type |
Persistence |
Use Case |
Managed By |
| Named Volume |
Yes |
Production data |
Docker |
| Bind Mount |
Yes |
Development, configs |
Host |
| tmpfs |
No (memory) |
Secrets, temp files |
Docker |
| Anonymous |
Container lifetime |
Scratch space |
Docker |
Volume Operations
Named Volumes
# Create volume
docker volume create app_data
# Use in container
docker run -d \
-v app_data:/var/lib/postgresql/data \
postgres:16-alpine
# Inspect volume
docker volume inspect app_data
# List volumes
docker volume ls
# Remove unused volumes
docker volume prune
Bind Mounts
# Development - mount source code
docker run -d \
-v $(pwd)/src:/app/src \
node:20-alpine
# Read-only config
docker run -d \
-v /etc/app/config.yaml:/app/config.yaml:ro \
myapp
tmpfs Mounts
# Sensitive data in memory
docker run -d \
--tmpfs /app/secrets:rw,noexec,nosuid,size=64m \
myapp
# Compose syntax
services:
app:
volumes:
- type: tmpfs
target: /app/tmp
tmpfs:
size: 100m
Docker Compose Volumes
services:
database:
image: postgres:16-alpine
volumes:
- db_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
app:
image: myapp
volumes:
- uploads:/app/uploads
- ./config:/app/config:ro
volumes:
db_data:
driver: local
uploads:
external: true # Pre-created
Backup & Restore
Backup Volume
# Backup to tar file
docker run --rm \
-v app_data:/source:ro \
-v $(pwd)/backups:/backup \
alpine tar cvf /backup/app_data_$(date +%Y%m%d).tar -C /source .
# Compressed backup
docker run --rm \
-v app_data:/source:ro \
-v $(pwd)/backups:/backup \
alpine tar czvf /backup/app_data_$(date +%Y%m%d).tar.gz -C /source .
Restore Volume
# Restore from tar
docker run --rm \
-v app_data:/dest \
-v $(pwd)/backups:/backup:ro \
alpine tar xvf /backup/app_data_20240101.tar -C /dest
Clone Volume
docker run --rm \
-v source_volume:/from:ro \
-v target_volume:/to \
alpine cp -av /from/. /to/
Error Handling
Common Errors
| Error |
Cause |
Solution |
volume in use |
Container running |
Stop container first |
permission denied |
UID mismatch |
Fix ownership |
no space left |
Disk full |
Clean up or expand |
path not found |
Bind mount missing |
Create directory |
Permission Fixes
# Check ownership
docker run --rm -v app_data:/data alpine ls -la /data
# Fix ownership (match container user)
docker run --rm -v app_data:/data alpine chown -R 1000:1000 /data
# SELinux (RHEL/CentOS)
docker run -v /host/path:/container/path:Z myimage
Troubleshooting
Debug Checklist
Diagnostic Commands
# Check volume location
docker volume inspect app_data --format '{{.Mountpoint}}'
# Check container mounts
docker inspect <container> --format '{{json .Mounts}}'
# Check disk usage
docker system df -v
Usage
Skill("docker-volumes")
Related Skills
- docker-compose-setup
- docker-production