Container Management
Detailed guide for managing Docker containers and services.
Docker Basics Review
Container Lifecycle
Image → Create → Start → Running → Stop → Stopped → Restart
↓ ↑
└──────── Remove ──────────────┘
Service Management
All services are managed via docker-compose for consistency.
Service Directories
Each service is in /data/coolify/services/SERVICE_ID/:
/data/coolify/services/SERVICE_ID/
├── docker-compose.yml # Service definition
├── .env # Environment variables (local)
├── .env.local # Overrides (if exists)
├── volumes/ # Volume mounts
├── media/ # User files
├── data/ # Persistent data
└── consume/ (Paperless) # Inbox directory
Service Operations
Start Service
cd /data/coolify/services/SERVICE_ID
docker compose up -d
# Monitor startup
docker compose logs -f
Stop Service
cd /data/coolify/services/SERVICE_ID
docker compose stop
# Wait for graceful shutdown (30 seconds)
# Force stop if needed:
docker compose kill
Restart Service
cd /data/coolify/services/SERVICE_ID
docker compose restart
# Or restart specific container:
docker compose restart SERVICE_NAME
# With log monitoring:
docker compose restart && docker compose logs -f
Remove Service
cd /data/coolify/services/SERVICE_ID
docker compose down
# Also remove volumes (careful!):
docker compose down -v
Container Debugging
Execute Command in Container
# Start interactive bash
docker exec -it CONTAINER_NAME bash
# Run command
docker exec CONTAINER_NAME command
# With environment variables
docker exec -e VAR=value CONTAINER_NAME command
Copy Files
# From container to host
docker cp CONTAINER_NAME:/path/in/container /path/on/host
# From host to container
docker cp /path/on/host CONTAINER_NAME:/path/in/container
Resource Limits
View container limits:
docker inspect CONTAINER_NAME | grep -A 5 '"Memory"'
Set limits in docker-compose.yml:
services:
service_name:
mem_limit: 2g
memswap_limit: 4g
cpus: '1.5'
Volume Management
List Volumes
docker volume ls
# Filter by service
docker volume ls | grep SERVICE_ID
# Detailed info
docker volume inspect VOLUME_NAME
View Volume Size
# Docker volumes location
du -sh /var/lib/docker/volumes/*/
# Specific volume
du -sh /var/lib/docker/volumes/VOLUME_NAME/_data
Backup Volume
# Export volume to tar
docker run --rm -v VOLUME_NAME:/data -v $(pwd):/backup \
alpine tar czf /backup/volume-backup.tar.gz -C /data .
# Restore volume
docker run --rm -v VOLUME_NAME:/data -v $(pwd):/backup \
alpine tar xzf /backup/volume-backup.tar.gz -C /data
Clean Up Volumes
# Remove unused volumes
docker volume prune
# Remove specific volume
docker volume rm VOLUME_NAME
# Force remove
docker volume rm -f VOLUME_NAME
Image Management
List Images
docker image ls
# With size
docker image ls --format "{{.Repository}}\t{{.Size}}"
# Unused images
docker image ls -f "dangling=true"
Pull Latest Image
# Pull without updating service
docker pull IMAGE_NAME:latest
# Update running service
cd /data/coolify/services/SERVICE_ID
docker compose down
docker compose pull
docker compose up -d
Build Custom Image
cd /data/coolify/services/SERVICE_ID
# Build from Dockerfile
docker compose build
# Then start
docker compose up -d
# Build without cache
docker compose build --no-cache
Clean Up Images
# Remove unused images
docker image prune
# Remove dangling layers
docker builder prune
# Remove all unused Docker data
docker system prune -a --volumes # CAREFUL: removes volumes!
Networking
View Networks
docker network ls
# Inspect network
docker network inspect NETWORK_NAME
# Connected containers
docker network inspect SERVICE_NETWORK | grep -i "container"
Service-to-Service Communication
Services on same network communicate by service name:
# Inside container, connect to another service
curl http://service-name:port/path
# Example: n8n connecting to PostgreSQL
# Connection string: postgresql://postgres-n8n-id:5432/n8n
Port Mapping
# View exposed ports
docker port CONTAINER_NAME
# Example output:
# 8000/tcp -> 0.0.0.0:8000
Health Checks
View Health Status
docker ps --format "table {{.Names}}\t{{.Status}}"
# Detailed health info
docker inspect CONTAINER_NAME | grep -A 10 "State"
Manual Health Check
# HTTP service
docker exec CONTAINER_NAME curl http://localhost:8000
# Database service
docker exec postgres-SERVICE_ID psql -U user -d dbname -c "SELECT 1"
# Cache service
docker exec redis-SERVICE_ID redis-cli ping
Update Health Check
Edit docker-compose.yml:
services:
service:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Logs and Debugging
View Logs
# Last N lines
docker logs CONTAINER_NAME --tail 50
# Follow in real-time
docker logs -f CONTAINER_NAME
# With timestamps
docker logs --timestamps CONTAINER_NAME
# Last hour
docker logs --since 1h CONTAINER_NAME
# Before specific time
docker logs --until 2024-01-01T00:00:00 CONTAINER_NAME
Log Drivers
Current logs stored on disk. Configure in docker-compose.yml:
services:
service:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Export Logs
# Export to file
docker logs CONTAINER_NAME > container-logs.txt 2>&1
# Analyze logs
docker logs CONTAINER_NAME | grep -i error
docker logs CONTAINER_NAME | tail -100 | less
Useful Aliases
Add to /root/.bashrc:
# Alias definitions
alias dps='docker ps -a'
alias dstats='docker stats --no-stream'
alias dlogs='docker logs'
alias dcleanup='docker system prune -a --volumes'
# Service shortcuts
alias cdimmich='cd /data/coolify/services/IMMICH_ID && docker compose'
alias cdpaperless='cd /data/coolify/services/woq978nbzog6dmddhrmeujvk && docker compose'
alias cdn8n='cd /data/coolify/services/N8N_ID && docker compose'
# Functions
dcrestart() {
cd /data/coolify/services/$1
docker compose restart && docker compose logs -f
}
dclog() {
docker logs $(docker ps -q | head -1) -f
}
# Reload with: source ~/.bashrc
Performance Optimization
Container Startup Order
Use depends_on in docker-compose.yml:
services:
app:
depends_on:
database:
condition: service_healthy
cache:
condition: service_healthy
Resource Monitoring
# Live stats
docker stats
# Export metrics
docker stats --no-stream > stats-$(date +%Y%m%d-%H%M%S).txt
# High memory consumers
docker stats --no-stream | sort -k 4 -h
Emergency Procedures
Force Stop All
docker stop $(docker ps -q)
Force Remove Container
docker rm -f CONTAINER_NAME
Rebuild Everything
# Stop all
docker compose -f /data/coolify/services/*/docker-compose.yml down
# Remove volumes (careful!)
docker volume prune
# Rebuild all
docker compose -f /data/coolify/services/*/docker-compose.yml up -d --build
Related Documentation
- Common Commands — Quick reference
- Troubleshooting — Problem solving
- Services Overview — Service-specific info