西川和久の不定期コラム

話題のAIエージェント「OpenClaw」入門。Dockerを使い安全にセットアップ

 OpenClawは、PCを実際に操作できるOSSのAIエージェントだ。便利な一方で、OSそのものをAIに触らせることになるため、セキュリティ面の議論も多かった。今回はDockerを使った比較的安全な構成でセットアップし、実際にどこまで使えるのかを前編/後編に分け試してみたい。

OpenClawって何!?

 AIエージェントとは、指示を受ける「エンジン(LLM)」と、実際にPCやOSを操作する「ツール(ファイル操作やコマンド実行)」を組み合わせ、自律的に思考と実行のループを繰り返すAIの仕掛けのこと。OpenClawの場合、主に以下のような基本操作に対応している。

  • list / search (探索)
  • read / more (コンテキストの維持と節約)
  • write / edit (ファイルの変更)
  • bash (コマンド実行・検証)

 外部コマンドの実行を含め、「何をどう組み合わせてゴールに達するか」はすべてAIが判断する。OpenClawはその自律性の高さで一躍時の人となったエージェントの1つだ。その怒涛の歴史を簡単に振り返ってみると……。

  • 2025年11月: オーストリアの開発者 Peter Steinberger 氏が初期版(Warelay)をリリース。その後「Clawdbot」へ
  • 2026年1月29日: Anthropicとの商標紛争による一時的な改名(Moltbot)を経て、正式に「OpenClaw」となる
  • 2026年2月: GitHubスター数が10万を突破。開発者コミュニティで一気にバイラル化(その後作者はOpenAIへ移籍)
  • 2026年3月: スター数は24万を超え、中旬にはNVIDIAがセキュリティを強化したスタック「NemoClaw」を公開
  • 2026年6月2日: MicrosoftがBuild 2026でOpenClaw runs natively on Windows leveraging MXC(隔離レイヤー)発表

 当初のOpenClawは、WhatsAppやTelegram、SlackなどのメッセージングアプリをメインUIとし、出先から自宅のPCに指示を出して操作させるようなユースケースを想定していた。指定時間にタスクを走らせるcron的な機能が仕込まれているのもその名残だ。

 その後、CLI(TUI)を経てWebUIが搭載されたが、メッセージングアプリ連携や常時稼働のcron機能を使わなければ、「ChatGPTのCo-work機能や、Claude Code、Open Code等の公式ツールをエージェントとして使うのと何が違うのか?」という疑問も湧いてくる。

 いずれにしてもOSそのままの環境をAIに触らせるリスク懸念もあり、初期の熱狂から、現在は「いかに安全に実務に組み込むか」という冷静な検証フェーズに移った感じだ。

 ちなみに必要なハードウェアだが、海外ではなぜか「Mac mini」がOpenClawの代名詞(中古市場の在庫が消えるほど)として語られていたが、Windows / macOS / Ubuntuが動けば何でもいい。外部APIを使うだけなら制御側の負荷は低く、メモリも8GB以上あれば動作する(筆者所有のMacBook Neoでも動作を確認)。

Dockerか直入れか、インストール方法で異なるセキュリティと利便性

 さて、ここからが本題だ。先ほど「いかに安全に実務に組み込むか」というのが課題だと述べたが、OSにOpenClawを直入れするのではなくDockerを使用すれば、AIがアクセスできる範囲を大幅に限定できる。AIが指示を誤認して大事なファイルを消し去るような大事故を防げるため、普段使いのマシンでも安全に試すことが可能だ。

 上記にある、Microsoftが隔離レイヤーでOpenClawに対応もまさに同じ流れ。エンジニアが直入れして使うならまだしも、一般的なビジネスユーザー向けには、まず隔離環境で使うことを前提にした設計思想なのかもしれない。

OSへ直入れしたときのイメージ / Dockerを使った場合のイメージ

 パッと見て違いが分かるように図にしたのがこの2つとなる。直入れだとOS上でOpenClawが動くため何でもあり。つまり、セキュリティ的に危ないというのがお分かりいただけたと思う。一方Docker環境ではアクセスが限定的なのでより安全だ。

 ただしDockerの場合はトレードオフがある。たとえば「このフォルダにある、これとこれと、こっちのフォルダにあるこれ、まとめて1つのパワポに……」的なことはできないのだ。Dockerの場合、コンテナがマウントしたフォルダ(通常~/.openclaw/workspace/)直下しか使えないためだ。このような作業をしたい場合、workspaceへ必要なファイルをコピーする必要がある。

 それは面倒、意味がないとなる場合は、直入れとなるが、筆者的にはセキュリティ面でお勧めできないので、今回はDockerでのインストール方法のみご紹介したい。

 とはいえ、Dockerの場合、インストール方法はそれほど難しくない。まず事前にDocker(Desktop)をインストールする。

WindowsとmacOSの場合

 Docker Desktopをダウンロードしてインストール

 なお、Build 2026で面白いものが発表された。WSL containersだ。従来Windows版のDocker DesktopはWSL2と併用して動いていた。しかしこのWSL containersを使うとWSL2と併用自体は変わらないのだが、地味に重いDocker Desktopが不要になる。他社製か自社製かの安心感?もあるだろう。

 余談になるが、もう1つCoreutils for Windowsも発表された。これはUnixのcpなどのコマンド系一式、Windowsで使えるようにするもの。ただしshell系は含まれていない。インストールはPowerShell(管理者)で

winget install Microsoft.Coreutils

を実行すればOKだ。これらのコマンド内でpathを指定する分には¥でなく/で扱うこともできる。主にmacOSとUbuntuを使いたまにWindowsを使う筆者は、CMDでlsとか打ってしまうので、これはこれでありがたい。

Ubuntuは24.04 LTS場合

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt install docker-ce docker-ce-cli containerd.io
$ sudo apt install docker-compose-plugin
$ sudo usermod -aG docker $USER

OpenClawのセットアップへ

 前置きが長くなってしまったが、これでDocker(Desktop)の準備は完了。続いてはOpenClawのインストールとなるが、手順は以下の通り。適当なフォルダに移動し(gitコマンドがない時は事前にインストール)、

$ git clone https://github.com/openclaw/openclaw
$ cd openclaw
$ git checkout v2026.5.28
※ その時点のリリース版に合わす(入校日にv2026.6.1リリース)
設定を編集
$ cp .env.example .env
※ サイト検索しやすいようにPlaywrightを入れるため追記(どこでもOK。最後にでも)
OPENCLAW_INSTALL_BROWSER=1
OPENCLAW_IMAGE_PIP_PACKAGES=playwright-stealth
※ Windowsに限り以下を追記
OPENCLAW_CONFIG_DIR=C:\Users\<ユーザー名>\.openclaw
OPENCLAW_WORKSPACE_DIR=C:\Users\<ユーザー名>\.openclaw\workspace
OPENCLAW_AUTH_PROFILE_SECRET_DIR=C:\Users\<ユーザー名>\.openclaw-auth-profile-secrets
Dockerコンテナの設定を変更
$ vi docker-compose.override.yml
※ 新規作成。Windowsの場合、メモ帳などで書いてもいい

services:
  openclaw-gateway:
    build:
      context: .
      args:
        OPENCLAW_INSTALL_BROWSER: ${OPENCLAW_INSTALL_BROWSER:-}
        OPENCLAW_IMAGE_PIP_PACKAGES: ${OPENCLAW_IMAGE_PIP_PACKAGES:-}
※ Playwrightが使えるよう、先の.envの値をbuild時有効にする

 設定で記述しているPlaywrightはブラウザを自動操作するライブラリだ。通常のcurlやrequestsではHTMLを取得するだけ。しかし、PlaywrightはChromiumなど実際のブラウザを動かすため、JavaScriptで生成されるコンテンツも取得可能、ボタンクリックやフォーム入力など操作可能、人間がブラウザで見るのと同じ状態のページを取得できるという特徴を持つ。そして、playwright-stealthはブラウザが自動操作であることを隠す機能を追加するものだ。

 つまり、これはよりAIエージェントが確実にサイトの情報を得ることができる仕掛けだ。これがあるとより便利に使えるため、あらかじめセットしておく。

 OpenClawではDockerfileにオプションの記述はあるものの、docker-compose.ymlで有効になってないため、docker-compose.override.ymlを使い追加している。

 続けてビルドを行なう。使う環境(PC)にもよるが結構時間がかかる。なおmacOSの場合、初回ビルド時にキーチェーンがロックされているとDocker Hubの認証情報が取得できずビルドが失敗する場合がある。その場合、

% security -v unlock-keychain ~/Library/Keychains/login.keychain-db

を実行してキーチェーンをアンロックすること。

$ docker compose up --build
※ Run `openclaw setup`の文字が連続で見えたら^Cで一旦Dockerを抜ける
ちょっと雑なやり方だが`openclaw setup`の文字が連続で見えたらCtrl+CでいったんDockerを抜ける

 本来セットアップは./scripts/docker/setup.shを動かすのだが、Windowsは非対応。これを実行すると、ビルド後、

~/.openclaw/openclaw.json

を作る簡単な問い合わせが入る。Windowsの場合は、

%USERPROFILE%\.openclaw\openclaw.json

ここになる。ただ、サーバー的に動かして、ほかのLAN上のPCからアクセスしたり、ローカル/サービス混在のLLMを設定するにはうまく行かないので、以下のテンプレを使って、必要箇所を修正、コピペしてほしい。テンプレはjsonなので、#のコメントは認めていないが、説明のためあえて入れてある。実際使う時は#の行は削除していただきたい。

{
  "gateway": {
    "mode": "local",
    # LAN上からアクセスする場合に必要。localhostのみなら"loopback"
    "bind": "lan",
    "auth": {
      "mode": "token",
      # ログイン時に使用する認証用文字列。何でも良い
      "token": "openclaw-local-token-123"
    },
    "controlUi": {
      "allowedOrigins": [
        "http://localhost:18789",
        "http://127.0.0.1:18789",
        # OpenClawが動作するPCのIPアドレス。LAN上のPCからアクセス可能になる
        "http://192.168.11.111:18789"
      ],
      # LAN上の他のPCからHTTPでアクセスするのに必要。HTTPSなら不要
      "dangerouslyDisableDeviceAuth": true
    }
  },
  # Dockerコンテナ内でPlaywrightが動かない場合に追加
  # コンテナ内でChromiumのサンドボックスが使えない環境で必要になる場合がある
  "browser": {
    "enabled": true,
    "headless": true,
    "noSandbox": true
  },
  "agents": {
    "defaults": {
      "model": {
        # デフォルトで使用するモデル。"プロバイダー名/モデルID"の形式
        "primary": "vllm/sakamakismile/Huihui-Qwen3.6-27B-abliterated-NVFP4-MTP"
      },
      "models": {
        # Control UIでモデル切替時に表示される一覧。使うモデルを列挙
        "lmstudio/qwen3.6-27b-uncensored-heretic-v2-native-mtp-preserved": {
          "alias": "Qwen3.6-27B-Heretic"
        },
        "vllm/sakamakismile/Huihui-Qwen3.6-27B-abliterated-NVFP4-MTP": {
          "alias": "Qwen3.6-27b-Huihui"
        },
        "opencode/deepseek-v4-flash": {
          "alias": "DeepSeek V4 Flash"
        },
        "opencode/qwen3.6-plus": {
          "alias": "Qwen3.6 Plus"
        }
      },
      "compaction": {
        # safeguard: 長いコンテキストでも分割して圧縮する安全モード
        "mode": "safeguard",
        # コンテキスト圧縮発動の余裕トークン数。contextWindowからこの値を引いた時点で圧縮開始
        # 小さすぎると圧縮自体が失敗する。50000推奨
        "reserveTokensFloor": 50000
      }
    }
  },
  "models": {
    "providers": {
      "lmstudio": {
        "baseUrl": "http://192.168.11.200:1234/v1",
        # ローカルLLMのためAPI Keyは不要。ダミー文字列を入れる
        "apiKey": "EMPTY",
        "models": [
          {
            "id": "qwen3.6-27b-uncensored-heretic-v2-native-mtp-preserved",
            "name": "Qwen3.6-27B-Heretic",
            # Vision対応モデルの場合に必要。これがないと画像を送っても認識しない
            "input": [
              "text",
              "image"
            ],
            # モデルの実際のコンテキスト長に合わせること。間違うとすぐオーバーフローする
            "contextWindow": 262144,
            "maxTokens": 32768
          }
        ]
      },
      "vllm": {
        "baseUrl": "http://192.168.11.100:8888/v1",
        "apiKey": "EMPTY",
        "models": [
          {
            "id": "sakamakismile/Huihui-Qwen3.6-27B-abliterated-NVFP4-MTP",
            "name": "Qwen3.6-27b-Huihui",
            "input": [
              "text",
              "image"
            ],
            # curl http://<IP>:<ポート>/v1/models で max_model_len を確認
            "contextWindow": 262144,
            "maxTokens": 32768
          }
        ]
      },
      "opencode": {
        # OpenAI互換のAPIエンドポイント。他のサービスも同様にここへ
        "baseUrl": "https://opencode.ai/zen/go/v1/",
        # サービスのAPI Keyをセット
        "apiKey": "API-KEY",
        "models": [
          {
            "id": "deepseek-v4-flash",
            "name": "DeepSeek V4 Flash",
            # サービス側のコンテキスト長に合わせる
            "contextWindow": 1000000,
            "maxTokens": 32768
          },
          {
            "id": "qwen3.6-plus",
            "name": "Qwen3.6 Plus",
            "input": [
              "text",
              "image"
            ],
            "contextWindow": 1000000,
            "maxTokens": 32768
          }
        ]
      }
    }
  }
}

このjsonの設定、長くなってしまったものの、ポイントは、


  1. Docker + LAN外部アクセスで同一LAN上のPCからも使え、サーバー的運用ができる
  2. LM Studio / vLLM / クラウドAPIの混在
  3. Vision対応のinput設定
  4. compactionの意味と設定

などが含まれていること。どれか1つでもハマると解決にいろいろ調べる必要があり、結構手間がかかる(実際そうだった)。

 参考までにローカルで動作しているLLMは2つ。1つはvLLMでDGX Spark互換機、もう1つはLM StudioでGeForce RTX 4090(48GB改)。どちらもQwen 3.6 27b系。前者がデフォルト、後者はできるだけ速く処理したい時用と分けて使っている。

 外部はOpen Code Goを使っている。このプロバイダーは、OSSなLLMのフィロンティアモデルが月10ドルでリミットはあるもの結構なトークン数を利用可能。DeepSeek V4 Flashは激安。かなり使ってもリミットには程遠い。ただしVision(視覚)未対応なので、Visionが必要な時、Qwen 3.6 Plusに切り替えている。

 以降は、openclawのあるフォルダで、

起動(バックグランド動作)
$ docker compose up -d
ログの確認
$ docker compose logs -f openclaw-gateway
停止
$ docker compose down
openclaw.json書き換え時の再起動(ホットロードだが念の為)
$ docker compose restart openclaw-gateway
アップデート
$ docker compose down
$ git pull
$ git checkout <最新タグ>
$ docker compose up -d --build

といった形で運用できる。Dockerを使ってるのでOSの環境は汚さず、git cloneしたフォルダと、~/.openclaw/フォルダ以下のみが散らかるだけと、安心運用が可能だ。

 ただここで1つ困った話がある。それはDocker+macOSのケースだ。コンテナ中は基本的にLinux環境(Ubuntuなど)。そのため、ホストであるmacOSのbrewなどのコマンドを使おうとしても動かずAIが混乱する。

 その点、Docker(WSL2)+Windowsの組み合わせは、中身が最初から実質Ubuntu(Linux)であるため、この手の「ホストOSとコンテナ内のギャップ」によるトラブルが皮肉にもほぼない。

 OpenClawから見える環境はLinuxでありmacOSではない。Macユーザーはこの「AIとOSの認識のズレ」が起きることを頭の片隅に置いておいてほしい。そういった意味では直入れの方が扱いやすいかも知れない。

ログインと自分/エージェント(AI)の設定

 http://localhost:18789やhttp://<PCのIPアドレス>:18789などでOpenClawにアクセスするとログイン画面の表示となる。Gatewayトークンにはjsonで設定したものを入れる、パスワードはお好みで。無事ログインするとありがちなチャットUIとなる。

OpenClawのログイン画面。Gatewayトークンにはjsonで設定したものを入れる。パスワードはお好みで
OpenClawのチャットUI

 次にjsonで設定したLLM 4つが選べるかの確認。そしてとりあえず動作確認で“こんにちは”などと入れ、それなりの返事が帰ってきたら動作している。

LLMがjsonの設定通り4種類選べるようになっている(v2026.6.1では下へ移動した)
たまたま台風の日だったので”こんにちは!今日は台風です”と伝えると情報を収集、結果が出てきた

 またDockerの場合、上記したように、何をするにも~/.openclaw/workspaceを使うので、ショートカットやシンボリックリンクを作っておくと楽だ。サーバー的な運用の時はFTP/SFTPなどでの転送となるが、ここは仕方ないだろう。別途ファイラー的なWebUIを起動、それでアクセスする手もある。

Windowsでは¥Users¥<ユーザーid>¥.openclaw¥workspace がアクセスできる唯一のフォルダ

 次に、何かチャットをした段階で ~/.openclaw/workspace/に以下のファイルがあると思う(チャットを何もしないと空のままなので要注意)。


  • AGENTS.md マルチエージェント構成を使う
  • BOOTSTRAP.md 起動時の初期コンテキスト
  • HEARTBEAT.md 定期実行タスクを使う場合
  • IDENTITY.md* エージェント(AI)の情報/名前・見た目・雰囲気と言った外面的な内容
  • SOUL.md エージェント(AI)の情報/どう考え、どう振る舞うかと言った内面的な内容
  • TOOLS.md ツールの使い方の指針
  • USER.md* 自分(ユーザー)の情報

 多くはデフォルトのままでOKだが、*印を付けた2つは少し追記した方が良い。書式はマークダウンとなっている。

USER.md
- **Name:** Kazu
- **What to call them:** Kazu さん、または kazu
- **Timezone:** Asia/Tokyo (JST, UTC+9)

IDENTITY.md
- **Name:** みー (Mii)
- **Creature:** AI アシスタント — でもちょっと人間っぽい温かさはあり
- **Vibe:** 落ち着いているけど、たまにツッコむ。基本は温かい。
- **Emoji:** 🌙
- **Language:** 日本語(常に日本語で返事)

 少なくとも主に日本語、時間が関係するのでTimezoneを書いておく。IDENTITY.mdのほかの部分はお好みで。**好むファッション:**とかも追加可能。後編で書く予定の画像生成にも影響する。

 なおIDENTITY.mdは、何も設定せずにチャットしてると、設定しろ!とうるさく出て、AIからの提案でいくつか候補が上がり適当に選択。AIが勝手に書いたもので、筆者の意図とはまったく無関係だ(笑)。

 USER.mdとIDENTITY.mdに追記した場合は、BOOTSTRAP.mdは不要。リネームするか削除する。

お題を与える

 これからいよいよ前編の締め。まず先のPlaywrightや.venvなど使える環境があるか?の確認。

“Playwright動くか確認、.venvで環境作れるか確認してください”

Playwrightや.venvが使えるかの確認。OK

 問題なければいよいよお題を投げてみよう。

PC WatchのCOMPUTEX TAIPEI 2026の記事をまとめてパワポ化。画像の縦横比や文字に文字や画像が被らない様、要注意!Playwright使えます。

お題を入力……数分待つとできたようだ

 実行できた結果がこれとなる。全部で20枚あるので、うち4枚だけ掲載。結構それっぽいのができている。ただ“Playwright使えます”と書いてあるのにweb_fetchで行けたから使ってないということが多く(結果ちゃんと拾えていない)、ここは“Playwrightを使うように”とした方がいいかも知れない。

20枚中の1枚(1/4)
20枚中の1枚(2/4)
20枚中の1枚(3/4)
20枚中の1枚(4/4)

 LLMはDeepSeek V4 Flashを使ったが、写真が重複、違うテキストを拾っているなど、若干おかしいところがあるものの、概ね出来上がっている。

 試しにQwen 3.6 27bで同じことをしたところ、テキストがうまく拾えていないケースが多発した。284bでアクティブパラメータは13Bと、27bとではそれなりに差が出るようだ。

 なお、毎回試行錯誤するのも時間の無駄なので、成功したパターンをTOOLS.mdに書いておくと、以降、似た例だと参照するようになる。もちろん筆者が書かずAIにメモって!でOK。


 以上のように、OpenClawをDocker環境に閉じ込めることで、少なくとも普段使いのPCに直接導入するよりはリスクを抑えられる。後編ではもっと実用的?なお題を試していろいろ遊んでみたい。