这次记录 Playwright MCP 的 Docker 部署方式。目标不是把浏览器自动化讲成概念,而是给 AI Agent 准备一个可控的浏览器工具运行时:镜像先拉下来,MCP JSON 能启动,截图和日志有目录,网络和账号边界能提前写清。
先做镜像预检:
bash
docker pull mcr.1ms.run/playwright/mcp
mcr.1ms.run/playwright/mcp 对应上游 MCR 镜像入口。这里先确认 Registry 入口和镜像拉取链路,再继续排 MCP 配置和浏览器权限。
1. 环境目标
本文目标:
- 用 Docker 运行 Playwright MCP Server。
- 通过 MCP 客户端配置
mcpServers.playwright。 - 把浏览器工具限制在可控容器生命周期里。
- 为截图、trace、下载文件预留输出目录。
- 上线前检查账号、网络、凭据和资源限制。
适用场景:
- AI Agent 做内部后台巡检。
- 回归测试里补一层浏览器路径检查。
- Bug 复现时截图和记录页面状态。
- 测试环境里跑低风险表单流程。
2. 最小 MCP JSON
先用最小参数验证:
json
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--init",
"--name",
"playwright-mcp",
"mcr.1ms.run/playwright/mcp"
]
}
}
}
参数说明:
| 参数 | 作用 |
|---|---|
run |
启动容器 |
-i |
MCP stdio 通信需要保持输入流 |
--rm |
退出后清理容器 |
--init |
处理容器内子进程 |
--name |
便于排查容器状态 |
mcr.1ms.run/playwright/mcp |
Playwright MCP 镜像入口 |
3. 增加输出目录
如果需要保存截图、trace 或下载文件,可以给容器挂一个输出目录:
bash
mkdir -p mcp-output
json
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--init",
"--name",
"playwright-mcp",
"-v",
"./mcp-output:/tmp/mcp-output",
"mcr.1ms.run/playwright/mcp"
]
}
}
}
输出目录要按项目隔离,不要把浏览器下载目录直接挂到用户主目录。
4. 增加资源边界
浏览器容器可能吃 CPU 和内存,建议在测试机上加资源边界:
json
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--init",
"--name",
"playwright-mcp",
"--cpus",
"2",
"--memory",
"2g",
"mcr.1ms.run/playwright/mcp"
]
}
}
}
资源值要按页面复杂度调整。后台页面截图、简单表单和完整 E2E 测试的资源消耗差异很大。
5. 验证顺序
建议按下面顺序排:
bash
docker pull mcr.1ms.run/playwright/mcp
docker images | grep playwright
docker ps -a | grep playwright-mcp
如果 MCP 客户端无法调用工具,先看三类问题:
| 现象 | 排查方向 |
|---|---|
| 客户端找不到 server | JSON 路径、字段名、客户端重载 |
| 容器启动后退出 | Docker args、镜像版本、容器日志 |
| 浏览器动作失败 | 测试账号、目标 URL、页面权限 |
| 截图没有产物 | 输出目录挂载和工具参数 |
| 页面能打开但不能操作 | 元素选择、登录态、权限和弹窗 |
6. 权限检查表
| 检查项 | 建议 |
|---|---|
| 账号 | 只给测试账号或低权限账号 |
| 域名 | 控制访问域名和内网段 |
| 输出 | 截图、trace、下载目录单独管理 |
| 凭据 | 不把 Cookie、Token 写进截图和日志 |
| 操作 | 删除、支付、批量修改等动作默认关闭 |
| 审计 | 记录任务、时间、页面路径和输出文件 |
总结
Playwright MCP 解决的是 Agent 操作浏览器的工具接口问题,Docker 解决的是运行时边界问题。部署时不要只看镜像是否能拉下来,还要把 MCP JSON、容器生命周期、输出目录、账号权限和网络范围一起检查。
毫秒镜像在这里的作用很具体:当镜像来自 MCR 时,用 mcr.1ms.run/playwright/mcp 先做拉取预检。镜像阶段通过后,后面的重点是浏览器工具边界。