- Create individual Dockerfiles for each of the 7 MCP servers - Add docker-compose.yml for orchestrating all services - Create build-docker.sh script for easy container building - Add comprehensive Docker deployment documentation (DOCKER.md) - Update main README with Docker installation instructions - Add .env.example template for environment configuration - Configure each server with dedicated ports (3000-3006) - Implement security best practices (non-root user, minimal base image) - Add production deployment considerations and troubleshooting guide Each server can now be run individually or all together using Docker Compose, making deployment and scaling much easier for production environments. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
235 lines
4.9 KiB
Markdown
235 lines
4.9 KiB
Markdown
# 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**
|
|
```bash
|
|
git clone https://github.com/yourusername/portainer-mcp.git
|
|
cd portainer-mcp
|
|
```
|
|
|
|
2. **Create environment file**
|
|
```bash
|
|
cp .env.example .env
|
|
# Edit .env with your Portainer credentials
|
|
```
|
|
|
|
3. **Build all containers**
|
|
```bash
|
|
./build-docker.sh all
|
|
```
|
|
|
|
4. **Start all services**
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
## Individual Container Management
|
|
|
|
### Building Containers
|
|
|
|
Build all containers:
|
|
```bash
|
|
./build-docker.sh all
|
|
```
|
|
|
|
Build specific container:
|
|
```bash
|
|
./build-docker.sh core
|
|
./build-docker.sh docker
|
|
./build-docker.sh kubernetes
|
|
# etc...
|
|
```
|
|
|
|
### Running Containers
|
|
|
|
Run all services:
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
Run specific service:
|
|
```bash
|
|
docker-compose up -d portainer-core
|
|
docker-compose up -d portainer-docker
|
|
# etc...
|
|
```
|
|
|
|
View logs:
|
|
```bash
|
|
docker-compose logs -f portainer-core
|
|
docker-compose logs -f portainer-docker
|
|
# etc...
|
|
```
|
|
|
|
Stop services:
|
|
```bash
|
|
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 share the same environment variables:
|
|
|
|
```bash
|
|
# Required
|
|
PORTAINER_URL=https://your-portainer-instance.com
|
|
PORTAINER_API_KEY=your-api-key-here
|
|
|
|
# Optional
|
|
PORTAINER_INSECURE=false # Set to true for self-signed certificates
|
|
HTTP_TIMEOUT=30
|
|
MAX_RETRIES=3
|
|
```
|
|
|
|
## 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**
|
|
```bash
|
|
# 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:
|
|
```yaml
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
```
|
|
|
|
3. **Use secrets for API keys**
|
|
```yaml
|
|
secrets:
|
|
portainer_api_key:
|
|
external: true
|
|
```
|
|
|
|
4. **Configure resource limits**
|
|
```yaml
|
|
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
|
|
```yaml
|
|
networks:
|
|
portainer-mcp:
|
|
driver: bridge
|
|
ipam:
|
|
config:
|
|
- subnet: 172.20.0.0/16
|
|
```
|
|
|
|
### Volume Mounts
|
|
For persistent logs or configuration:
|
|
```yaml
|
|
volumes:
|
|
- ./logs:/app/logs
|
|
- ./config:/app/config:ro
|
|
```
|
|
|
|
### Multi-stage Builds
|
|
The Dockerfiles use single-stage builds for simplicity. For smaller images:
|
|
```dockerfile
|
|
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:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"portainer-core": {
|
|
"url": "http://localhost:3000"
|
|
},
|
|
"portainer-docker": {
|
|
"url": "http://localhost:3002"
|
|
}
|
|
// ... other servers
|
|
}
|
|
}
|
|
```
|
|
|
|
## Monitoring
|
|
|
|
Monitor container health and resource usage:
|
|
```bash
|
|
# View resource usage
|
|
docker stats
|
|
|
|
# Check container health
|
|
docker ps --format "table {{.Names}}\t{{.Status}}"
|
|
|
|
# Export metrics
|
|
docker-compose ps --format json
|
|
``` |