lesson-08
8.1 Docker 与宿主机网络的通信壁垒
我们现在有两个组件:
- 宿主机:监听在
localhost:40000的 Cloudflare WARP 代理。 - Docker 容器:内部运行的 Firecrawl 服务。
核心问题:在 Docker 容器内部,localhost 指的是容器自己,而不是你的 Mac 或 Linux 宿主机。如果我们在 Firecrawl 配置中填入 PROXY_SERVER=socks5://localhost:40000,请求会发往容器自己的 40000 端口,最终导致连接被拒绝 (Connection refused)。
host.docker.internal 魔法
为了解决这个问题,Docker 提供了一个特殊的 DNS 域名:host.docker.internal。在容器内访问这个地址,会被自动解析为宿主机的内网 IP。
8.2 修改 Firecrawl 环境变量
我们需要告诉 Firecrawl:所有的出站抓取请求,请走宿主机上的 40000 端口。
打开你克隆的 Firecrawl 目录下的 .env 文件,在文件末尾添加以下两行配置:
# /firecrawl/.env
# 全局 SOCKS5 代理配置(指向宿主机的 WARP 代理)
# 注意:不能用 localhost,必须用 host.docker.internal
PROXY_SERVER="socks5://host.docker.internal:40000"
# (可选但推荐) 如果目标网站有地理位置限制,可以填用户名密码伪装
# PROXY_USERNAME="usr"
# PROXY_PASSWORD="pwd"
注意:Linux 系统的 Docker 默认可能不解析
host.docker.internal。如果你在 Linux 服务器上运行,需要在docker-compose.yaml中为对应容器添加extra_hosts: - "host.docker.internal:host-gateway"。
8.3 双重注入:同时配置 Node.js 和 Playwright
正如我们在第 6 课中分析的,Firecrawl 有两个抓取引擎。仅仅修改 .env 并不够,我们要确保 docker-compose.yaml 把这个代理环境变量传递给了两个关键容器。
打开 docker-compose.yaml 进行检查或修改:
services:
# 1. 核心 API 服务(处理静态页面抓取)
firecrawl-api:
image: mendableai/firecrawl-api:latest
environment:
- PROXY_SERVER=${PROXY_SERVER} # ✅ 确保这一行存在
# ... 其他配置
# 2. Playwright 浏览器服务(处理动态 JS 页面渲染)
playwright-service:
image: mendableai/firecrawl-playwright:latest
environment:
- PROXY_SERVER=${PROXY_SERVER} # ✅ 确保这一行存在
# ... 其他配置
修改完毕后,重启容器让配置生效:
docker compose down
docker compose up -d
8.4 穿透测试:验证代理是否生效
是时候检验我们的努力成果了。我们将让本地的 Firecrawl 去抓取一个显示客户端 IP 的网站(比如 httpbin.org/ip 或 cloudflare.com/cdn-cgi/trace)。
打开终端,发送以下请求测试静态抓取:
curl -X POST http://localhost:3002/v1/scrape \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.cloudflare.com/cdn-cgi/trace",
"formats": ["markdown"]
}'
预期结果分析:
如果你在返回的 markdown 文本中看到了 warp=on 和一个陌生 IP,说明 Node.js (API 容器) 已经成功走 WARP 代理出海!
接下来测试浏览器动态渲染:
curl -X POST http://localhost:3002/v1/scrape \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.cloudflare.com/cdn-cgi/trace",
"formats": ["markdown"],
"waitFor": 2000
}'
(注意:加上 waitFor 往往会触发底层使用 Playwright 引擎渲染)
如果依然返回了 warp=on 的内容,恭喜你!整个 Firecrawl 集群已经被成功改造为一个具备 Cloudflare 边缘 IP 隐身能力的无敌抓取器。 并且,这一切都在你的本地运行,没有影响你电脑的任何其他软件!
7.5 课后问题
- 为什么在 Docker 容器内的配置中,不能把代理地址写成
socks5://127.0.0.1:40000? - 如果不在
playwright-service容器中注入PROXY_SERVER环境变量,会发生什么? - 如果你想为特定的爬取任务临时关闭代理,Firecrawl API 是否支持在请求体中覆盖环境变量?