
Browserless:一行 Docker 命令起一个无头浏览器服务|部署与使用全指南
Browserless 把「在服务器上跑 Chrome / Firefox」这件破事封装成一个
Docker 容器:你只管写 Puppeteer 或 Playwright 脚本,通过
ws://
连过来用,字体、依赖、崩溃重启、并发队列、调试查看器它都帮你管好了。开源版自托管免费,云版与企业版额外提供反检测、住宅代理、Session
回放等高级能力。
1. 项目简介与定位
官方一句话:Deploy headless browsers in Docker. Run on our cloud or bring your own. 它解决的是「在 CI / 服务器上跑 Chrome 总是缺字体、随机崩溃、依赖地狱、Lambda 超时」这类问题。
1.1 核心信息一览
| 项目 | 内容 |
|---|---|
| 名称 | Browserless |
| 仓库 | https://github.com/browserless/browserless |
| 定位 | 无头浏览器托管服务(Docker 镜像) |
| 许可证 | SSPL-1.0 OR Browserless Commercial License(双协议) |
| 运行时 | Node.js(容器内) |
| 部署方式 | Docker:ghcr.io/browserless/chromium /
firefox / multi |
| 默认端口 | 3000 |
| 接入协议 | WebSocket(Puppeteer / Playwright)+ REST API |
| 在线文档 | http://localhost:3000/docs(启动后本机访问) |
1.2 适用场景
- 已经有 Puppeteer / Playwright 脚本,想把浏览器从本地开发机搬到服务器。
- 在 CI 里跑端到端测试或 PDF / 截图任务,不想每个 runner 都装一遍 Chrome。
- 需要在一个常驻服务里集中管理并发、队列、超时,而不是每个任务起一个 Chrome。
- 想给内部团队一个「浏览器即服务」端点,脚本直接
puppeteer.connect({browserWSEndpoint})就能用。
1.3 能力边界(官方口径)
- 开源版提供核心浏览器自动化能力:并发与队列、调试查看器、字体与 emoji、超时配置、Chrome 崩溃不影响服务、ARM64 支持。
- BrowserQL 反检测、住宅代理、Session 回放、Chrome 扩展、MCP
Server、
/smart-scrape/crawl/map/searchREST API 这些是 Cloud / Enterprise 专属,开源镜像里没有。 - 商用闭源系统内置 Browserless 需要购买商业许可。
2. 开源协议
仓库原文:SPDX-License-Identifier: SSPL-1.0 OR Browserless Commercial License。
- SSPL-1.0:MongoDB 那一套 Server Side Public License。如果你只是把它当内部浏览器服务用、不对外卖「Browserless 即服务」,一般不触发开源义务;但如果你想把它打包成自己的云产品卖给客户,必须开源整个服务栈或购买商业许可。
- 商业许可:允许闭源商用、企业内网部署、修改源码、使用新版管理后台,并获得官方优先级支持。
3. 官方仓库与链接
- 仓库:https://github.com/browserless/browserless
- 文档:https://docs.browserless.io
- Docker Hub:https://hub.docker.com/r/browserless/chrome
- 云服务:https://browserless.io
- 状态页:https://status.browserless.io
- 联系方式:support@browserless.io
4. 前置要求
- 一台装了 Docker 的机器(Linux / macOS / Windows 均可)。
- 内存建议 ≥ 2GB(每个浏览器实例会占用 300–500MB)。
- 开放 3000 端口(或你
-p映射的端口)。 - 写脚本的一侧:Node.js ≥ 18,并安装
puppeteer-core或playwright-core(注意是 core 版,不需要再下 Chromium)。
5. 安装部署
5.1 一行命令起 Chromium(README 原文)
docker run -p 3000:3000 ghcr.io/browserless/chromium启动后:
- 文档:http://localhost:3000/docs
- WebSocket 端点:
ws://localhost:3000
5.2 跑 Firefox 或多浏览器镜像
README 原文:Use ghcr.io/browserless/firefox or
ghcr.io/browserless/multi for Firefox/Webkit
support.
# 仅 Firefox
docker run -p 3000:3000 ghcr.io/browserless/firefox
# Chromium + Firefox + WebKit 三合一
docker run -p 3000:3000 ghcr.io/browserless/multi5.3 守护化运行(生产建议)
docker run -d \
--name browserless \
--restart unless-stopped \
-p 3000:3000 \
ghcr.io/browserless/chromium反向代理(Nginx / Caddy)把 3000 套上 HTTPS;如果对公网开放,务必加鉴权(详见官方文档 Auth 章节),否则任何人都能用你的服务器开浏览器。
6. 最小示例代码
6.1 Puppeteer 接入(README 原文)
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://localhost:3000',
});
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();输出:
Example Domain6.2 Playwright 接入(README 原文)
import pw from 'playwright-core';
const browser = await pw.firefox.connect(
'ws://localhost:3000/firefox/playwright',
);
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();注意:用 Chromium 镜像时连 ws://localhost:3000;用 multi
镜像时按浏览器走对应子路径(/chromium/playwright、/firefox/playwright、/webkit/playwright)。
6.3 脚本一侧的依赖安装
npm install puppeteer-core
# 或
npm install playwright-core不要再
npx puppeteer browsers install chrome ——
浏览器跑在容器里,本地不需要 Chrome。
7. 配置项说明
README 提到的可配置项(完整环境变量表见 LEARN_MORE.md
与官方文档):
| 配置 | 作用 |
|---|---|
PORT |
容器内监听端口,默认 3000 |
CONCURRENT |
同时允许的浏览器会话数 |
QUEUED_SESIONS / MAX_QUEUE_LENGTH |
队列长度上限 |
TIMEOUT / SESSION_TIMEOUT |
单会话默认超时 |
TOKEN |
访问令牌;对外暴露时强烈建议设置 |
HOST |
绑定地址,默认 0.0.0.0 |
启动时挂载:
docker run -p 3000:3000 \
-e CONCURRENT=10 \
-e TOKEN=your-secret-token \
ghcr.io/browserless/chromium带 token 后,客户端连接串变成
ws://localhost:3000?token=your-secret-token。
8. 常见问题
Q1:连接报 ECONNREFUSED?
确认容器在跑(docker ps)、端口映射对(docker port browserless)、防火墙放通
3000。
Q2:页面截图缺中文字体 / emoji? README
明示开源镜像「All system fonts and emoji support
out-of-the-box」。如果还是缺,多半是你自己在脚本里
page.screenshot()
渲染的页面字体依赖网络下载,被浏览器无网络模式挡了。
Q3:ARM Mac 上能跑吗? README:ARM64 architecture support — Full support for ARM64 platforms including Apple Silicon; some browsers (Edge, Chrome) have limited ARM64 compatibility. Chromium / Firefox 没问题。
Q4:Chrome 崩了会把服务带崩吗? README:If Chrome crashes, Browserless won't. 单页崩溃只影响当前会话。
Q5:能直接 REST 拿 HTML / PDF / 截图吗?
开源镜像提供基础
/function、/screenshot、/pdf、/content
等 HTTP 路由;/smart-scrape /crawl
/map /search 是企业版。
Q6:SSPL 到底能不能商用? 只在公司内部当浏览器服务用、不对外售卖「浏览器云」,通常没问题;要做成对外产品请购买商业许可。
9. 与同类工具对比
| 工具 | 形态 | 浏览器来源 | 适合谁 |
|---|---|---|---|
| Browserless | Docker 服务 | 容器内置 Chromium / Firefox | 已有 Puppeteer/Playwright 脚本,想集中托管浏览器 |
| 裸 Puppeteer / Playwright | 本地库 | 本地装的 Chromium | 单机开发,不需要服务化 |
| Selenium Grid | Java 服务 | 自己装浏览器 | Java 技术栈的 E2E 测试网格 |
| Chromedp / chromedp + headless shell | Go 库 | 自带 Chromium | Go 后端服务内嵌浏览器 |
| Firecrawl | 托管 API | 云版自带浏览器池 | 给 LLM 喂 Markdown,连 Puppeteer 都不想写 |
Jina Reader (r.jina.ai) |
URL→Markdown 代理 | 云版自带 | 只想要正文,不要浏览器控制权 |
10. 许可
SSPL-1.0 或 Browserless Commercial License 二选一。SSPL copyleft 范围覆盖整个服务栈;商用闭源请购买商业许可。
11. 责任使用声明
用 Browserless 起的浏览器去做自动化时,请遵守:
- 尊重目标站点
robots.txt与服务条款,不要用无头浏览器伪装真人绕过反爬声明。 - 合理设置并发与延时,不要把容器当成批量压测机。
- 不绕过登录墙、付费墙、验证码去获取付费内容。
- 不批量采集个人隐私数据(评论、私信、通讯录等)。
- 仅将自动化用于公开数据、合法测试与个人学习研究。
- 尊重原网站内容版权,截图 / 抓取结果二次发布时遵守原站点授权要求。