HxHippy

Docker Volumes

Persist data with Docker volumes for stateful applications.

Last updated: 2025-01-15

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-data

Using 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 \
  myapp

Volume 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 -a

Volume 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 /target

Database 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:7

Volume 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 /data

Volume 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-vol

Best Practices

  1. Use named volumes for data that should persist
  2. Backup regularly especially databases
  3. Use read-only when possible (:ro)
  4. Prune unused volumes regularly
  5. Document volumes in compose files
intermediate Storage Updated 2025-01-15
  • docker
  • volumes
  • persistence
  • storage
  • data