开发者实现将 Chromium 浏览器引擎运行在轻量级 Unikernel 上,在资源隔离和最小化依赖方面有创新意义,适合系统编程和容器化场景。
Kernel 为浏览器自动化和网络代理提供沙箱化、开箱即用的 Chrome 浏览器。本仓库为我们的托管服务提供支持。
支持 Chrome DevTools 基础的浏览器框架(Playwright、Puppeteer)连接的沙箱化 Chrome 浏览器
远程 GUI 访问(实时视图流)用于可视化监控和远程控制
可配置的实时视图设置(只读视图、浏览器窗口尺寸)
可控制的浏览器会话视频回放
运行自动化的基于浏览器的工作流
开发和测试使用浏览器的 AI agents
构建需要受控浏览器环境的自定义工具
该镜像可用于在 Docker 容器或 Unikraft unikernels 中运行完整的 Chromium。unikernel 实现建立在基础 Docker 镜像之上,并具有在 unikernel 上运行的额外优势:
网络无活动时自动待机 / "休眠模式"(无活动时消耗可忽略不计的资源)
进入待机模式时,unikernel 的状态会被快照保存,可以精确地恢复到进入休眠时的样子。如果你想重用会话状态(浏览器认证 cookie、与本地文件交互、浏览器设置,甚至你所在的精确页面和窗口缩放),这会很有用。
超快的冷启动(<20ms),这对需要超低延迟事件处理器的任何应用都可能很有用。
你可以直接将 Dockerfile 构建并运行为 Docker 容器。
cd images/chromium-headful
IMAGE=kernel-docker ./build-docker.sh
IMAGE=kernel-docker ENABLE_WEBRTC=true ./run-docker.sh
或者,你可以在 Unikraft unikernel 上运行浏览器。
curl -sSfL https://get.kraftkit.sh | sh
export UKC_METRO=<region> export UKC_TOKEN=<secret>
IMAGE=YOUR_UKC_USERNAME/chromium-headless-test:latest images/chromium-headless/build-unikernel.sh
IMAGE=YOUR_UKC_USERNAME/chromium-headless-test:latest images/chromium-headless/run-unikernel.sh 或 IMAGE=YOUR_UKC_USERNAME/chromium-headful-test:latest VOLIMPORT_PREFIX=official images/chromium-headful/run-unikernel.sh
部署成功完成后,Kraft CLI 将输出类似这样的内容:
Deployed successfully!
│
├───────── name: kernel-cu
├───────── uuid: 0cddb958...
├──────── metro: <region>
├──────── state: starting
├─────── domain: https://<service_name>.kraft.host
├──────── image: onkernel/kernel-cu@sha256:8265f3f188...
├─────── memory: 8192 MiB
├────── service: <service_name>
├─ private fqdn: <id>
├─── private ip: <ip>
└───────── args: /wrapper
该镜像至少需要 8GB 内存。
要部署启用 WebRTC 桌面流而不是 noVNC 的实现:ENABLE_WEBRTC=true NEKO_ICESERVERS=xxx ./run-unikernel.sh
部署到 Unikraft Cloud 时,如果设置 ENABLE_WEBRTC=true,需要使用 TURN 服务器,因为当前不支持直接公开 UDP 端口。NEKO_ICESERVERS:描述 ICEAgent 可用来与对等端建立连接的多个 STUN 和 TURN 服务器。例如 [{"urls": ["turn:turn.example.com:19302", "stun:stun.example.com:19302"], "username": "name", "credential": "password"}, {"urls": ["stun:stun.example2.com:19302"]}]。
各种服务(mutter、tint)需要几秒钟才能启动。启动后,待机和重启时间极快。
Unikraft 部署生成一个 URL。该 URL 是公开的,这意味着任何有 URL 的人都可以访问远程 GUI。仅将其用于非敏感浏览器交互,完成后删除 unikernel 实例。
你可以调用 browser.close() 断开与浏览器的连接,网络活动结束后 unikernel 将进入待机状态。然后你可以使用 CDP 重新连接到实例。browser.close() 结束 websocket 连接但不会实际关闭浏览器。
可以使用变量调整 VCPUS 值:VCPUS=8
Port 9222 通过 ncat 公开,允许你连接基于 Chrome DevTools Protocol 的浏览器框架,如 Playwright 和 Puppeteer(以及基于 CDP 的 SDK,如 Browser Use)。你可以使用这些框架在云中驱动浏览器。你也可以断开与浏览器的连接并重新连接到它。
首先,获取浏览器的 CDP websocket 端点:
const url = new URL("http://localhost:9222/json/version");
const response = await fetch(url, {
headers: {
"Host": "<this can be anything>" // Required if using a unikernel
}
});
if (response.status !== 200) {
throw new Error(
`Failed to retrieve browser instance: ${
response.statusText
} ${await response.text()}`
);
}
// webSocketDebuggerUrl should look like:
// ws:///devtools/browser/06acd5ef-9961-431d-b6a0-86b99734f816
const { webSocketDebuggerUrl } = await response.json();
然后,连接一个远程 Playwright 或 Puppeteer 客户端到它:
// Puppeteer
const browser = await puppeteer.connect({
browserWSEndpoint: webSocketDebuggerUrl,
});
// Playwright
const browser = await chromium.connectOverCDP(webSocketDebuggerUrl);
你可以使用嵌入式实时视图来监控和控制浏览器。实时视图支持对浏览器的读和写访问。两者都映射到端口 443。
NoVNC:一个 VNC 客户端。支持读/写。在 ./run-docker.sh 中设置 ENABLE_WEBRTC=false。
WebRTC:一个基于 WebRTC 的客户端。支持读/写、窗口调整大小和复制/粘贴。速度比 VNC 快得多。设置 ENABLE_WEBRTC=true 时可用。
WebRTC 实现中的音频流目前无法正常使用,需要修复。
实时视图默认为读/写。你可以通过在 docker run 中添加 -e ENABLE_READONLY_VIEW=true \ 将其设置为只读。
你可以使用嵌入式录制服务器在我们的完整镜像中捕获整个屏幕的录制。它一次允许一个录制,可以通过 WITH_KERNEL_IMAGES_API=true 启用
cd images/chromium-headful
export IMAGE=kernel-docker
./build-docker.sh
WITH_KERNEL_IMAGES_API=true ENABLE_WEBRTC=true ./run-docker.sh
# 1. 开始新的录制
curl http://localhost:10001/recording/start -d {}
# 正在录制 - 运行你的 agent
# 2. 停止录制
curl http://localhost:10001/recording/stop -d {}
# 3. 下载录制的文件
curl http://localhost:10001/recording/download --output recording.mp4
注意:录制文件被编码为 H.264/MPEG-4 AVC 视频文件。QuickTime 在播放时存在已知问题,请确保使用兼容的媒体播放器!
本仓库为我们的托管浏览器基础设施提供支持。
在提交拉取请求或问题之前,请阅读我们的贡献指南。
有关详情,请参见许可证文件。
如有问题、疑问或反馈,请在此仓库中开启 issue。你也可以加入我们的 Discord。
我们的 WebRTC 实现改编自 Neko。
感谢 xonkernel 领导开发了我们的 WebRTC 实时视图。
感谢 Unikraft Cloud 团队对 unikernels 的帮助。
由 Kernel 团队用 ❤️ 制作。