portainer-mcp/DOCKER.md
Adolfo Delorenzo 10dfd606c0 feat: streamline Docker deployment with registry images and unified env configuration
- Update docker-compose.yml to use pre-built images from GitLab registry
- Replace individual environment variables with unified env_file directive
- Create comprehensive .env.example with detailed instructions and troubleshooting
- Add push-to-registry.sh script for building and pushing images to registry
- Add docker-compose.prod.yml as reference for production deployments
- Update documentation to reflect simplified deployment process

Users can now deploy with just:
  cp .env.example .env
  docker-compose pull
  docker-compose up -d

All 7 MCP server images are available at:
  git.oe74.net/adelorenzo/portainer-mcp/portainer-*:latest

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-21 15:16:15 -03:00

5.6 KiB

Docker Deployment Guide for Portainer MCP Servers

This guide covers how to build and run the Portainer MCP servers using Docker containers.

Prerequisites

  • Docker Engine 20.10+
  • Docker Compose 2.0+
  • Portainer Business Edition instance
  • Valid Portainer API key

Quick Start

  1. Clone the repository

    git clone https://github.com/yourusername/portainer-mcp.git
    cd portainer-mcp
    
  2. Create environment file

    cp .env.example .env
    # Edit .env with your Portainer credentials
    nano .env  # or use your preferred editor
    
  3. Pull images (or build locally)

    # Option A: Pull from registry (recommended)
    docker-compose pull
    
    # Option B: Build locally
    ./build-docker.sh all
    
  4. Start all services

    docker-compose up -d
    

Individual Container Management

Building Containers

Build all containers:

./build-docker.sh all

Build specific container:

./build-docker.sh core
./build-docker.sh docker
./build-docker.sh kubernetes
# etc...

Running Containers

Run all services:

docker-compose up -d

Run specific service:

docker-compose up -d portainer-core
docker-compose up -d portainer-docker
# etc...

View logs:

docker-compose logs -f portainer-core
docker-compose logs -f portainer-docker
# etc...

Stop services:

docker-compose down

Container Details

Each MCP server runs in its own container with the following configuration:

Service Container Name Port Purpose
portainer-core portainer-mcp-core 3000 User management, teams, RBAC
portainer-environments portainer-mcp-environments 3001 Environment management
portainer-docker portainer-mcp-docker 3002 Docker operations
portainer-kubernetes portainer-mcp-kubernetes 3003 Kubernetes management
portainer-stacks portainer-mcp-stacks 3004 Stack deployment
portainer-edge portainer-mcp-edge 3005 Edge computing
portainer-gitops portainer-mcp-gitops 3006 GitOps automation

Environment Variables

All containers use a shared .env file for configuration. The docker-compose.yml file is configured to automatically load environment variables from this file using the env_file directive.

# docker-compose.yml snippet
services:
  portainer-core:
    image: git.oe74.net/adelorenzo/portainer-mcp/portainer-core:latest
    env_file:
      - .env

See .env.example for a complete list of available environment variables with detailed documentation and troubleshooting tips.

Key Variables:

  • PORTAINER_URL - Your Portainer instance URL (required)
  • PORTAINER_API_KEY - Your Portainer API token (required)
  • PORTAINER_INSECURE - Set to true for self-signed certificates
  • HTTP_TIMEOUT - Request timeout in seconds
  • MAX_RETRIES - Number of retry attempts

Docker Compose Configuration

The docker-compose.yml file defines all services with:

  • Individual port mappings
  • Shared environment variables
  • Automatic restart policies
  • Isolated network for inter-container communication

Production Deployment

For production environments, consider:

  1. Use Docker Swarm or Kubernetes

    # Deploy as stack in Swarm
    docker stack deploy -c docker-compose.yml portainer-mcp
    
  2. Enable health checks Add to each service in docker-compose.yml:

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    
  3. Use secrets for API keys

    secrets:
      portainer_api_key:
        external: true
    
  4. Configure resource limits

    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M
    

Troubleshooting

Container won't start

  • Check logs: docker-compose logs portainer-<service>
  • Verify environment variables in .env
  • Ensure Portainer URL is accessible from container

Connection errors

  • For self-signed certificates, set PORTAINER_INSECURE=true
  • Check network connectivity: docker exec portainer-mcp-core curl https://your-portainer-url

Permission errors

  • Verify API key has required permissions
  • Check Portainer RBAC settings

Security Considerations

  1. Never commit .env file - It contains sensitive credentials
  2. Use read-only mounts where possible
  3. Run containers as non-root user (already configured)
  4. Enable TLS for MCP connections in production
  5. Regularly update base images and dependencies

Advanced Configuration

Custom Network

networks:
  portainer-mcp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

Volume Mounts

For persistent logs or configuration:

volumes:
  - ./logs:/app/logs
  - ./config:/app/config:ro

Multi-stage Builds

The Dockerfiles use single-stage builds for simplicity. For smaller images:

FROM python:3.11-slim AS builder
# Build stage...

FROM python:3.11-slim
# Runtime stage...

Integration with Claude Desktop

When running in Docker, configure Claude Desktop to connect to the containerized servers:

{
  "mcpServers": {
    "portainer-core": {
      "url": "http://localhost:3000"
    },
    "portainer-docker": {
      "url": "http://localhost:3002"
    }
    // ... other servers
  }
}

Monitoring

Monitor container health and resource usage:

# View resource usage
docker stats

# Check container health
docker ps --format "table {{.Names}}\t{{.Status}}"

# Export metrics
docker-compose ps --format json