1. runsc 装好了 Docker 却不认,问题到底卡在哪
你在 Ubuntu 上按教程把 runsc 下载到 /usr/local/bin,也写了 /etc/docker/daemon.json,systemctl restart docker也执行了,结果docker info里 Runtime 列表压根没有 runsc,docker run --runtime=runsc直接报unknown runtime。这个场景我遇到过不止一次,尤其在 gVisor 沙箱 + 容器 + 远程浏览器访问这条链路上,runsc 不识别会让后面 Ubuntu 桌面容器、VNC、NoVNC 全部起不来。
这篇用排障视角走一遍:先让 Claude Code 帮你逐项核对 runsc 路径、daemon.json 的 runtimes 字段、Docker 重启是否真的生效,再回到 gVisor 运行 Ubuntu 容器并通过远程浏览器访问的完整流程。Key 从 TaoToken 拿,Base URL 填https://taotoken.net/api,真正执行排查动作的是 Claude Code,TaoToken 只负责提供可用的模型调用入口。
适合谁看:已经在 Ubuntu 上装了 Docker、想用 gVisor 做沙箱隔离、准备跑带 GUI 的 Ubuntu 容器并远程浏览器访问,但被 runsc 不识别卡住的人。下面每一步都能直接复制执行,报错也能对照排查。
2. 先拿 TaoToken Key,把 Claude Code 接到排查任务上
排障这件事最怕人肉一行行猜。我的做法是让 Claude Code 当“排查执行器”:把 daemon.json 内容、docker info报错、runsc 路径检查结果一起丢给它,让它按清单核对。前提是 Claude Code 能正常调用模型,这里用 TaoToken 的 Key。
先到 TaoToken 官网创建 Key:
# 打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建 API Key # 拿到形如 sk-xxxx 的 Key 后,配置 Claude Code 的 Base URL export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的Key"如果你用的是 Claude Code 的配置文件方式,可以写进环境变量或对应配置项,核心就是 Base URL 指向https://taotoken.net/api,Key 用刚创建的那串。配好后跑一句简单对话确认链路通:
claude -p "回复 ok 即可"返回正常,说明 Claude Code 已经能调用模型。接下来所有排查指令都通过它执行。需要管理多个 Key 或看用量,可以进控制台:
# Key 管理:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite # 新建/查看 Key:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite注意:TaoToken 只提供 Key 和模型调用入口,runsc 路径核对、daemon.json 校验、Docker 重启验证这些动作,都是 Claude Code 在你自己机器上执行的。别把两者搞混。
3. 可复制配置:runsc 路径 + daemon.json + 重启
先把基础配置摆正,这是后面让 Claude Code 排查的输入。第一步下载 runsc 并放到系统路径:
curl -Lo runsc https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/runsc chmod +x runsc sudo mv runsc /usr/local/bin/确认路径和可执行权限,这一步经常被忽略:
which runsc ls -l /usr/local/bin/runsc /usr/local/bin/runsc --version如果which runsc没输出,说明 PATH 或文件位置有问题,Docker 自然找不到。接着写 daemon.json,注意 runtimes 字段的层级:
sudo tee /etc/docker/daemon.json <<'EOF' { "runtimes": { "runsc": { "path": "/usr/local/bin/runsc" } } } EOF写完先做 JSON 语法校验,很多人栽在多余逗号或中文引号上:
sudo python3 -m json.tool /etc/docker/daemon.json能正常打印格式化 JSON 才算合法。然后重启 Docker 并确认服务真的起来了:
sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl status docker --no-pager到这里配置层面就齐了。把上面这些命令的输出收集起来,下一步直接喂给 Claude Code 做核对。
4. 让 Claude Code 跑 gVisor runsc 运行时排查任务
这一步是核心。把 daemon.json 内容、docker info的 Runtime 段、runsc 路径检查结果拼成一段提示,交给 Claude Code。可以这样组织:
claude -p " 你是 Docker 运行时排查助手。请逐项核对以下信息,找出 runsc 不被识别的原因: 1. runsc 路径是否为 /usr/local/bin/runsc,是否有可执行权限 2. /etc/docker/daemon.json 的 runtimes 字段是否正确,JSON 是否合法 3. systemctl restart docker 是否成功,docker 服务是否 active 4. docker info 的 Runtimes 列表是否包含 runsc 以下是现场信息: --- daemon.json --- $(sudo cat /etc/docker/daemon.json) --- runsc 检查 --- $(which runsc; ls -l /usr/local/bin/runsc; /usr/local/bin/runsc --version 2>&1) --- docker info Runtimes --- $(docker info 2>&1 | grep -A5 -i runtime) --- docker 服务状态 --- $(systemctl is-active docker) 请给出结论和修复命令。 "Claude Code 会按清单逐项比对,常见结论有三类:路径写错(比如写成了 /usr/bin/runsc)、daemon.json 里 runtimes 拼成了 runtime、或者 Docker 重启失败导致配置没加载。拿到结论后按它给的命令修,再重新验证。
验证 runsc 是否被识别,最直接的就是看docker info:
docker info | grep -i runtime正常应该能看到runsc: /usr/local/bin/runsc这样的条目。然后跑一个最小容器确认运行时可用:
docker run --rm --runtime=runsc hello-world能正常输出 Hello from Docker,说明 gVisor 沙箱运行时已经生效。这一步过了,再往下做 Ubuntu 桌面容器才有意义。
5. 跑通 Ubuntu 容器 + 远程浏览器访问链路
runsc 识别之后,回到 gVisor 跑 Ubuntu 容器并通过远程浏览器访问的完整流程。启动带 VNC 的 Ubuntu 容器:
docker run -d -it --runtime=runsc --name ubuntu-vnc -p 5901:5901 -e USER=root ubuntu bash进容器装桌面和 VNC:
docker exec -it ubuntu-vnc bash apt update && apt install -y xfce4 xfce4-goodies tightvncserver vncserver vncserver -kill :1 echo '#!/bin/bash xrdb $HOME/.Xresources startxfce4 &' > ~/.vnc/xstartup chmod +x ~/.vnc/xstartup vncserver -geometry 1280x720宿主机装 NoVNC 并启动:
sudo apt install -y novnc novnc_server --vnc localhost:5901 --listen 6080浏览器访问http://<服务器IP>:6080/vnc.html,输入 VNC 密码就能看到 gVisor 沙箱里的 Ubuntu 桌面。如果这一步容器起不来,多半还是 runsc 运行时没生效,回到第 4 步重新核对。
| 检查项 | 期望结果 | 常见异常 |
|---|---|---|
| runsc 路径 | /usr/local/bin/runsc 可执行 | 路径写错、无执行权限 |
| daemon.json | runtimes.runsc.path 正确 | 字段拼错、JSON 非法 |
| docker 服务 | active (running) | 重启失败、配置未加载 |
| docker info | Runtimes 含 runsc | 列表为空 |
| 容器启动 | --runtime=runsc 成功 | unknown runtime |
6. 本篇常见错排查
报错一:unknown runtime: runsc。先看docker info有没有 runsc。没有就查 daemon.json 的 runtimes 字段层级,确认是runtimes不是runtime,path 指向真实文件。改完必须systemctl restart docker。
报错二:daemon.json 改了但没生效。多半是 JSON 语法错误导致 Docker 启动时忽略了配置。用python3 -m json.tool校验,或看journalctl -u docker有没有解析报错。
报错三:runsc 路径对但 Docker 找不到。检查文件权限,chmod +x是否执行;再确认没有多个 runsc 版本冲突,which -a runsc看全部路径。
报错四:容器起来了但浏览器访问不了。确认 6080 端口放行、NoVNC 进程在跑、VNC 密码正确。gVisor 沙箱内网络和普通容器略有差异,端口映射要写全。
报错五:Claude Code 排查时读不到现场信息。确认 Base URL 是https://taotoken.net/api、Key 有效。链路不通时先跑claude -p "ok"验证。需要换 Key 或看文档:
# 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite # 模型对话验证:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=model&utm_campaign=rewrite如果你要长期跑编码或 Agent 类任务,反复手动配 Key 比较烦,可以看 Coding Plan:
# https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite排查顺序建议固定成:runsc 路径 → daemon.json 合法性 → Docker 服务状态 → docker info 运行时列表 → 最小容器验证。这五步走完,runsc 不识别基本都能定位。把现场输出丢给 Claude Code 跑一遍清单核对,比人肉猜快得多。