1. 为什么我要把 Agent 关进一台能随手删掉的微虚拟机先说结论Docker Sandboxes 是 Docker 官方给 Coding Agent 准备的一套隔离运行环境每个 sandbox 对应一台独立的微虚拟机有自己的 Linux 内核、文件系统、网络策略和 Docker Engine。它适合谁适合那些想让 Agent 自己装依赖、跑测试、起 Compose但又不想把宿主机 Docker socket 交出去的人。我第一次接触它的时候最直观的感受是这东西不是容器套壳而是把「整台机器」打包成一个可以rm掉的单元。为什么这件事值得单独写一篇因为给 Coding Agent 选运行环境时「容器 vs 微虚拟机」不是一道选择题而是一个真问题。Agent 要真的在干活就得有权限装包、改文件、跑构建。常见做法是把宿主机的/var/run/docker.sock挂进容器等于把整台机器的 Docker 控制权交给它。风险不在 Agent 本身而在共享宿主机内核和宿主机 Docker 这个前提上——一旦容器逃逸或者镜像被投毒影响面是整个宿主机。Docker Sandboxes 换了个思路不共享内核也不共享宿主机的 Docker而是给每个任务一台可以删掉的微虚拟机。项目文件还在你的 Mac 上但宿主机的 Docker 它碰不到。Agent 退出后环境还在装过的包、拉过的镜像都保留只有sbx rm才真正拆掉。这个设计对「人机协作改同一棵树」的场景特别友好Agent 改的文件你这边立刻能看到用平时的git diff就能审。这篇只做一件事在 Apple Silicon 的 Mac 上从安装走到第一次把 Agent 跑起来。环境是 M1 Pro、sbx v0.38.0、OpenCode宿主机上的 Docker 是 OrbStack。不是全 Agent 评测也不讲隔离机制的全景重点放在可复制的配置片段、启动命令以及模型通道怎么接进来。模型这块我会用 TaoToken 的统一 Key 通道来打通这样不用在 sandbox 里反复折腾各家 OAuth。2. 装 sbx 之前先把 TaoToken 的 Key 和通道准备好在动手装 Docker Sandboxes 之前我建议先把模型通道准备好原因是 sandbox 不继承宿主机的登录态。你在 Mac 上已经登录好的 OpenCode、Claude Code进到 sandbox 里是看不到的。与其在里面反复/connect不如一开始就用一个统一的 API 通道把 Base URL、Key、Model ID 三件套固定下来。TaoToken 在这里扮演的角色就是统一 Key 通道一个 Key 走多家模型Base URL 固定Model ID 按需切换。对 sandbox 这种「每次都要重新配一遍」的环境来说省事的地方在于配置片段可以原样复制不用为每个 provider 单独写策略规则。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。你需要提前做两件事。第一拿到 API Key。登录后进控制台在 API Keys 页面创建一个新 Key复制出来存好。这个页面地址是 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。第二确认你要用的 Model ID。如果你不确定选哪个可以先去模型对话页面试一下地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 在里面切换模型发一条消息确认能通再把这个 Model ID 记下来填进 sandbox 配置。这里有个容易踩的坑很多人以为 sandbox 里能直接用宿主机 OpenCode 的登录态结果进去发现要重新登录。如果你走的是订阅制 OAuth比如某些订阅账号sbx secret set只支持写入 API Key不支持这种凭证还得在 TUI 里/connect并且给网络策略补域名规则。用 TaoToken 的统一 Key 就绕开了这一层因为它是标准 API Key 形态sbx secret set直接能写进去。配置三件套长这样先记下来后面会用到配置项值Base URLhttps://taotoken.net/apiAPI Key你在控制台创建的那串 KeyModel ID你在模型对话页确认可用的那个模型标识如果你后面要长期跑编码任务或者 Agent 工作流可以顺带看一下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 它更适合高频、长时间的编码场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 遇到字段不确定的时候可以对照查。3. 可复制的 sandbox 配置从安装到 OpenCode 启动这一节是全文的核心所有命令都可以直接复制。先说支持范围官方名单里的 Mac 只有 Apple Silicon系统至少 Sonoma 14Homebrew cask 也写死 arm64Intel Mac 现在装不上。这是产品支持范围不是 Intel 机器不能做虚拟化。Docker Desktop 不是前置条件sbx 自己拉微虚拟机也不依赖你已经在用的 OrbStack。第一步安装 CLI 并登录brew trust docker/tap brew install docker/tap/sbx sbx loginsbx login走浏览器里的 Docker 账号。装完 CLI 不会自动拉起后台进程这点和很多人预期不一样。我这边要先常驻 daemon再初始化网络策略否则后面执行sbx run之类的命令会因为策略未初始化而报错sbx daemon start sbx policy init balanceddaemon start是前台阻塞的适合丢给 launchd 一类的进程管理不要挂在你正用的那个终端里不管。网络策略官方分成三档Open 全开Locked Down 全拦Balanced 是居中那档——默认拒绝只放行模型 API、包管理器、代码托管和 Registry 这类常见开发站点。文档里也可以在第一次sbx run时交互选两条路选一条即可。第二步进项目目录并启动 OpenCodecd ~/your-project sbx run opencode第一次会拉 OpenCode 的模板镜像要等一会儿。起来的是 TUI不是那种自动跳过确认的会话。项目目录是挂进去的路径和 Mac 上一样Agent 改的文件你这边立刻看得到。第三步把 TaoToken 的三件套写进 sandbox。这里有两种做法取决于你用的 Agent 形态。如果是 OpenCode 这类支持配置文件的方式可以在项目里放一份opencode.json{ $schema: https://opencode.ai/config.json, provider: { taotoken: { npm: ai-sdk/openai-compatible, name: TaoToken, options: { baseURL: https://taotoken.net/api, apiKey: {env:TAOTOKEN_API_KEY} }, models: { your-model-id: { name: Your Model } } } } }注意apiKey这里用的是环境变量引用不要把 Key 硬编码进文件。然后在 sandbox 里写入 secretsbx secret set taotoken它会提示你粘贴 Key。写完之后在 sandbox 的 shell 里确认环境变量能读到。如果你用的是 Claude Code 形态配置走settings.json路径和字段要对齐{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: your-key-here, ANTHROPIC_MODEL: your-model-id } }如果你用的是 Codex 形态配置走auth.json三件套同样要对齐 Base URL、Key、Model ID。这三个文件形态opencode.json、settings.json、auth.json是不同 Agent 的入口选你实际用的那个不要混着填。第四步如果你确实需要走 OAuth 类订阅才需要补网络策略。用 TaoToken 统一 Key 的话一般不需要额外放行因为它是标准 API 端点。但如果你同时还想用别的 provider可以这样加规则sbx policy allow network *.example.com:443,api.example.com:443停掉但留下环境用sbx stop下次sbx run --name sandbox再连。不要了再sbx rm。需要进编辑器时先sbx setup ssh然后ssh name.sbxVS Code 的 Remote-SSH 也能连这个主机名。4. 验证请求确认 Agent 真的连上了模型配置写完不代表通了得实际验证。我一般分两步先在 sandbox 里用 curl 打一次 API确认网络和 Key 都没问题再让 OpenCode 跑一个真任务确认端到端链路。第一步在 sandbox 的 shell 里发一个最小请求curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: your-model-id, messages: [{role: user, content: ping}], max_tokens: 16 }如果返回里有choices字段说明 Key、Base URL、网络策略三者都通了。如果返回 401说明 Key 没写对或者环境变量没读到如果卡住不动多半是网络策略没放行taotoken.net。Balanced 档默认放行常见开发站点TaoToken 的 API 域名一般在这个范围内但如果你手动改过策略要确认没把它拦掉。第二步回到 OpenCode 的 TUI丢一个真任务进去比如「跑一下测试把失败的那个补上」。文件改动会出现在你的工作区里用平时的git diff看就行。这一步能过说明 Agent 不只是连上了模型还能在 sandbox 里实际读写项目、执行命令。这里有个细节值得说sandbox 里的 Docker Engine 是它自己的你在里面docker ps看到的不是 OrbStack。这意味着 Agent 可以在里面起 Compose、拉镜像、跑集成测试而不会碰到你宿主机的 Docker。工作区里的.env、.git都能被 Agent 直接读到没有额外的权限限制去挡它——隔离挡的是工作区外面不是工作区里面。这一点要心里有数敏感文件要么别放进工作区要么给 Agent 一份隔离副本。验证通过之后你可以把这条链路固定下来项目里放好配置文件Key 走sbx secret set每次sbx run opencode就能直接开工。需要长期跑的话Coding Plan 那条通道会更合适地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。5. 常见报错排查401、策略未初始化、OAuth 连不上这一节按真实报错来对都是我或者身边人实际撞过的。401 Unauthorized。最常见的原因是 Key 没写进去或者环境变量名对不上。先确认sbx secret set taotoken执行成功再在 sandbox 里echo $TAOTOKEN_API_KEY看有没有值。如果配置文件里写的是{env:TAOTOKEN_API_KEY}要确保变量名完全一致。还有一种情况是 Key 复制时带了空格或者换行重新复制一次。local proxy failed / 策略未初始化。这个报错通常出现在你跳过sbx policy init直接sbx run的时候。解决方式是先sbx daemon start再sbx policy init balanced然后重试。如果 daemon 没起来sbx run也会失败确认 daemon 进程在跑。reading choices 相关报错。这类报错一般出现在 API 返回体解析阶段说明请求发出去了但返回格式不对。检查 Base URL 是不是写成了https://taotoken.net/api不要多加或者少加/v1具体以接入文档为准。Model ID 也要确认是模型对话页里验证过可用的那个写错模型名有时会返回非预期结构。OAuth 连不上 / device code 出不来。如果你走的是订阅制 OAuth 而不是 API Keysbx secret set写不进去得在 TUI 里/connect。Balanced 档默认不放行某些登录域名device code 出不来需要手动加规则sbx policy allow network *.example.com:443,auth.example.com:443,accounts.example.com:443用 TaoToken 统一 Key 的话这一整类问题基本可以绕开因为它是标准 API Key 形态不需要走 OAuth 流程。Agent 改了文件但宿主机看不到。确认你是在项目目录里执行的sbx run工作区挂载路径和 Mac 上一致。如果路径不对Agent 改的是 sandbox 内部的文件宿主机自然看不到。Intel Mac 装不上。这是产品支持范围问题官方 cask 写死 arm64不是你的机器有问题。目前只能在 Apple Silicon 上跑。排查的时候有个通用思路先确认 daemon 和策略再确认 Key 和 Base URL最后确认 Model ID。这三层从下往上查基本能定位到问题在哪一层。6. 把统一 Key 通道固定下来下次直接开工走到这里你应该已经在 sandbox 里跑通了第一个 Agent 任务。回头看真正费事的不是拉镜像也不是装 CLI而是模型怎么进去。sandbox 不继承宿主机登录态订阅制 OAuth 还要单独/connect并放行网络策略。用 TaoToken 的统一 Key 通道把 Base URL、Key、Model ID 三件套固定下来这一步就变成可复制的配置而不是每次重新折腾。我自己的做法是项目里放一份opencode.jsonKey 走sbx secret set网络策略保持 Balanced需要额外域名再单独加。这样每次sbx run opencode就能直接开工Agent 在微虚拟机里装依赖、跑测试、起容器宿主机的 Docker 和内核都不受影响。工作区还是你的工作区git diff还是你的git diff。如果你要长期跑编码任务或者 Agent 工作流建议把 Key 管理和通道固定下来Coding Plan 那条路更适合高频场景。接入过程中遇到字段不确定的对照接入文档查一下比反复试错快。模型对话页面可以用来快速验证某个 Model ID 是否可用确认了再填进配置。最后提醒一句边界工作区挂进去之后.env对 Agent 是可见的。隔离挡的是工作区外面不是工作区里面。工作区是不是必须直接读写、能不能换成给 Agent 一份隔离副本这道边界具体打在哪取决于你的项目敏感程度。想清楚这一点再决定哪些目录挂进去。