Docker Setup
Docker Setup
Manacore uses Docker for local development services and production deployment.
Overview
Docker provides:
- Development: Local PostgreSQL, Redis, MinIO (S3-compatible storage)
- CI/CD: Automated builds and tests
- Production: Container deployment
Quick Start
# Start all development infrastructurepnpm docker:up
# View logspnpm docker:logs
# Stop servicespnpm docker:down
# Complete reset (removes volumes)pnpm docker:cleanServices Included
| Service | Port | Purpose |
|---|---|---|
| PostgreSQL | 5432 | Database |
| Redis | 6379 | Caching, sessions |
| MinIO | 9000 (API), 9001 (Console) | S3-compatible storage |
MinIO Access
- Console: http://localhost:9001
- Username:
minioadmin - Password:
minioadmin
Docker Templates
Templates are in docker/templates/ for creating new Dockerfiles:
NestJS Backend
# Copy templatecp docker/templates/Dockerfile.nestjs apps/myproject/apps/backend/DockerfileBuild arguments:
SERVICE_PATH: Path to servicePORT: Service portHEALTH_PATH: Health check endpoint
docker build \ --build-arg SERVICE_PATH=apps/chat/apps/backend \ --build-arg PORT=3002 \ --build-arg HEALTH_PATH=/api/health \ -t chat-backend:latest \ -f docker/templates/Dockerfile.nestjs \ .SvelteKit Web
docker build \ --build-arg SERVICE_PATH=apps/chat/apps/web \ --build-arg PORT=3000 \ -t chat-web:latest \ -f docker/templates/Dockerfile.sveltekit \ .Astro Landing
Static site served with Nginx:
docker build \ --build-arg SERVICE_PATH=apps/chat/apps/landing \ -t chat-landing:latest \ -f docker/templates/Dockerfile.astro \ .Building Images
Development Build
# Build single servicedocker build -t service-name:dev -f apps/project/apps/service/Dockerfile .
# Build with cachedocker build --cache-from service-name:latest -t service-name:dev .Production Build
# Multi-platform builddocker buildx build \ --platform linux/amd64,linux/arm64 \ -t service-name:latest \ .Running Containers
# Run with environment filedocker run -d \ --name chat-backend \ --env-file .env.production \ -p 3002:3002 \ chat-backend:latest
# View logsdocker logs -f chat-backend
# Execute shell in containerdocker exec -it chat-backend shDocker Compose
Development
# Start servicespnpm docker:up
# View statusdocker compose -f docker-compose.dev.yml ps
# View specific service logsdocker compose -f docker-compose.dev.yml logs -f postgresProduction
# Deploy to productiondocker compose -f docker-compose.production.yml up -d
# Rolling updatedocker compose -f docker-compose.production.yml up -d --no-deps service-name
# Scale servicedocker compose up -d --scale service=3 serviceBest Practices
1. Optimize Layer Caching
# Good - cache dependenciesCOPY package.json pnpm-lock.yaml ./RUN pnpm installCOPY . .
# Bad - invalidates cache on every changeCOPY . .RUN pnpm install2. Use Multi-Stage Builds
# Build stageFROM node:20-alpine AS builderWORKDIR /appCOPY . .RUN pnpm install && pnpm build
# Production stageFROM node:20-alpine AS productionCOPY --from=builder /app/dist ./distCMD ["node", "dist/main.js"]3. Security
# Use non-root userRUN addgroup -g 1001 -S nodejs && \ adduser -S nestjs -u 1001USER nestjs4. Health Checks
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 15. Resource Limits
services: backend: deploy: resources: limits: cpus: '1' memory: 512MTroubleshooting
Container Won’t Start
# View logsdocker logs container-name
# Check exit codedocker inspect --format='{{.State.ExitCode}}' container-name
# Run interactivelydocker run -it --rm image-name shOut of Disk Space
# Check usagedocker system df
# Clean everything unuseddocker system prune -a --volumesNetwork Issues
# List networksdocker network ls
# Test connectivitydocker exec container1 ping container2Permission Issues
# Check ownershipdocker exec container-name ls -la /app
# Fix in DockerfileRUN chown -R nodejs:nodejs /appAdvanced
BuildKit
export DOCKER_BUILDKIT=1docker build .Custom Networks
docker network create --driver bridge my-networkdocker run --network my-network image-nameVolume Backup
docker run --rm \ -v my-data:/data \ -v $(pwd):/backup \ alpine tar czf /backup/backup.tar.gz /data