Перейти к содержимому

Docker развёртывание

Полное руководство по контейнеризации MCP серверов с Docker

Docker обеспечивает изоляцию, воспроизводимость и простоту развёртывания MCP серверов в любой среде.

Dockerfile
# Build stage для зависимостей
FROM python:3.12-slim AS builder
WORKDIR /app
# Установка build-зависимостей
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libpq-dev && rm -rf /var/lib/apt/lists/*
# Виртуальное окружение
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Production stage
FROM python:3.12-slim
# Non-root пользователь
RUN useradd --create-home --shell /bin/bash mcp
WORKDIR /home/mcp/app
# Копирование venv из builder
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Копирование кода
COPY --chown=mcp:mcp src/ ./src/
USER mcp
CMD ["python", "-m", "src.server"]
Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ ./src/
CMD ["python", "-m", "src.server"]
Dockerfile
# Multi-stage build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
CMD ["node", "dist/index.js"]
Dockerfile
FROM rust:1.75 AS builder
WORKDIR /app
COPY . .
RUN cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/mcp-server /usr/local/bin/
CMD ["mcp-server"]
Dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o mcp-server ./cmd/server
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/mcp-server /usr/local/bin/
CMD ["mcp-server"]

Для комплексных сервисов с зависимостями:

docker-compose.yml
version: '3.8'
services:
mcp-server:
build: .
container_name: mcp-server
restart: unless-stopped
volumes:
- ./data:/app/data:ro
- ./config:/app/config:ro
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/mcp
- LOG_LEVEL=info
depends_on:
- db
networks:
- mcp-network
db:
image: postgres:16-alpine
container_name: mcp-db
restart: unless-stopped
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mcp
networks:
- mcp-network
volumes:
postgres_data:
networks:
mcp-network:
driver: bridge

Для доступа к данным на хосте:

docker-compose.yml
services:
mcp-server:
volumes:
# Только чтение для безопасности
- /home/user/documents:/app/documents:ro
# Запись для кэша
- mcp-cache:/app/cache
# Конфигурация
- ./config.json:/app/config.json:ro
Dockerfile
ENV MCP_SERVER_NAME=my-server
ENV MCP_LOG_LEVEL=info
ENV MCP_MAX_CONNECTIONS=100
docker-compose.yml
services:
mcp-server:
environment:
- MCP_SERVER_NAME=${SERVER_NAME:-default}
- MCP_LOG_LEVEL=${LOG_LEVEL:-info}
- DATABASE_URL
env_file:
- .env
.env
SERVER_NAME=production-server
LOG_LEVEL=warn
DATABASE_URL=postgresql://user:pass@host:5432/db
docker-compose.yml
services:
mcp-server:
ports:
- "3000:3000"
environment:
- MCP_TRANSPORT=http
- MCP_PORT=3000
docker-compose.yml
services:
mcp-server:
networks:
- internal
app:
networks:
- internal
environment:
- MCP_SERVER_URL=http://mcp-server:3000
networks:
internal:
internal: true
Dockerfile
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
docker-compose.yml
services:
mcp-server:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s
Dockerfile
FROM python:3.12-slim
# Создание non-root пользователя
RUN useradd --create-home --shell /bin/bash mcp
USER mcp
WORKDIR /home/mcp/app
COPY --chown=mcp:mcp . .
CMD ["python", "-m", "src.server"]
docker-compose.yml
services:
mcp-server:
read_only: true
tmpfs:
- /tmp
volumes:
- ./data:/app/data:ro
docker-compose.yml
services:
mcp-server:
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
docker-compose.yml
services:
mcp-server:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
docker-compose.yml
services:
mcp-server:
logging:
driver: syslog
options:
syslog-address: "tcp://logs.example.com:514"
tag: "mcp-server"
Dockerfile
FROM python:3.12-slim
# Labels для Kubernetes
LABEL org.opencontainers.image.source="https://github.com/user/mcp-server"
LABEL org.opencontainers.image.version="1.0.0"
WORKDIR /app
# Сигнал для graceful shutdown
STOPSIGNAL SIGTERM
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ ./src/
# Health check endpoint
EXPOSE 8080
USER 1000
CMD ["python", "-m", "src.server"]
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-server
spec:
replicas: 3
selector:
matchLabels:
app: mcp-server
template:
metadata:
labels:
app: mcp-server
spec:
containers:
- name: mcp-server
image: registry.example.com/mcp-server:1.0.0
ports:
- containerPort: 3000
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "250m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 10

Создайте run-mcp-docker.sh:

run-mcp-docker.sh
#!/bin/bash
docker run --rm -i \
-v /home/user/data:/app/data:ro \
-e LOG_LEVEL=info \
my-mcp-server:latest
claude_desktop_config.json
{
"mcpServers": {
"docker-server": {
"command": "/path/to/run-mcp-docker.sh"
}
}
}
claude_desktop_config.json
{
"mcpServers": {
"docker-server": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/home/user/data:/app/data:ro",
"my-mcp-server:latest"
]
}
}
}
Terminal
# Сборка
docker build -t my-mcp-server:1.0.0 .
# Тегирование для registry
docker tag my-mcp-server:1.0.0 registry.example.com/my-mcp-server:1.0.0
# Push
docker push registry.example.com/my-mcp-server:1.0.0
Terminal
# Сборка для нескольких архитектур
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t my-mcp-server:1.0.0 \
--push .