Skip to content

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