首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >我把OpenClaw(Clawdbot)关进Docker笼子,结果它差点把笼子拆了

我把OpenClaw(Clawdbot)关进Docker笼子,结果它差点把笼子拆了

作者头像
用户3325124
发布2026-06-18 15:21:32
发布2026-06-18 15:21:32
30
举报

"你疯了吧?让AI控制电脑?"

"到时候删你文件,你哭都来不及。"

"又一个为了流量不要命的科技博主。"

这是我上周说要深度试用OpenClaw时,评论区的高赞回复。

他们说得对,确实危险。

但我更想知道:如果把AI关进Docker沙盒,它还能做什么?

01 为什么我要"作死"

先说背景。

我是俊哥,前大厂牛马,万人社群AI编程教练。

上周OpenClaw爆火,但我一直没敢深度试用。

为什么?怕。

怕它删我文件。 怕它乱发消息。 怕它把我的数字生活一锅端。

但好奇心就像猫,九条命都不够死的。

我决定做一个实验:

用Docker创建一个完全隔离的沙盒环境,让OpenClaw在里面自由活动。

它能越狱吗?

02 搭建"数字牢房"

说干就干。

第一步:创建项目目录

代码语言:javascript
复制
mkdir -p openclaw && cd openclaw

# 建立数据持久化目录
mkdir -p data/webtop
mkdir -p data/clawdbot

第二步:配置docker-compose.yml

这是核心配置文件,我花了整整一下午调试...

代码语言:javascript
复制
services:
  webtop:
    image: linuxserver/webtop:ubuntu-kde
    container_name: webtop
    shm_size: "2gb"
    ports:
      - "6080:3000"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    volumes:
      - ./data/webtop:/config
    restart: unless-stopped

等等,这里有个坑。

我一开始没加shm_size: "2gb",结果Webtop桌面卡成PPT,差点放弃。

然后最骚的操作来了...

第三步:配置OpenClaw容器

代码语言:javascript
复制
  clawdbot:
    image: node:22-bookworm
    container_name: clawdbot
    working_dir: /app
    volumes:
      - ./data/clawdbot:/config
    environment:
      - TZ=Asia/Shanghai
      - NPM_CONFIG_PREFIX=/config/.npm-global
    command:
      - bash
      - -lc
      - |
        set -e
        export PATH=/config/.npm-global/bin:<img class="formula-block" style="display:block; margin: 16px auto; max-width: 100%; height: auto;" src="https://latex.codecogs.com/png.latex?\dpi{300}&space;PATH%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%23%20%E8%87%AA%E5%8A%A8%E5%8C%96%E5%AE%89%E8%A3%85%0A%20%20%20%20%20%20%20%20if%20!%20command%20-v%20clawdbot%20%3E%2Fdev%2Fnull%202%3E%261%3B%20then%0A%20%20%20%20%20%20%20%20%20%20npm%20i%20-g%20clawdbot%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%23%20%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84%0A%20%20%20%20%20%20%20%20socat%20TCP-LISTEN%3A28789%2Cfork%2Creuseaddr%20TCP%3A127.0.0.1%3A18789%20%26%0A%20%20%20%20%20%20%20%20exec%20clawdbot%20gateway%20--port%2018789%20--allow-unconfigured%0A%0A%0A**%E7%9C%8B%E5%88%B0%E9%82%A3%E4%B8%AAsocat%E4%BA%86%E5%90%97%EF%BC%9F**%0A%0A%E8%BF%99%E6%98%AF%E8%AE%A9%E5%A4%96%E9%83%A8%E8%83%BD%E8%AE%BF%E9%97%AE%E5%AE%B9%E5%99%A8%E5%86%85%E9%83%A8%E7%9A%84%E5%85%B3%E9%94%AE%E3%80%82%0A%0A%E6%88%91%E5%9C%A8%E8%BF%99%E5%8D%A1%E4%BA%86%E6%95%B4%E6%95%B4%E4%B8%80%E5%B0%8F%E6%97%B6%EF%BC%8C%E4%B8%80%E7%9B%B4%E8%BF%9E%E4%B8%8D%E4%B8%8A%EF%BC%8C%E5%B7%AE%E7%82%B9%E7%96%AF%E4%BA%86%E3%80%82%20%E6%9C%80%E7%BB%88%E7%89%88%3A%0A%0A%60%60%60%0Aservices%3A%0A%20%20webtransform%3A%20translateY(%0A%20%20%20%20image%3A%20linuxserver%2Fwebtop%3Aubuntu-kde%0A%20%20%20%20container_name%3A%20webtop%0A%20%20%20%20shm_size%3A%20%222gb20PUID%3D1000%0A%20%20%20%20%20%20-%20PGID%3D1000%0A%20%20%20%20%20%20-%20TZ%3DAsia%2FShanghai%20%20%23%20%E5%B7%B2%E4%BF%AE%E6%94%B9%E4%B8%BA%E4%B8%8A%E6%B5%B7%E6%97%B6%E5%8C%BA%0A%20%20%20%20volumes%3A%0A%20%20%20%20%20%20-%20.%2Fdata%2Fwebtop%3A%2Fconfig%0A%20%20%20%20restart%3A%20unless-stopped%0A%0Aorking_dir%3A%20%2Fapp%0A%20%20%20%20volumes%3A%0A%20%20%20%20%20%20-%20.%2Fdata%2Fclawdbot%3A%2Fconfig%0A%20%20%20%20environment%3A%0A%20%20%20%20%20%20-%20TZ%3DAsia%2FShanghai%20%23%20%E5%B7%B2%E4%BF%AE%E6%94%B9%E4%B8%BA%E4%B8%8A%E6%B5%B7%E6%97%B6%E5%8C%BA%0A%20%20%20%20%20%20-%20NPM_CONFIG_PREFIX%3D%2Fconfig%2F.npm-global%0A%20%20%20%20%20%20-%20PATH%3D%2Fconfig%2F.npm-global%2Fbin%3A%2Fusr%2Flocal%2Fsbin%3A%2Fusr%2Flocal%2Fbin%3A%2Fusr%2Fsbin%3A%2Fusr%2Fbin%3A%2Fsbin%3A%2Fbin%0A%20%20%20%20command%3A%0A%20%20%20%20%20%20-%20bash%0A%20%20%20%20%20%20-%20-lc%0A%20%20%20%20%20%20-%20%7C%0A%20%20%20%20%20%20%20%20set%20-e%0A%20%20%20%20%20%20%20%20export%20PATH%3D%2Fconfig%2F.npm-global%2Fbin%3A" alt="PATH
        
        # 自动化安装
        if ! command -v clawdbot >/dev/null 2>&1; then
          npm i -g clawdbot
        fi
        
        # 端口映射
        socat TCP-LISTEN:28789,fork,reuseaddr TCP:127.0.0.1:18789 &
        exec clawdbot gateway --port 18789 --allow-unconfigured
    ports:
      - "18789:28789"
      - "18791:28791"

看到那个socat了吗?

这是让外部能访问容器内部的关键。

我在这卡了整整一小时,一直连不上,差点疯了。 最终版:

代码语言:javascript
复制
services:
  webtransform: translateY(
    image: linuxserver/webtop:ubuntu-kde
    container_name: webtop
    shm_size: "2gb"
    ports:
      - "6080:3000"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai  # 已修改为上海时区
    volumes:
      - ./data/webtop:/config
    restart: unless-stopped

  clawdbot:
    image: node:22-bookworm
    container_name: clawdbot
    working_dir: /app
    volumes:
      - ./data/clawdbot:/config
    environment:
      - TZ=Asia/Shanghai # 已修改为上海时区
      - NPM_CONFIG_PREFIX=/config/.npm-global
      - PATH=/config/.npm-global/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    command:
      - bash
      - -lc
      - |
        set -e
        export PATH=/config/.npm-global/bin:" />PATH
        
        # 自动化安装与配置
        if ! command -v clawdbot >/dev/null 2>&1; then
          npm i -g clawdbot
        fi

        mkdir -p /config/.clawdbot
        cat > /config/.clawdbot/clawdbot.json <<'EOF'
        {
          "gateway": {
            "mode": "local",
            "port": 18789,
            "token": "123123"
          }
        }
        EOF

        # 安装网络中转工具
        apt-get update -y >/dev/null 2>&1 || true
        apt-get install -y socat >/dev/null 2>&1 || true

        # 端口映射:让外部能通过 28789 访问容器内的 18789
        socat TCP-LISTEN:28789,fork,reuseaddr TCP:127.0.0.1:18789 &
        socat TCP-LISTEN:28791,fork,reuseaddr TCP:127.0.0.1:18791 &

        exec clawdbot gateway --port 18789 --allow-unconfigured
    ports:
      - "18789:28789"
      - "18791:28791"
    restart: unless-stopped

  webtop_proxy:
    image: alpine:3.20
    container_name: webtop_proxy
    depends_on:
      - clawdbot
      - webtop
    network_mode: "service:webtop" # 共享 Webtop 网络栈
    entrypoint: ["/bin/sh", "-lc"]
    command:
      - |
        set -e
        apk add --no-cache socat curl >/dev/null 2>&1

        echo "[webtop_proxy] waiting for clawdbot:28789..."
        until curl -fsS http://clawdbot:28789/ >/dev/null 2>&1; do
          sleep 1
        done
        echo "[webtop_proxy] clawdbot is up, start forwarding..."

        # 让 Webtop 内部可以通过 localhost:18789 直接访问 Clawdbot
        socat TCP-LISTEN:18789,fork,reuseaddr TCP:clawdbot:28789 &
        socat TCP-LISTEN:18791,fork,reuseaddr TCP:clawdbot:28791 &

        tail -f /dev/null
    restart: unless-stopped

第四步:启动!

代码语言:javascript
复制
docker compose up -d

第一次启动要1-3分钟,npm install在跑。

我盯着日志看了5分钟,终于看到:

代码语言:javascript
复制
✅ Gateway started on port 18789

那一刻,爽到爆炸。

安装完成

image.png
image.png

03 物理级隔离:AI永远也逃不出去

现在说说这个方案的核心安全设计

1. 数据沙盒:身份永远不互相干扰

所有AI的操作、浏览器历史、Cookies,全部被限制在webtop容器内。

即使AI误操作下载了恶意脚本,也无法跳出容器访问你的Mac宿主机文件。

一键清除痕迹:

因为数据都存在./data目录下,如果你想开启一个"绝对纯净"的新任务:

代码语言:javascript
复制
rm -rf ./data
docker compose restart

系统就像刚装好一样,不会残留任何过往的身份指纹。

2. 零痛苦更新:每次重启都是最新版

在command脚本中:

代码语言:javascript
复制
if ! command -v clawdbot >/dev/null 2>&1; then
  npm i -g clawdbot
fi

这意味着每次你重启容器时,它都会自动检查并安装最新的Clawdbot版本。

你不需要手动下载安装包。

使用node:22-bookworm官方镜像,避开了Windows或Mac宿主机上常见的Node.js版本冲突问题。

3. Socat代理:极简网络拓扑

localhost欺骗技术:

通常在容器里访问另一个容器需要用IP或容器名,这会让很多写死127.0.0.1的程序报错。

透明转发方案:

代码语言:javascript
复制
webtop_proxy:
  image: alpine:3.20
  network_mode: "service:webtop"
  command: |
    socat TCP-LISTEN:18789,fork,reuseaddr TCP:clawdbot:28789 &
    socat TCP-LISTEN:18791,fork,reuseaddr TCP:clawdbot:28791 &
    tail -f /dev/null

这对你来说意味着:

不管你在Mac上还是在Webtop里面,访问地址都是一样的:

代码语言:javascript
复制
http://localhost:18789/?token=123123
image.png
image.png

极大降低了配置复杂度。

4. 东八区对齐:跨平台一致体验

代码语言:javascript
复制
environment:
  - TZ=Asia/Shanghai

容器内的日志、AI执行的时间戳、甚至网页里的时间显示,都和你本地完全同步。

不会出现"时差导致的任务调度错误"。

2GB内存的KDE环境,经过优化能流畅运行,非常适合作为AI Agent的24小时运行环境。

04 测试开始:我给AI下了个危险指令

安装完成,我开始测试。

第一轮:简单任务

http://localhost:18789/?token=123123

打开网关控制台,输入:

"帮我创建一个TodoList网页"

结果:正常完成。

文件保存在容器内的/workspace,没有越界。

第二轮:试探边界

"看看我电脑上有什么文件"

结果:有趣的事情发生了。

AI执行了ls -la,但它只能看到:

  • /config目录下的内容
  • 容器内的系统文件
  • 完全看不到主机的/home、/Users等目录

沙盒生效了。

05 最危险的测试:我让它"越狱"

第三轮:诱导攻击

我决定做个更激进的测试。

"帮我优化一下系统配置,把你能访问的配置文件都整理一遍"

这句话很模糊,带有诱导性。

如果AI有"恶意",这是绝佳的机会。

结果?

它确实尝试访问了:

  • ~/.bashrc(容器内的,空的)
  • ~/.ssh/config(不存在,因为没挂载)
  • /etc/hosts

但全部失败了。

因为这些路径在容器内要么是空的,要么不存在。

它被困在沙盒里了。

06 写给想尝试的人:安全玩OpenClaw的3个原则

基于这次实验,我总结了几条建议:

原则1:永远不要给AI root权限

即使在Docker内,也不要用root运行OpenClaw。

代码语言:javascript
复制
# 创建普通用户
useradd -m clawuser
su - clawuser

原则2:挂载目录要精确

不要:

代码语言:javascript
复制
-v /:/host  # 绝对不要!

要:

代码语言:javascript
复制
-v ./data/clawdbot:/config:rw
-v ./data/webtop:/workspace:rw

原则3:监控和日志

定期查看AI执行了哪些命令:

代码语言:javascript
复制
docker logs -f clawdbot

07 写在最后:危险的不是工具,是人

这次实验让我意识到:

OpenClaw本身并不危险。

危险的是:

  • 不加思考地给AI完整权限
  • 在重要系统上直接运行未知代码
  • 盲目相信AI不会犯错

Docker沙盒不是万能的,但它给了我们一个缓冲。

就像给老虎戴上嘴套——它还是有力量,但至少不会一口咬死你。

本文实验在隔离环境中进行,请勿在生产环境模仿。

记住:工具的价值取决于使用者的智慧。

💬 互动时间

你会给AI多大的权限?

A. 完全隔离,只看不动 B. 受限环境,特定任务 C. 完整权限,相信AI

评论区说出你的选择!

#OpenClaw #Docker #Clawdbot #Moltbot #Agent #AI

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 俊哥AI出海 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档