Skip to content

Docker Maintenance

Cleanup

Remove Unused Resources

# Remove stopped containers
docker container prune

# Remove unused images
docker image prune -a

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Remove everything unused (containers, images, volumes, networks)
docker system prune -a --volumes

Clean Periodic (Cron)

/etc/cron.daily/docker-cleanup
#!/bin/bash
docker system prune -a --volumes -f 2>&1 | logger -t docker-cleanup
chmod +x /etc/cron.daily/docker-cleanup

Disk Usage

# Show disk usage by Docker objects
docker system df

# Verbose
docker system df -v

# Check container log sizes
du -sh /var/lib/docker/containers/*/*-json.log

# Check volume sizes
du -sh /var/lib/docker/volumes/*

Log Management

docker-compose.yml
services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Global limit in /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
systemctl restart docker

Backup & Restore Volumes

Backup

docker run --rm \
  -v my_volume:/source \
  -v $(pwd):/backup \
  alpine tar czf /backup/my_volume-$(date +%Y%m%d).tar.gz -C /source .

Restore

docker run --rm \
  -v my_volume:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/my_volume-20240101.tar.gz -C /target

Image Management

# List images by size
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" | sort -k2 -h

# Remove dangling images
docker image prune -f

# Remove images older than 30 days
docker image prune -a --filter "until=720h" -f

# Export/import images
docker save myapp:latest | gzip > myapp-latest.tar.gz
gunzip -c myapp-latest.tar.gz | docker load

Container Auto-Restart

docker-compose.yml
services:
  app:
    restart: unless-stopped

Policies: no, always, on-failure, unless-stopped

Update Containers

# Pull and recreate
docker compose pull
docker compose up -d --force-recreate

# With zero-downtime (if configured)
docker compose up -d --no-deps --build <service>

Monitor Docker

# Real-time stats
docker stats

# Resource usage per container
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# Container events
docker events --filter 'type=container' --filter 'event=die'

# Check Docker daemon health
docker info
docker system events --since 5m

Security

# Scan images for vulnerabilities
docker scan <image>

# Run container with read-only root
docker run --read-only --tmpfs /tmp <image>

# Limit resources
docker run --memory=512m --cpus=0.5 <image>

# Use non-root user
docker run -u 1000:1000 <image>

Docker Registry Management

# Login to registry
docker login registry.example.com

# Tag and push
docker tag myapp:latest registry.example.com/myapp:latest
docker push registry.example.com/myapp:latest

# Pull and run
docker pull registry.example.com/myapp:latest

Verification

  • Disk usage checked weekly
  • Unused images cleaned monthly
  • Log rotation configured
  • Volumes backed up
  • Containers restart policy set
  • Resource limits applied