lesson-08

⏱ Est. reading time: 6 min Updated on 5/14/2026

8.1 Docker 与宿主机网络的通信壁垒

我们现在有两个组件:

  1. 宿主机:监听在 localhost:40000 的 Cloudflare WARP 代理。
  2. 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/ipcloudflare.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 课后问题

  1. 为什么在 Docker 容器内的配置中,不能把代理地址写成 socks5://127.0.0.1:40000
  2. 如果不在 playwright-service 容器中注入 PROXY_SERVER 环境变量,会发生什么?
  3. 如果你想为特定的爬取任务临时关闭代理,Firecrawl API 是否支持在请求体中覆盖环境变量?