Docker Data Storage
Docker provides several ways to store data: volumes, bind mounts, and tmpfs.
Storage Comparison
| Type | Persistent | Performance | Sharing |
|---|---|---|---|
| Volumes | Yes | High | Controlled |
| Bind Mounts | Yes | Depends on host | Flexible |
| Tmpfs | No | Very high | No |
Volumes
# Create a volume
docker volume create myvolume
# List volumes
docker volume ls
# Delete a volume
docker volume rm myvolume
docker volume prune
Bind Mounts
# Mount a directory
docker run -d -v /host/path:/container/path myapp
# Mount read-only
docker run -d -v /host/path:/container/path:ro myapp
# Mount a file
docker run -d -v /host/config.json:/app/config.json myapp
Tmpfs
# Mount in memory
docker run -d --tmpfs /app/temp:rw,size=100m myapp
Use Case: Application Storage
version: '3.8'
services:
database:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
api:
build: ./backend
volumes:
- ./src:/app/src
- uploads:/app/uploads
nginx:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- static-files:/usr/share/nginx/html
volumes:
db-data:
uploads:
static-files:
Everyday Use Case
Case: A developer needs persistent data.
# Back up a volume
docker run --rm \
-v db-data:/source:ro \
-v $(pwd):/backup \
alpine tar czf /backup/db.tar.gz -C /source .
# Restore a volume
docker run --rm \
-v db-data:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/db.tar.gz -C /target
Best Practices
- Use named volumes: For important data
- Use bind mounts: For development
- Back up regularly: Schedule backups
- Delete unused ones:
docker volume prune
Conclusion
Choose the right storage type. Named volumes for important data, bind mounts for development.