docs/docs/ko/install/docker.md
2026-04-30 06:59:05 +00:00

24 KiB

read_when summary title x-i18n
로컬 설치 대신 컨테이너화된 Gateway를 사용하려는 경우
Docker 흐름을 검증하고 있습니다
OpenClaw를 위한 선택적 Docker 기반 설정 및 온보딩 Docker
generated_at model provider source_hash source_path workflow
2026-04-30T06:36:57Z gpt-5.5 openai c67a6351afb09961ff3b2e95a132acff7f33b02d3b67330d4608c46e3c18f63a install/docker.md 16

Docker는 선택 사항입니다. 컨테이너화된 Gateway가 필요하거나 Docker 흐름을 검증하려는 경우에만 사용하세요.

Docker가 나에게 적합한가요?

  • : 격리된 일회용 Gateway 환경이 필요하거나 로컬 설치 없이 호스트에서 OpenClaw를 실행하려는 경우입니다.
  • 아니요: 자신의 머신에서 실행 중이고 가장 빠른 개발 루프만 원하는 경우입니다. 대신 일반 설치 흐름을 사용하세요.
  • 샌드박싱 참고: 기본 샌드박스 백엔드는 샌드박싱이 활성화된 경우 Docker를 사용하지만, 샌드박싱은 기본적으로 꺼져 있으며 전체 Gateway를 Docker에서 실행할 필요는 없습니다. SSH 및 OpenShell 샌드박스 백엔드도 사용할 수 있습니다. 샌드박싱을 참조하세요.

필수 조건

  • Docker Desktop(또는 Docker Engine) + Docker Compose v2
  • 이미지 빌드용 최소 2 GB RAM(pnpm install은 1 GB 호스트에서 종료 코드 137로 OOM 종료될 수 있음)
  • 이미지와 로그를 저장할 충분한 디스크 공간
  • VPS/공개 호스트에서 실행하는 경우 네트워크 노출 보안 강화, 특히 Docker DOCKER-USER 방화벽 정책을 검토하세요.

컨테이너화된 Gateway

저장소 루트에서 설정 스크립트를 실행하세요.
```bash
./scripts/docker/setup.sh
```

이 명령은 Gateway 이미지를 로컬에서 빌드합니다. 대신 미리 빌드된 이미지를 사용하려면 다음을 실행하세요.

```bash
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
./scripts/docker/setup.sh
```

미리 빌드된 이미지는
[GitHub Container Registry](https://github.com/openclaw/openclaw/pkgs/container/openclaw)에 게시됩니다.
일반적인 태그: `main`, `latest`, `<version>`(예: `2026.2.26`).
설정 스크립트는 온보딩을 자동으로 실행합니다. 수행 작업은 다음과 같습니다.
- provider API 키 입력 요청
- Gateway 토큰 생성 및 `.env`에 작성
- Docker Compose를 통해 Gateway 시작

설정 중에는 시작 전 온보딩과 구성 쓰기가
`openclaw-gateway`를 통해 직접 실행됩니다. `openclaw-cli`는
Gateway 컨테이너가 이미 존재한 뒤 실행하는 명령용입니다.
브라우저에서 `http://127.0.0.1:18789/`를 열고 구성된 공유 비밀을 Settings에 붙여넣으세요. 설정 스크립트는 기본적으로 토큰을 `.env`에 씁니다. 컨테이너 구성을 비밀번호 인증으로 전환한 경우에는 대신 해당 비밀번호를 사용하세요.
URL이 다시 필요하신가요?

```bash
docker compose run --rm openclaw-cli dashboard --no-open
```
CLI 컨테이너를 사용해 메시징 채널을 추가하세요.
```bash
# WhatsApp (QR)
docker compose run --rm openclaw-cli channels login

# Telegram
docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"

# Discord
docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"
```

문서: [WhatsApp](/ko/channels/whatsapp), [Telegram](/ko/channels/telegram), [Discord](/ko/channels/discord)

수동 흐름

설정 스크립트를 사용하는 대신 각 단계를 직접 실행하려면 다음을 사용하세요.

docker build -t openclaw:local -f Dockerfile .
docker compose run --rm --no-deps --entrypoint node openclaw-gateway \
  dist/index.js onboard --mode local --no-install-daemon
docker compose run --rm --no-deps --entrypoint node openclaw-gateway \
  dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'
docker compose up -d openclaw-gateway
저장소 루트에서 `docker compose`를 실행하세요. `OPENCLAW_EXTRA_MOUNTS` 또는 `OPENCLAW_HOME_VOLUME`을 활성화한 경우 설정 스크립트가 `docker-compose.extra.yml`을 작성합니다. `-f docker-compose.yml -f docker-compose.extra.yml`로 이를 포함하세요. `openclaw-cli`는 `openclaw-gateway`의 네트워크 네임스페이스를 공유하므로 시작 후 도구입니다. `docker compose up -d openclaw-gateway` 전에 온보딩과 설정 시점의 구성 쓰기를 `--no-deps --entrypoint node`와 함께 `openclaw-gateway`를 통해 실행하세요.

환경 변수

설정 스크립트는 다음 선택적 환경 변수를 허용합니다.

변수 목적
OPENCLAW_IMAGE 로컬 빌드 대신 원격 이미지 사용
OPENCLAW_DOCKER_APT_PACKAGES 빌드 중 추가 apt 패키지 설치(공백으로 구분)
OPENCLAW_EXTENSIONS 빌드 시 Plugin 의존성 미리 설치(공백으로 구분한 이름)
OPENCLAW_EXTRA_MOUNTS 추가 호스트 bind mount(쉼표로 구분한 source:target[:opts])
OPENCLAW_HOME_VOLUME 이름 있는 Docker 볼륨에 /home/node 영구 저장
OPENCLAW_PLUGIN_STAGE_DIR 생성된 번들 Plugin 의존성과 미러의 컨테이너 경로
OPENCLAW_SANDBOX 샌드박스 부트스트랩 사용 선택(1, true, yes, on)
OPENCLAW_SKIP_ONBOARDING 대화형 온보딩 단계 건너뛰기(1, true, yes, on)
OPENCLAW_DOCKER_SOCKET Docker 소켓 경로 재정의
OPENCLAW_DISABLE_BONJOUR Bonjour/mDNS 광고 비활성화(Docker의 기본값은 1)
OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS 번들 Plugin 소스 bind-mount 오버레이 비활성화
OTEL_EXPORTER_OTLP_ENDPOINT OpenTelemetry 내보내기용 공유 OTLP/HTTP collector endpoint
OTEL_EXPORTER_OTLP_*_ENDPOINT trace, metric 또는 log용 신호별 OTLP endpoint
OTEL_EXPORTER_OTLP_PROTOCOL OTLP 프로토콜 재정의. 현재는 http/protobuf만 지원됨
OTEL_SERVICE_NAME OpenTelemetry 리소스에 사용되는 서비스 이름
OTEL_SEMCONV_STABILITY_OPT_IN 최신 실험적 GenAI semantic attribute 사용 선택
OPENCLAW_OTEL_PRELOADED 하나가 미리 로드된 경우 두 번째 OpenTelemetry SDK 시작 건너뛰기

Maintainer는 Plugin 소스 디렉터리 하나를 패키징된 소스 경로 위에 마운트하여 패키징된 이미지에 대해 번들 Plugin 소스를 테스트할 수 있습니다. 예: OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro. 해당 마운트된 소스 디렉터리는 동일한 Plugin id에 대해 일치하는 컴파일된 /app/dist/extensions/synology-chat 번들을 재정의합니다.

관측성

OpenTelemetry 내보내기는 Gateway 컨테이너에서 OTLP collector로 나가는 방식입니다. 게시된 Docker 포트가 필요하지 않습니다. 이미지를 로컬에서 빌드하고 번들된 OpenTelemetry exporter를 이미지 안에서 사용할 수 있게 하려면 런타임 의존성을 포함하세요.

export OPENCLAW_EXTENSIONS="diagnostics-otel"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"
export OTEL_SERVICE_NAME="openclaw-gateway"
./scripts/docker/setup.sh

공식 OpenClaw Docker 릴리스 이미지에는 번들된 diagnostics-otel Plugin 소스가 포함됩니다. 이미지와 캐시 상태에 따라 Plugin이 처음 활성화될 때 Gateway가 여전히 Plugin 로컬 OpenTelemetry 런타임 의존성을 스테이징할 수 있으므로, 첫 부팅이 패키지 레지스트리에 도달하도록 허용하거나 릴리스 lane에서 이미지를 미리 워밍하세요. 내보내기를 활성화하려면 구성에서 diagnostics-otel Plugin을 허용하고 활성화한 다음 diagnostics.otel.enabled=true를 설정하거나 OpenTelemetry 내보내기의 구성 예시를 사용하세요. Collector 인증 헤더는 Docker 환경 변수가 아니라 diagnostics.otel.headers를 통해 구성됩니다.

Prometheus metric은 이미 게시된 Gateway 포트를 사용합니다. diagnostics-prometheus Plugin을 활성화한 다음 scrape하세요.

http://<gateway-host>:18789/api/diagnostics/prometheus

이 route는 Gateway 인증으로 보호됩니다. 별도의 공개 /metrics 포트나 인증되지 않은 reverse-proxy 경로를 노출하지 마세요. Prometheus metric을 참조하세요.

상태 확인

컨테이너 probe endpoint(인증 불필요):

curl -fsS http://127.0.0.1:18789/healthz   # liveness
curl -fsS http://127.0.0.1:18789/readyz     # readiness

Docker 이미지에는 /healthz를 ping하는 기본 제공 HEALTHCHECK가 포함되어 있습니다. 확인이 계속 실패하면 Docker는 컨테이너를 unhealthy로 표시하고 orchestration 시스템이 이를 다시 시작하거나 교체할 수 있습니다.

인증된 심층 상태 snapshot:

docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"

LAN과 loopback

scripts/docker/setup.sh는 기본적으로 OPENCLAW_GATEWAY_BIND=lan을 사용하므로 Docker 포트 게시를 통해 http://127.0.0.1:18789에 대한 호스트 접근이 작동합니다.

  • lan(기본값): 호스트 브라우저와 호스트 CLI가 게시된 Gateway 포트에 도달할 수 있습니다.
  • loopback: 컨테이너 네트워크 네임스페이스 안의 프로세스만 Gateway에 직접 도달할 수 있습니다.
`gateway.bind`에는 호스트 별칭인 `0.0.0.0` 또는 `127.0.0.1`가 아니라 bind mode 값(`lan` / `loopback` / `custom` / `tailnet` / `auto`)을 사용하세요.

호스트 로컬 provider

OpenClaw가 Docker에서 실행될 때 컨테이너 안의 127.0.0.1은 호스트 머신이 아니라 컨테이너 자체입니다. 호스트에서 실행되는 AI provider에는 host.docker.internal을 사용하세요.

Provider 호스트 기본 URL Docker 설정 URL
LM Studio http://127.0.0.1:1234 http://host.docker.internal:1234
Ollama http://127.0.0.1:11434 http://host.docker.internal:11434

번들된 Docker 설정은 이러한 호스트 URL을 LM Studio 및 Ollama 온보딩 기본값으로 사용하며, docker-compose.yml은 Linux Docker Engine에서 host.docker.internal을 Docker의 호스트 Gateway에 매핑합니다. Docker Desktop은 macOS 및 Windows에서 이미 동일한 호스트 이름을 제공합니다.

호스트 서비스도 Docker에서 도달할 수 있는 주소에서 수신해야 합니다.

lms server start --port 1234 --bind 0.0.0.0
OLLAMA_HOST=0.0.0.0:11434 ollama serve

자체 Compose 파일이나 docker run 명령을 사용하는 경우, 예를 들어 --add-host=host.docker.internal:host-gateway처럼 동일한 호스트 매핑을 직접 추가하세요.

Bonjour / mDNS

Docker bridge 네트워킹은 일반적으로 Bonjour/mDNS multicast (224.0.0.251:5353)를 안정적으로 전달하지 않습니다. 따라서 번들된 Compose 설정은 기본적으로 OPENCLAW_DISABLE_BONJOUR=1을 사용하여 bridge가 multicast traffic을 버릴 때 Gateway가 crash-loop에 빠지거나 광고를 반복적으로 다시 시작하지 않게 합니다.

Docker 호스트에는 게시된 Gateway URL, Tailscale 또는 광역 DNS-SD를 사용하세요. host networking, macvlan 또는 mDNS multicast가 작동하는 것으로 알려진 다른 네트워크에서 실행하는 경우에만 OPENCLAW_DISABLE_BONJOUR=0을 설정하세요.

주의 사항과 문제 해결은 Bonjour 검색을 참조하세요.

스토리지와 영구 저장

Docker Compose는 OPENCLAW_CONFIG_DIR/home/node/.openclaw에, OPENCLAW_WORKSPACE_DIR/home/node/.openclaw/workspace에 bind-mount하므로 해당 경로는 컨테이너 교체 후에도 유지됩니다. 두 변수 중 하나가 설정되지 않은 경우 번들된 docker-compose.yml${HOME}/.openclaw(workspace mount의 경우 ${HOME}/.openclaw/workspace)로 대체하고, HOME 자체도 없으면 /tmp/.openclaw로 대체합니다. 이렇게 하면 bare 환경에서 docker compose up이 빈 source volume spec을 출력하지 않습니다.

해당 마운트된 구성 디렉터리는 OpenClaw가 다음 항목을 보관하는 위치입니다.

  • 동작 구성을 위한 openclaw.json
  • 저장된 provider OAuth/API-key 인증을 위한 agents/<agentId>/agent/auth-profiles.json
  • OPENCLAW_GATEWAY_TOKEN 같은 env 기반 런타임 비밀을 위한 .env

번들된 Plugin 런타임 종속성과 미러링된 런타임 파일은 사용자 구성이 아니라 생성된 상태입니다. Compose는 이를 /var/lib/openclaw/plugin-runtime-deps에 마운트된 이름 있는 Docker 볼륨 openclaw-plugin-runtime-deps에 저장합니다. 변경이 잦은 이 트리를 호스트 구성 바인드 마운트 밖에 두면 콜드 Gateway 시작 중 느린 Docker Desktop/WSL 파일 작업과 오래된 Windows 핸들을 피할 수 있습니다.

기본 Compose 파일은 openclaw-gatewayopenclaw-cli 모두에 대해 OPENCLAW_PLUGIN_STAGE_DIR을 해당 경로로 설정하므로 openclaw doctor --fix, 채널 로그인/설정 명령, Gateway 시작이 모두 동일한 생성 런타임 볼륨을 사용합니다.

VM 배포의 전체 지속성 세부 정보는 Docker VM 런타임 - 무엇이 어디에 유지되는지를 참조하세요.

디스크 증가 핫스팟: media/, 세션 JSONL 파일, cron/runs/*.jsonl, openclaw-plugin-runtime-deps Docker 볼륨, /tmp/openclaw/ 아래의 순환 파일 로그를 주시하세요.

셸 도우미(선택 사항)

일상적인 Docker 관리를 더 쉽게 하려면 ClawDock을 설치하세요.

mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.sh
echo 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrc

이전 scripts/shell-helpers/clawdock-helpers.sh 원시 경로에서 ClawDock을 설치했다면, 로컬 도우미 파일이 새 위치를 따라가도록 위 설치 명령을 다시 실행하세요.

그런 다음 clawdock-start, clawdock-stop, clawdock-dashboard 등을 사용하세요. 모든 명령은 clawdock-help를 실행해 확인하세요. 전체 도우미 가이드는 ClawDock을 참조하세요.

```bash export OPENCLAW_SANDBOX=1 ./scripts/docker/setup.sh ```
사용자 지정 소켓 경로(예: rootless Docker):

```bash
export OPENCLAW_SANDBOX=1
export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock
./scripts/docker/setup.sh
```

스크립트는 샌드박스 전제 조건을 통과한 후에만 `docker.sock`을 마운트합니다. 샌드박스 설정을 완료할 수 없으면 스크립트가 `agents.defaults.sandbox.mode`를 `off`로 재설정합니다.
`-T`로 Compose 의사 TTY 할당을 비활성화합니다.
```bash
docker compose run -T --rm openclaw-cli gateway probe
docker compose run -T --rm openclaw-cli devices list --json
```
`openclaw-cli`는 CLI 명령이 `127.0.0.1`을 통해 Gateway에 도달할 수 있도록 `network_mode: "service:openclaw-gateway"`를 사용합니다. 이를 공유 신뢰 경계로 취급하세요. compose 구성은 `openclaw-cli`에서 `NET_RAW`/`NET_ADMIN`을 제거하고 `no-new-privileges`를 활성화합니다. 이미지는 `node`(uid 1000)로 실행됩니다. `/home/node/.openclaw`에서 권한 오류가 표시되면 호스트 바인드 마운트가 uid 1000 소유인지 확인하세요.
```bash
sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspace
```
종속성 레이어가 캐시되도록 Dockerfile 순서를 구성하세요. 이렇게 하면 lockfile이 변경되지 않는 한 `pnpm install`을 다시 실행하지 않습니다.
```dockerfile
FROM node:24-bookworm
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"
RUN corepack enable
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]
```
기본 이미지는 보안을 우선하며 non-root `node`로 실행됩니다. 더 많은 기능을 갖춘 컨테이너를 원한다면:
1. **`/home/node` 유지**: `export OPENCLAW_HOME_VOLUME="openclaw_home"`
2. **시스템 종속성 베이크**: `export OPENCLAW_DOCKER_APT_PACKAGES="git curl jq"`
3. **Playwright 브라우저 설치**:
   ```bash
   docker compose run --rm openclaw-cli \
     node /app/node_modules/playwright-core/cli.js install chromium
   ```
4. **브라우저 다운로드 유지**: `PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwright`를 설정하고 `OPENCLAW_HOME_VOLUME` 또는 `OPENCLAW_EXTRA_MOUNTS`를 사용하세요.
마법사에서 OpenAI Codex OAuth를 선택하면 브라우저 URL이 열립니다. Docker 또는 헤드리스 설정에서는 도착한 전체 리디렉션 URL을 복사해 마법사에 다시 붙여 넣어 인증을 완료하세요. 기본 Docker 런타임 이미지는 `node:24-bookworm-slim`을 사용하며 `org.opencontainers.image.base.name`, `org.opencontainers.image.source` 등을 포함한 OCI 기본 이미지 주석을 게시합니다. Node 기본 다이제스트는 Dependabot Docker 기본 이미지 PR을 통해 갱신되며, 릴리스 빌드는 배포판 업그레이드 레이어를 실행하지 않습니다. [OCI 이미지 주석](https://github.com/opencontainers/image-spec/blob/main/annotations.md)을 참조하세요.

VPS에서 실행하시나요?

바이너리 베이크, 지속성, 업데이트를 포함한 공유 VM 배포 단계는 Hetzner(Docker VPS)Docker VM 런타임을 참조하세요.

에이전트 샌드박스

Docker 백엔드로 agents.defaults.sandbox를 활성화하면, Gateway 자체는 호스트에 유지하면서 Gateway가 에이전트 도구 실행(셸, 파일 읽기/쓰기 등)을 격리된 Docker 컨테이너 안에서 실행합니다. 이를 통해 전체 Gateway를 컨테이너화하지 않고도 신뢰할 수 없거나 멀티 테넌트 에이전트 세션 주변에 강한 장벽을 둘 수 있습니다.

샌드박스 범위는 에이전트별(기본값), 세션별 또는 공유로 설정할 수 있습니다. 각 범위는 /workspace에 마운트된 자체 워크스페이스를 가집니다. 허용/거부 도구 정책, 네트워크 격리, 리소스 제한, 브라우저 컨테이너도 구성할 수 있습니다.

전체 구성, 이미지, 보안 참고 사항, 멀티 에이전트 프로필은 다음을 참조하세요.

빠른 활성화

{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // off | non-main | all
        scope: "agent", // session | agent | shared
      },
    },
  },
}

기본 샌드박스 이미지를 빌드합니다.

scripts/sandbox-setup.sh

문제 해결

[`scripts/sandbox-setup.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/sandbox-setup.sh)로 샌드박스 이미지를 빌드하거나 `agents.defaults.sandbox.docker.image`를 사용자 지정 이미지로 설정하세요. 컨테이너는 필요할 때 세션별로 자동 생성됩니다. `docker.user`를 마운트된 워크스페이스 소유권과 일치하는 UID:GID로 설정하거나 워크스페이스 폴더의 소유자를 변경하세요. OpenClaw는 `/etc/profile`을 소싱하고 PATH를 재설정할 수 있는 `sh -lc`(로그인 셸)로 명령을 실행합니다. 사용자 지정 도구 경로를 앞에 추가하도록 `docker.env.PATH`를 설정하거나 Dockerfile의 `/etc/profile.d/` 아래에 스크립트를 추가하세요. VM에는 최소 2GB RAM이 필요합니다. 더 큰 머신 클래스를 사용한 뒤 다시 시도하세요. 새 대시보드 링크를 가져오고 브라우저 기기를 승인하세요.
```bash
docker compose run --rm openclaw-cli dashboard --no-open
docker compose run --rm openclaw-cli devices list
docker compose run --rm openclaw-cli devices approve <requestId>
```

자세한 내용: [대시보드](/ko/web/dashboard), [기기](/ko/cli/devices).
Gateway 모드와 바인드를 재설정하세요.
```bash
docker compose run --rm openclaw-cli config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"}]'
docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789
```

관련 항목