Warum Docker für Claude Code Agents?
Ohne Container hängt dein Agent von der lokalen Umgebung ab: Node.js-Version, installierten Tools, Systemkonfiguration. Das funktioniert auf deinem Laptop — aber reproduzierbar auf einem VPS deployen? Schwierig.
Mit Docker ist der Agent immutable: gleiche Umgebung auf Laptop, Staging und Production. Außerdem hilft Container-Isolation bei Security: der Agent sieht nur was er sehen soll.
Basis-Dockerfile für einen Claude Code Agent
1Einfaches Single-Stage Dockerfile
# Dockerfile — Claude Code Agent (einfach)
FROM node:20-slim
# Security: nicht als root laufen
RUN useradd -m -s /bin/bash agent
WORKDIR /app
RUN chown agent:agent /app
# Claude Code CLI installieren
RUN npm install -g @anthropic-ai/claude-code
# Agent-Skripte und CLAUDE.md kopieren
COPY --chown=agent:agent . .
# Als non-root User laufen
USER agent
# API Key via Environment Variable (NIEMALS im Image)
ENV ANTHROPIC_API_KEY=""
CMD ["node", "agent.js"]
NIEMALS den ANTHROPIC_API_KEY in das Dockerfile hardcoden oder per COPY in das Image bringen. Immer via -e Flag oder Docker Secrets übergeben.
2Multi-Stage Build für Produktion
Multi-Stage Builds reduzieren die finale Image-Größe dramatically — nur was runtime nötig ist landet im finalen Image.
# Multi-Stage Dockerfile — Produktions-optimiert
# Stage 1: Dependencies installieren
FROM node:20-slim AS deps
WORKDIR /build
COPY package*.json ./
RUN npm ci --only=production
# Stage 2: Build (TypeScript kompilieren falls nötig)
FROM node:20-slim AS builder
WORKDIR /build
COPY --from=deps /build/node_modules ./node_modules
COPY . .
RUN npm run build 2>/dev/null || true # TypeScript build, optional
# Stage 3: Finales minimales Image
FROM node:20-slim AS runtime
RUN useradd -m agent && npm install -g @anthropic-ai/claude-code
WORKDIR /app
COPY --from=builder --chown=agent:agent /build/dist ./dist
COPY --from=deps --chown=agent:agent /build/node_modules ./node_modules
COPY --chown=agent:agent CLAUDE.md .
USER agent
CMD ["node", "dist/agent.js"]
Docker Compose für Multi-Agent-Systeme
Wenn du mehrere Agents betreibst (CEO, Marketing, ICT...), koordiniert Docker Compose das Netzwerk zwischen ihnen.
DOCKER COMPOSE ARCHITEKTUR — Multi-Agent-System
strategy-agent (Port: intern) — CLAUDE.md: Strategy
marketing-agent (Port: intern) — CLAUDE.md: Marketing
n8n (Port: 5678) — Webhook-Automation
monitoring (Port: 3001) — Health-Checks
Alle Services im selben Docker Network → können sich via Service-Namen ansprechen
# docker-compose.yml — Multi-Agent-System
version: '3.9'
services:
strategy-agent:
build:
context: .
dockerfile: agents/strategy/Dockerfile
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- AGENT_ROLE=strategy
- N8N_WEBHOOK_URL=http://n8n:5678/webhook
volumes:
- shared-memory:/app/shared-memory:rw
- ./agents/strategy/CLAUDE.md:/app/CLAUDE.md:ro # read-only!
networks:
- agent-network
restart: unless-stopped
marketing-agent:
build:
context: .
dockerfile: agents/marketing/Dockerfile
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- AGENT_ROLE=marketing
volumes:
- shared-memory:/app/shared-memory:rw
- ./agents/marketing/CLAUDE.md:/app/CLAUDE.md:ro
networks:
- agent-network
restart: unless-stopped
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
volumes:
- n8n-data:/home/node/.n8n
networks:
- agent-network
restart: unless-stopped
volumes:
shared-memory:
n8n-data:
networks:
agent-network:
driver: bridge
Wichtig: .env Datei für Secrets. Alle Secrets (API Keys, Passwörter) in einer .env Datei — niemals direkt in docker-compose.yml. Die .env kommt in .gitignore (aber bleibt deployt auf dem Server).
# .env (auf dem Server, NICHT im Git für öffentliche Repos)
ANTHROPIC_API_KEY=sk-ant-...
N8N_USER=admin
N8N_PASSWORD=sicheres-passwort-hier
Shared Memory zwischen Agents
Agents müssen Daten austauschen können. Docker Volumes sind die sauberste Lösung:
# In jedem Agent: shared-memory Volume wird gemountet
volumes:
- shared-memory:/app/shared-memory:rw
# Strategy-Agent schreibt:
fs.writeFileSync('/app/shared-memory/strategy_status.md', statusUpdate);
# Marketing-Agent liest:
const status = fs.readFileSync('/app/shared-memory/strategy_status.md', 'utf8');
Deployment auf VPS
3Produktions-Deployment Workflow
# 1. Code auf Server kopieren
git clone git@github.com:dein-repo/agents.git /opt/agents
cd /opt/agents
# 2. .env erstellen (einmalig)
cp .env.example .env
nano .env # API Keys eintragen
# 3. Images bauen und starten
docker compose up -d --build
# 4. Logs prüfen
docker compose logs -f strategy-agent
# 5. Update deployen (Zero-Downtime)
git pull
docker compose up -d --build --no-deps strategy-agent
Health Checks und Monitoring
# docker-compose.yml — Health Check für jeden Agent
strategy-agent:
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/health')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Einfacher Health-Endpoint im Agent:
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/health') {
res.writeHead(200);
res.end(JSON.stringify({ status: 'ok', uptime: process.uptime() }));
}
}).listen(3000);
Security Checkliste für Container
- Non-root User: Agent läuft nicht als root im Container
- Read-only Filesystem:
read_only: true in docker-compose + explizite write Volumes
- No-new-privileges:
security_opt: ["no-new-privileges:true"]
- Resource Limits: CPU und Memory Limits setzen (
deploy.resources.limits)
- Network Isolation: Agents nur im internen Netz, kein direkter Public Access
- Secrets via .env: niemals Secrets im Image oder in Logs
Docker-Templates im Kurs
Im Claude Code Mastery Kurs findest du fertige Dockerfile + docker-compose.yml Templates für Single-Agent und Multi-Agent-Deployments — direkt für deinen VPS einsetzbar.
14 Tage kostenlos testen →