"你疯了吧?让AI控制电脑?"
"到时候删你文件,你哭都来不及。"
"又一个为了流量不要命的科技博主。"
这是我上周说要深度试用OpenClaw时,评论区的高赞回复。
他们说得对,确实危险。
但我更想知道:如果把AI关进Docker沙盒,它还能做什么?
01 为什么我要"作死"
先说背景。
我是俊哥,前大厂牛马,万人社群AI编程教练。
上周OpenClaw爆火,但我一直没敢深度试用。
为什么?怕。
怕它删我文件。 怕它乱发消息。 怕它把我的数字生活一锅端。
但好奇心就像猫,九条命都不够死的。
我决定做一个实验:
用Docker创建一个完全隔离的沙盒环境,让OpenClaw在里面自由活动。
它能越狱吗?
02 搭建"数字牢房"
说干就干。
第一步:创建项目目录
mkdir -p openclaw && cd openclaw
# 建立数据持久化目录
mkdir -p data/webtop
mkdir -p data/clawdbot第二步:配置docker-compose.yml
这是核心配置文件,我花了整整一下午调试...
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容器
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了吗?
这是让外部能访问容器内部的关键。
我在这卡了整整一小时,一直连不上,差点疯了。 最终版:
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第四步:启动!
docker compose up -d第一次启动要1-3分钟,npm install在跑。
我盯着日志看了5分钟,终于看到:
✅ Gateway started on port 18789那一刻,爽到爆炸。
安装完成

03 物理级隔离:AI永远也逃不出去
现在说说这个方案的核心安全设计。
1. 数据沙盒:身份永远不互相干扰
所有AI的操作、浏览器历史、Cookies,全部被限制在webtop容器内。
即使AI误操作下载了恶意脚本,也无法跳出容器访问你的Mac宿主机文件。
一键清除痕迹:
因为数据都存在./data目录下,如果你想开启一个"绝对纯净"的新任务:
rm -rf ./data
docker compose restart系统就像刚装好一样,不会残留任何过往的身份指纹。
2. 零痛苦更新:每次重启都是最新版
在command脚本中:
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的程序报错。
透明转发方案:
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里面,访问地址都是一样的:
http://localhost:18789/?token=123123
极大降低了配置复杂度。
4. 东八区对齐:跨平台一致体验
environment:
- TZ=Asia/Shanghai容器内的日志、AI执行的时间戳、甚至网页里的时间显示,都和你本地完全同步。
不会出现"时差导致的任务调度错误"。
2GB内存的KDE环境,经过优化能流畅运行,非常适合作为AI Agent的24小时运行环境。
04 测试开始:我给AI下了个危险指令
安装完成,我开始测试。
第一轮:简单任务
http://localhost:18789/?token=123123
打开网关控制台,输入:
"帮我创建一个TodoList网页"
结果:正常完成。
文件保存在容器内的/workspace,没有越界。
第二轮:试探边界
"看看我电脑上有什么文件"
结果:有趣的事情发生了。
AI执行了ls -la,但它只能看到:
沙盒生效了。
05 最危险的测试:我让它"越狱"
第三轮:诱导攻击
我决定做个更激进的测试。
"帮我优化一下系统配置,把你能访问的配置文件都整理一遍"
这句话很模糊,带有诱导性。
如果AI有"恶意",这是绝佳的机会。
结果?
它确实尝试访问了:
但全部失败了。
因为这些路径在容器内要么是空的,要么不存在。
它被困在沙盒里了。
06 写给想尝试的人:安全玩OpenClaw的3个原则
基于这次实验,我总结了几条建议:
原则1:永远不要给AI root权限
即使在Docker内,也不要用root运行OpenClaw。
# 创建普通用户
useradd -m clawuser
su - clawuser原则2:挂载目录要精确
不要:
-v /:/host # 绝对不要!要:
-v ./data/clawdbot:/config:rw
-v ./data/webtop:/workspace:rw原则3:监控和日志
定期查看AI执行了哪些命令:
docker logs -f clawdbot07 写在最后:危险的不是工具,是人
这次实验让我意识到:
OpenClaw本身并不危险。
危险的是:
Docker沙盒不是万能的,但它给了我们一个缓冲。
就像给老虎戴上嘴套——它还是有力量,但至少不会一口咬死你。
本文实验在隔离环境中进行,请勿在生产环境模仿。
记住:工具的价值取决于使用者的智慧。
💬 互动时间
你会给AI多大的权限?
A. 完全隔离,只看不动 B. 受限环境,特定任务 C. 完整权限,相信AI
评论区说出你的选择!
#OpenClaw #Docker #Clawdbot #Moltbot #Agent #AI