ZeroClaw 멀티 에이전트 시스템: Docker Compose를 활용한 로컬 테스트 환경 구축 가이드

ZeroClaw 멀티 에이전트 시스템: Docker Compose를 활용한 로컬 테스트 환경 구축 가이드

최근 [ZeroClaw] 프로젝트를 통해 고성능 Rust 에이전트 런타임과 멀티 에이전트 아키텍처를 설계하며, 개별 에이전트의 격리성과 통신 안정성의 중요성을 실감했습니다. 특히 **[blog-api-server]**와 같이 외부 API와 연동되는 MCP(Model Context Protocol) 클라이언트를 개발할 때, 로컬 환경에서 실제 운영 환경과 유사한 구조를 갖춰 테스트하는 것은 필수적입니다.

이번 포스트에서는 복잡한 멀티 에이전트 시스템을 로컬에서 쉽게 실행하고 디버깅할 수 있도록 Docker Compose를 활용한 테스트 환경 구축 방법을 공유합니다. 본 가이드는 Linux 환경(예: Ubuntu 16.04에서 FreeBSD로 이전 중인 서버 등)을 기반으로 하지만, Windows와 macOS에서도 동일하게 적용 가능합니다.

1. 아키텍처 설계: 마이크로서비스형 에이전트 구조

ZeroClaw의 핵심은 파일 기반 아키텍처와 게이트웨이 패턴을 차용한 통신 플랫폼입니다. 각 에이전트를 독립된 마이크로서비스로 간주하고, 이들을 Docker 컨테이너로 격리합니다.

구성 요소

  • Agent Container: Rust로 작성된 개별 에이전트 (ZeroClaw Runtime 기반)
  • Gateway Container: 외부 요청을 내부 에이전트로 라우팅하는 Nginx 또는 Envoy
  • Message Broker (Optional): RabbitMQ 또는 Redis (비동기 통신 필요 시)

2. Dockerfile 작성: Rust 에이전트 최적화

Rust 애플리케이션은 컴파일 시간이 오래 걸리므로, Multi-stage build를 사용하여 최종 이미지 크기를 줄이고 빌드 캐싱을 최적화해야 합니다.

# Dockerfile

# 1. Build Stage
FROM rust:1.75-slim as builder

WORKDIR /app

# 의존성 캐싱을 위해 Cargo.toml과 Cargo.lock 먼저 복사
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release && rm -rf src

# 실제 소스 코드 복사 및 빌드
COPY src ./src
RUN touch src/main.rs && cargo build --release

# 2. Runtime Stage
FROM debian:bookworm-slim

# 런타임 의존성 설치 (예: OpenSSL)
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 빌드된 바이너리 복사
COPY --from=builder /app/target/release/zero-claw-agent /app/agent

# 실행 권한 부여
RUN chmod +x /app/agent

# 포트 노출 (MCP 통신용)
EXPOSE 8080

CMD ["/app/agent"]

3. Docker Compose로 오케스트레이션 구성

docker-compose.yml 파일을 사용하여 여러 에이전트와 네트워크를 정의합니다. 이를 통해 docker-compose up 하나로 전체 시스템을 기동할 수 있습니다.

# docker-compose.yml
version: '3.8'

services:
  # 메시지 브로커 (선택 사항, 통신 프로토콜에 따라 사용)
  redis:
    image: redis:7-alpine
    container_name: zero-claw-redis
    ports:
      - "6379:6379"
    networks:
      - zero-claw-net

  # Agent 1: Blog Handler (blog-api-server 역할)
  blog-agent:
    build:
      context: ./services/blog-agent
      dockerfile: Dockerfile
    container_name: zero-claw-blog-agent
    environment:
      - AGENT_ID=blog-agent-01
      - LOG_LEVEL=debug
      - MCP_SERVER_URL=http://mock-api:3000
    depends_on:
      - redis
    networks:
      - zero-claw-net
    restart: unless-stopped

  # Agent 2: Monitor (Cloud Monitor 역할)
  monitor-agent:
    build:
      context: ./services/monitor-agent
      dockerfile: Dockerfile
    container_name: zero-claw-monitor-agent
    environment:
      - AGENT_ID=monitor-agent-01
    depends_on:
      - redis
    networks:
      - zero-claw-net
    restart: unless-stopped

  # Gateway (Discord MCP Gateway 역할)
  gateway:
    image: nginx:alpine
    container_name: zero-claw-gateway
    ports:
      - "8080:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - blog-agent
      - monitor-agent
    networks:
      - zero-claw-net

networks:
  zero-claw-net:
    driver: bridge

4. 실행 및 테스트

이제 다음 명령어로 전체 시스템을 실행할 수 있습니다.

# 빌드 및 백그라운드 실행
docker-compose up --build -d

# 로그 확인 (특정 에이전트 집중 모니터링)
docker-compose logs -f blog-agent

# 트래픽 테스트 (Gateway를 통한 요청)
curl -X POST http://localhost:8080/api/v1/agent/blog/ping \
  -H "Content-Type: application/json" \
  -d '{"message": "Hello from ZeroClaw"}'

5. 마치며

이 구조를 활용하면 **[ZeroClaw]**의 멀티 에이전트 통신 프로토콜을 변경하거나, [LLM] 설정을 에이전트별로 주입하여 테스트하는 작업이 훨씬 수월해집니다. 특히 docker-compose.yml의 환경 변수만 수정하면 운영 환경 배포 스크립트와 로컬 테스트 환경을 거의 동일하게 유지할 수 있어 “It works on my machine” 문제를 해결할 수 있습니다.

다음 포스트에서는 이 환경에서 수집된 로그를 **[Loki]**나 **[Prometheus]**를 통해 시각화하는 방법을 다루어 보겠습니다.

Hugo로 만듦
JimmyStack 테마 사용 중