2026 OpenClaw Docker 네트워크 트리아지 체크리스트
CLI가 Gateway에 닿지 않을 때—Compose, 바인드·네임스페이스

약 22분 읽기 · MACCOME

Docker Compose에서 OpenClaw를 운영하는 팀은 이미지 pull 실패로 무너지는 경우는 드뭅니다. Gateway 로그는 멀쩡한데 브라우저나 CLI는 connection refused, WebSocket 핸드셰이크 실패, 토큰 오류를 보고하는 경우가 많으며, 원인은 리슨 주소(바인드), 포트 게시, CLI가 Gateway 네트워크 네임스페이스를 공유하는지 여부인 경우가 많고 모델 API 키만의 문제는 아닙니다. 본문에서는 온콜 증상 클래스 여섯 가지, 「안 떠 있음」 대 「떠 있으나 라우팅 불가」 매트릭스 두 개, 바인드·방화벽·게시 맵, 복붙 진단, 여섯 단계 런북, 로그 KPI 세 가지를 정리합니다. Docker 프로덕션 런북, 설치 후 doctor 트리아지, Kubernetes 프로브 가이드와 짝을 이룹니다. 프로덕션 글은 배포 방법을 답하고, 본문은 컨테이너가 생각한 대로 서로나 호스트를 보지 못하는 이유를 답합니다.

토큰 버그로 위장하는 여섯 가지 패턴

제어 평면은 Gateway WebSocket/HTTPCLI·Control UI, 그리고 여러 컨테이너·커스텀 브리지·network_mode: service:...를 함께 씁니다. 층을 나누어 트리아지하지 않으면 팀은 리스너가 CLI 네임스페이스에서 도달 가능한지 확인하기 전에 .openclaw 파일만 돌게 됩니다.

  1. 루프백 전용 리슨: Gateway가 컨테이너 안에서 127.0.0.1에만 바인드하고, 호스트는 게시 포트로 닿는데 같은 compose의 다른 서비스는 다른 경로를 탑니다.
  2. CLI와 Gateway의 네임스페이스 분리: CLI는 브리지 DNS로 gateway:18789를 해석하고, Gateway는 공유 서비스 스택에 루프백만 노출하는 전형적인 「한 번은 되다 재시작 후 깨짐」입니다.
  3. 낡은 게시 포트: 호스트 curl은 간헐적으로 성공하고, 롤링 업그레이드 후 오래된 NAT 규칙이 남으면 컨테이너 내부 프로브는 실패합니다.
  4. 호스트 방화벽 대 docker0 포워딩: localhost 브라우저는 되고 CLI 컨테이너는 안 됩니다.
  5. WebSocket 업그레이드가 빠진 리버스 프록시: 핸드셰이크 오류를 Gateway 크래시로 오인합니다(systemd·Tunnel 가이드 참고).
  6. 듀얼 스택 이슈: ::1 또는 슬림 이미지에서 잘못된 AAAA 레코드.

볼륨·이미지 digest·프로덕션 헬스 체크와 같은 변경 티켓에 도달 가능성 대 버전 정확성을 함께 적습니다.

compose 저장소에 한 페이지짜리 네트워크 토폴로지를 유지합니다. 어떤 서비스가 어떤 네트워크에 있고, 누가 포트를 게시하는지, 개발 노트북과 CI가 스택을 어떻게 프로브하는지입니다. 커스텀 네트워크의 DNS는 기본 브리지와 다릅니다. 서비스 이름이 실패하면 OpenClaw를 탓하기 전에 컨테이너 안에서 getent hostsnslookup을 실행합니다.

표 1: 안 떠 있음 대 떠 있으나 라우팅 불가

먼저 공식 doctorgateway status를 실행합니다(설치 후 가이드 참고). 리스너 존재를 모른 채 토큰을 돌리지 않습니다.

신호추정 분류첫 조치안티 패턴
Gateway 컨테이너 없음 또는 CrashLoop기동 안 됨docker logs, OOM, 프로브가 파드 종료리소스 점검 없이 끝없는 pull
떠 있으나 내부 ss 리스너 없음설정·바인드 실패OPENCLAW_GATEWAY_BIND와 compose command를 문서와 대조호스트 /etc/hosts만 수정
리스너는 OK, CLI wget 실패크로스 네임스페이스 라우팅network_mode: "service:openclaw-gateway" 검토위협 모델 없이 맹목적 0.0.0.0
호스트 브라우저 실패, 컨테이너 성공게시·프록시ports:, VPN, PAC 검증TLS를 임의로 끄기

표 2: 바인드, 게시, 방화벽(Docker 전용)

공식 gateway.bind 값(loopback, lan, tailnet, auto 등)에 맞추고, compose에는 누가 포트를 게시하는지도 명시합니다.

목표바인드·환경 의도Compose 메모보안
로컬 노트북만루프백 우선, 호스트는 게시 포트로 접속127.0.0.1:18789:18789다른 compose 서비스가 루프백 도달을 물려받는다고 가정하지 않습니다
CLI를 Gateway에 강하게 결합네트워크 스택 공유network_mode: "service:openclaw-gateway"포트 공간 공유—중복 바인드 주의
LAN 디버깅lan 또는 동등 설정0.0.0.0과 특정 NIC 바인드를 명시적으로 구분상위 방화벽 규칙과 짝을 이룹니다
Tunnel·리버스 프록시Gateway 루프백, TLS는 엣지네트워크 분리, WebSocket 통과 검증공인 인터넷에 관리 포트를 노출하지 않습니다
bash
# 1) 호스트: 포트가 실제로 게시됐는지
docker compose ps
curl -sv --max-time 2 http://127.0.0.1:18789/  || true

# 2) gateway 컨테이너 내부
docker compose exec openclaw-gateway sh -lc 'ss -lntp 2>/dev/null || netstat -lntp'

# 3) CLI 컨테이너에서(서비스명은 환경에 맞게 변경)
docker compose exec openclaw-cli sh -lc 'wget -qO- --timeout=2 http://openclaw-gateway:18789/ || echo FAIL'

# 4) 실효 compose 확인
docker compose config | sed -n '1,200p'
warning

유의: 커뮤니티 사례에서 「CLI가 Gateway에 닿지 않음」은 CLI를 Gateway 네트워크 네임스페이스에 두지 않은 compose와 연결됩니다. 프로덕션에 머지하기 전에 테스트 스택에서 위 명령 블록으로 증명합니다.

여섯 단계 런북

설치 경로가 불명확하면 세 플랫폼 설치 가이드부터 시작합니다.

  1. Compose 고정: Gateway, CLI(있다면), 볼륨, 환경 변수를 Git에 커밋합니다.
  2. doctor·gateway status: 버전과 토큰 파일 개수를 맞춥니다.
  3. 표 1로 분류: 컨테이너가 떠 있으면 리스너와 컨테이너 간 프로브를 봅니다.
  4. 표 2로 바인드·network_mode 조정: 한 번에 한 변수만 바꾸고 출력을 보관합니다.
  5. Tunnel·프록시 뒤라면: Gateway TLS를 건드리기 전에 Upgrade 헤더와 경로 rewrite를 검증합니다.
  6. 인수인계 메모: 리슨 삼중선(주소·프로세스·서비스명), 네임스페이스 공유 여부, 성공한 프로브 스니펫 하나를 문서화합니다.

로그·알림 KPI 세 가지

동일 스택을 오케스트레이션으로 올릴 때 Kubernetes 헬스 체크 글의 HTTP 프로브와 호환됩니다.

  1. 리슨 삼중선: 컨테이너 ss 로컬 주소, 프로세스 이름, compose 서비스—변경은 티켓으로 남깁니다.
  2. 크로스 네임스페이스 프로브 버킷: 성공·타임아웃·DNS 실패는 서로 다른 근본 원인입니다.
  3. 게시 포트 일관성: 롤아웃 후 docker port와 iptables NAT—2026년에도 낡은 체인이 물고 늘어집니다.

Gateway 로그에서 핸드셰이크 실패업스트림 429/5xx를 분리해 태깅합니다. 후자가 우세하면 공급자 페일오버 가이드로 전환합니다.

HTTP 프로브가 루프백만 보고 사용자 트래픽은 다른 인터페이스로 들어오면 프로브는 전부 녹색인데 사용자는 전부 적색이 될 수 있습니다. 릴리스를 탓하기 전에 표 2의 바인드 정책과 프로브 URL을 맞춥니다.

노트북만으로는 장기 제어 평면이 버거운 이유

Docker Desktop 절전, VPN 토글, 로컬 프록시는 localhost 해석을 바꿉니다. 프로덕션형 자동화에는 재현 가능한 리슨 정책, 감사 가능한 compose 리비전, 안정적인 호스트 경계가 필요합니다. 임시 노트북은 멀티리전 이그레스와 베어메탈 격리를 거의 제공하지 못해 상시 Gateway 기대와 충돌합니다.

도달 가능한 당번 제어 평면이 필요한 팀은 Gateway를 전문 클라우드 Mac에 두는 편이 개인 장비보다 낫습니다. MACCOME은 싱가포르·일본·한국·홍콩·미 동부·미 서부에 Mac Mini M4 / M4 Pro 베어메탈 노드를 제공합니다. 네트워크 트리아지 후 SSH 대 VNC를 고객 센터와 함께 보고, 대여 요금과 지역 페이지로 마무리합니다.

전용 테스트 호스트에서 파일럿하고 로그를 보관한 뒤 공유 compose 저장소로 승격합니다. network_mode를 구두로만 전수하지 않습니다.

임시 0.0.0.0 바인드는 문서화된 롤백과 노출 검토가 필요합니다. 트리아지는 리슨 범위를 키우는 것이 아니라 누가 제어 평면을 봐야 하는지를 네임스페이스 설계와 맞추는 데 목적이 있습니다.

자주 묻는 질문

Docker 프로덕션 런북과 무엇이 다른가요?

프로덕션 글은 이미지·볼륨·롤아웃을 다룹니다. 본문은 도달 가능성을 다룹니다. 고객 센터프로덕션 런북을 함께 씁니다.

WSL2에서도 같은 매트릭스가 적용되나요?

작업 순서는 같고 localhost 포워딩은 다릅니다. WSL2 트리아지 글을 위에 겹쳐 읽습니다.

지역과 대여 조건은 어디서 읽나요?

Gateway를 클라우드 Mac으로 옮길 때 멀티리전 가이드대여 요금을 보고 SSH 이그레스를 고정하기 전에 맞춥니다.