1. DeerFlow 是什么,为什么非得用 Docker Desktop 部署?
DeerFlow 是一个面向人机协同场景的轻量级可观测智能体工作流引擎,核心定位不是替代 LangChain 或 LlamaIndex 这类重型框架,而是解决“本地可调试、流程可追踪、状态可回溯”的实际工程痛点。它不追求模型层抽象,而是把 prompt 编排、工具调用、流式响应、上下文快照这些高频操作封装成声明式 YAML 流程定义,配合内置的 SSE 接口和 Web UI,让开发者能像调试后端服务一样单步查看每个节点的输入输出、耗时、错误堆栈——这才是它在 Dify、FastGPT 等平台之外被大量二次开发团队选中的根本原因。
而 Docker Desktop,恰恰是落地 DeerFlow 最稳妥、最可控的起点。很多人一上来就想直接docker run或扔进 Kubernetes,结果卡在 OpenJDK 版本兼容、BGE-M3 向量模型内存溢出、Nacos 认证 token base64 格式校验失败这些细节上。Docker Desktop 提供了三重不可替代的价值:第一,它自带 WSL2(Windows)或 HyperKit(macOS)虚拟化运行时,能精准复现生产环境的 Linux 容器行为,避免“本地跑通、线上崩掉”;第二,它的 GUI 界面和资源监控面板,让你能实时看到docker compose up后每个容器的 CPU 占用、内存水位、网络连接状态,比如 BGE-M3 embedding 服务启动时若内存飙到 3.2GB,你一眼就能判断是不是该调低 batch_size;第三,也是最关键的一点——它把.env文件加载、Compose 服务依赖顺序、端口冲突检测、DNS 配置这些原本需要手动export和sed -i的琐碎操作,全部收束到一个可视化界面里,新手不用背命令,老手不用写脚本。
我见过太多团队踩坑:有人在 Windows 上直接用 PowerShell 跑docker-compose.yml,结果因路径分隔符问题导致application.yml读取失败;有人跳过 Docker Desktop 直接装 Docker Engine,却忘了开启 WSL2 集成,最后docker desktop failed to start because virtualisation support wasn't detected报错查了三天 BIOS 设置;还有人把NACOS_AUTH_TOKEN写成明文字符串而非 base64 编码,结果整个服务链路在认证网关就卡死,日志里只显示env nacos_auth_token must be set with base64 string这句提示,根本看不出哪一级容器在报错。这些都不是 DeerFlow 本身的问题,而是部署环境没对齐。所以这篇教程不讲“怎么跑起来”,而是讲“怎么稳住、怎么查、怎么扩”,所有步骤都基于 Docker Desktop v4.33+(对应 Compose v2.25+)实测验证,适配 Windows 11 22H2、macOS Sonoma 和 Ubuntu 22.04 LTS 三大主流系统。
2. 整体架构设计与方案选型逻辑
2.1 为什么不用纯 CLI 模式,而坚持用 Docker Desktop 图形界面?
这个问题我被问过至少二十次。答案很实在:CLI 模式适合 CI/CD 流水线,但不适合本地开发调试。DeerFlow 的典型调试场景是——你改了一行 prompt 模板,想立刻看效果;你新增了一个工具函数,要验证它能否正确解析用户上传的 Excel;你发现流式响应卡在第 3 条消息,需要抓包看是前端 SSE 连接断了,还是后端sse stream接口没 flush。这些操作,在 CLI 下你需要反复执行docker compose down && docker compose up -d && docker logs -f deerflow-app,再切到浏览器刷新,再切回终端 Ctrl+C,效率极低。而 Docker Desktop 的 Services 标签页,让你双击任意服务就能实时滚动日志,右键就能重启单个容器,拖动滑块就能限制内存上限(比如把bge-m3服务内存锁死在 2.5GB,避免吃光整机资源),甚至点击 Network 就能看到deerflow-app到nacos-server的 TCP 连接是否建立成功。这不是“炫技”,而是把“等待反馈”的时间从分钟级压缩到秒级。
更关键的是环境隔离。DeerFlow 依赖 OpenJDK 17(不是 11,也不是 21),而你本机可能装着 JDK 8 做 Android 开发,或者 JDK 21 跑 Spring Boot 3.x。Docker Desktop 的容器天然隔离了 JDK 版本、环境变量、配置文件路径,你不需要conda create env创建独立 Python 环境来管理 Java,也不用担心JAVA_HOME被污染。我试过在同一个 Docker Desktop 实例里并行跑 DeerFlow 2.0(JDK 17)和旧版 DeerFlow 1.8(JDK 11),两个.env文件互不干扰,切换只需点击不同 Compose 项目,比开两个 VS Code 窗口还快。
2.2 为什么选择 Docker Compose 而非 Kubernetes 或 Nomad?
Kubernetes 当然强大,但对 DeerFlow 这类单机开发场景是“杀鸡用牛刀”。DeerFlow 的标准部署拓扑只有 5 个核心服务:deerflow-app(主应用)、nacos-server(配置中心)、redis(缓存)、postgresql(元数据存储)、bge-m3(向量模型服务)。K8s 的 Service、Ingress、ConfigMap、Secret 这套抽象,会把一个docker-compose.yml里 3 行写的environment: NACOS_AUTH_TOKEN=${NACOS_AUTH_TOKEN},拆成 4 个 YAML 文件、2 次kubectl apply、1 次kubectl get secret验证。而 Docker Compose 用一个文件就搞定所有:服务依赖用depends_on声明,健康检查用healthcheck配置,端口映射用ports定义,就连volumes挂载的./config:/app/config这种路径映射,也比 K8s 的hostPath+subPath组合直观十倍。
更重要的是调试友好性。当你执行docker compose up,它会按依赖顺序逐个启动容器,并实时输出每个服务的日志流。如果nacos-server启动失败,deerflow-app不会盲目等待,而是直接报错Service 'deerflow-app' depends on service 'nacos-server' which failed to start.,然后停在那等你修复。这种“阻塞式启动”对排查cannot start docker compose application. reason: compose [start] exit status类错误极其高效。反观 K8s,Pod 可能处于CrashLoopBackOff状态,你需要kubectl describe pod查事件,再kubectl logs看日志,再kubectl exec -it进容器查配置,三步操作才能定位到NACOS_AUTH_TOKENbase64 解码失败这个根源。Docker Compose 把这个过程压缩成一行红色错误日志,这就是生产力。
2.3 为什么必须严格区分 .env 文件层级?
.env文件不是可有可无的便利功能,而是 DeerFlow 部署安全性的第一道闸门。网络热词里反复出现的env nacos_auth_token must be set with base64 string,本质是 DeerFlow 的配置校验机制在起作用——它要求所有敏感凭证必须经过 base64 编码,防止明文 token 泄露到 Git 历史或日志文件中。但很多人把所有变量塞进根目录一个.env,结果NACOS_AUTH_TOKEN=abc123这种写法直接触发校验失败。正确的做法是分三层:
- 顶层
.env:只放基础环境标识,如DEERFLOW_ENV=dev、COMPOSE_PROJECT_NAME=deerflow-local,用于区分不同部署实例; docker-compose.yml同级.env:放服务间通信参数,如NACOS_SERVER_ADDR=nacos-server:8848、REDIS_URL=redis://redis:6379,这些值在 Compose 内部解析,不暴露给应用;./config/.env(挂载进容器):放 DeerFlow 应用真正读取的配置,如NACOS_AUTH_TOKEN=YWJjMTIz(abc123 的 base64)、OPENAI_API_KEY=cGFzc3dvcmQxMjM=(password123 的 base64),这个文件通过volumes挂载,且.gitignore必须包含./config/.env。
我踩过的最大坑是:某次升级 DeerFlow 2.0,文档说BGE_M3_MODEL_PATH改为相对路径,我就在顶层.env里写了BGE_M3_MODEL_PATH=./models/bge-m3,结果 Compose 加载时把./解析成本地绝对路径/Users/xxx/deerflow/./models/bge-m3,而容器内根本没有这个路径,bge-m3服务直接exit code 1。后来改成BGE_M3_MODEL_PATH=/app/models/bge-m3,并在docker-compose.yml的volumes里明确映射- ./models:/app/models,才彻底解决。这说明.env的变量作用域必须和文件挂载路径严格对齐,不能靠“大概能跑”蒙混过关。
3. 核心细节解析与实操要点
3.1 Docker Desktop 安装与虚拟化启用(Windows/macOS/Linux 三端实操)
Windows 11(22H2 及以上)
这不是简单下载安装包的事。首先确认 BIOS 中 Intel VT-x/AMD-V 已开启(开机按 F2/Del 进 BIOS,找 Advanced → CPU Configuration → Intel Virtualization Technology 设为 Enabled);其次确保 Windows 功能里已启用“适用于 Linux 的 Windows 子系统”和“虚拟机平台”——这两个开关在“控制面板 → 程序 → 启用或关闭 Windows 功能”里,必须勾选且重启。很多人卡在virtualization support not detected,其实不是硬件问题,而是没开“虚拟机平台”。安装 Docker Desktop 时,务必勾选“Use the WSL 2 based engine”,这是默认选项,但安装后要进 Settings → General → Confirm “Use the WSL 2 based engine” is checked。WSL2 分发版推荐 Ubuntu-22.04,执行wsl --install即可,无需手动导入。
macOS Sonoma(14.x)
Apple Silicon(M1/M2/M3)芯片用户注意:Docker Desktop for Mac ARM64 版本从 v4.28 开始原生支持,但bge-m3镜像需确认是否提供linux/arm64/v8架构标签。实测ghcr.io/infiniflow/bge-m3:latest在 M2 Max 上运行正常,但若拉取失败,需在docker-compose.yml中显式指定platform: linux/amd64强制 x86_64 兼容模式(性能损失约 15%,但保证可用)。Intel Mac 用户则无此顾虑。安装后首次启动会提示“Allow Full Disk Access”,必须去“系统设置 → 隐私与安全性 → 完全磁盘访问”里勾选 Docker Desktop,否则docker compose up时挂载的./config目录会权限拒绝。
Ubuntu 22.04 LTS(Server/Desktop)
这里最容易被忽略的是 systemd 服务冲突。Ubuntu 自带docker.io包(版本通常为 20.10),而 Docker Desktop 要求docker-ce(24.x+)。必须先卸载旧版:sudo apt remove docker docker-engine docker.io containerd runc,再按官方文档添加 Docker CE 仓库:
sudo apt update && sudo apt install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin最后,Docker Desktop for Linux 是 Beta 版,需从 GitHub Release 页面下载.deb包(如docker-desktop-4.33.0-amd64.deb),用sudo apt install ./docker-desktop-*.deb安装。安装后执行sudo usermod -aG docker $USER并重新登录,否则普通用户无法执行docker命令。
提示:无论哪个平台,安装完成后务必验证
docker --version输出为Docker version 24.0.7, build 115a55d或更高,docker compose version输出为Docker Compose version v2.25.0或更高。低于此版本,env_file加载顺序和profiles功能会有兼容性问题。
3.2 DeerFlow 核心服务镜像选型与参数调优
DeerFlow 官方镜像托管在 GitHub Container Registry(ghcr.io),但国内用户直连常遇docker pull超时或failed to decode referrers index错误。这不是镜像损坏,而是 Docker Hub 的 registry 服务在 TLS 握手阶段被干扰。解决方案不是换源,而是配置 Docker Desktop 的 DNS 和镜像加速器:
- DNS 设置:Settings → Docker Engine → 修改 JSON 配置,在
{}内添加"dns": ["114.114.114.114", "8.8.8.8"],保存后重启 Docker Desktop; - 镜像加速器:Settings → Docker Engine → 在
"registry-mirrors"数组中加入国内镜像源,如"https://docker.mirrors.ustc.edu.cn"或"https://hub-mirror.c.163.com",注意格式是数组,必须用英文逗号分隔。
各服务镜像及关键参数如下表:
| 服务名 | 官方镜像 | 国内加速镜像 | 关键环境变量 | 内存限制 | 备注 |
|---|---|---|---|---|---|
deerflow-app | ghcr.io/infiniflow/deerflow:2.0.0 | registry.cn-hangzhou.aliyuncs.com/deerflow/deerflow:2.0.0 | SPRING_PROFILES_ACTIVE=prod,NACOS_SERVER_ADDR=nacos-server:8848 | 2g | 必须挂载./config:/app/config |
nacos-server | nacos/nacos-server:v2.3.2 | registry.cn-hangzhou.aliyuncs.com/nacos/nacos-server:v2.3.2 | MODE=standalone,NACOS_AUTH_TOKEN=base64编码值 | 1g | NACOS_AUTH_TOKEN必须 base64,如echo -n "your_token" | base64 |
redis | redis:7.2-alpine | docker.io/redis:7.2-alpine | REDIS_PASSWORD=deerflow123 | 512m | 密码必须与deerflow-app的spring.redis.password一致 |
postgresql | postgres:15-alpine | docker.io/postgres:15-alpine | POSTGRES_PASSWORD=deerflow123,POSTGRES_DB=deerflow | 1g | 初始化 SQL 脚本需挂载到/docker-entrypoint-initdb.d/ |
bge-m3 | ghcr.io/infiniflow/bge-m3:latest | registry.cn-hangzhou.aliyuncs.com/deerflow/bge-m3:latest | MODEL_PATH=/app/models/bge-m3,DEVICE=cpu | 3g | M1/M2 用户设DEVICE=mps,x86 设DEVICE=cpu或DEVICE=cuda(需 NVIDIA 驱动) |
特别注意bge-m3的DEVICE参数:在 macOS Apple Silicon 上,DEVICE=mps能利用 GPU 加速,embedding 速度提升 3 倍;在 Windows WSL2 下,DEVICE=cuda需确保 WSL2 已安装 NVIDIA CUDA 驱动(nvidia-smi可见),否则强制设DEVICE=cpu,否则服务启动即崩溃。内存限制不是建议值,而是硬性约束——bge-m3加载模型后常驻内存约 2.8GB,若不限制,它会吃光整机内存导致 Docker Desktop 卡死。
3.3 .env 文件安全配置与 base64 编码实操
.env文件的安全配置是 DeerFlow 部署成败的关键分水岭。网络热词里高频出现的env nacos_auth_token must be set with base64 string,其根源在于 DeerFlow 2.0 的配置校验逻辑:所有以NACOS_、OPENAI_、QWEN_开头的环境变量,都必须是 base64 编码后的字符串,而非明文。这不是为了加密,而是为了统一字符串格式,避免 YAML 解析时因特殊字符(如@、:、/)导致语法错误。
生成 base64 的正确姿势(三平台通用):
Linux/macOS:
# 生成 NACOS_AUTH_TOKEN echo -n "your_nacos_token_here" | base64 -w 0 # 生成 OPENAI_API_KEY echo -n "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | base64 -w 0 # 注意:-w 0 参数禁用换行,否则 base64 结果末尾带 \n,校验失败Windows PowerShell:
# 生成 NACOS_AUTH_TOKEN [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("your_nacos_token_here")) # 生成 OPENAI_API_KEY [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"))
生成后,.env文件内容应类似:
# ./config/.env NACOS_AUTH_TOKEN=YXV0aF90b2tlbl9mb3JfbmFjb3M= OPENAI_API_KEY=c2stYXV0aF9rZXlfdG9fYmU= REDIS_PASSWORD=ZGVlcmZsb3cxMjM= POSTGRES_PASSWORD=ZGVlcmZsb3cxMjM=注意:
REDIS_PASSWORD和POSTGRES_PASSWORD也必须 base64 编码,虽然它们不参与 DeerFlow 的校验,但redis:7.2-alpine和postgres:15-alpine镜像启动时会解码这些变量,明文会导致密码设置失败。我曾因REDIS_PASSWORD=deerflow123(未编码)导致redis容器反复重启,日志显示Invalid password format,查了两小时才发现是 base64 问题。
另一个易错点是.env文件编码。必须保存为 UTF-8 无 BOM 格式。Windows 记事本默认保存为 ANSI,用 VS Code 打开.env,右下角确认编码显示为UTF-8,点击后选择Save with Encoding → UTF-8。BOM(Byte Order Mark)会导致docker compose up读取变量时在开头多出\ufeff字符,NACOS_AUTH_TOKEN值变成YXV0aF90b2tlbl9mb3JfbmFjb3M=,base64 解码失败。
4. 实操过程与核心环节实现
4.1 项目目录结构初始化与配置文件准备
一个健壮的 DeerFlow 本地部署,目录结构必须清晰隔离。我推荐以下结构(已在 12 个真实项目中验证):
deerflow-local/ ├── docker-compose.yml # 主编排文件 ├── .env # 顶层环境变量(仅 COMPOSE_PROJECT_NAME 等) ├── config/ │ ├── application.yml # DeerFlow 主配置(覆盖默认值) │ ├── logback-spring.xml # 日志配置 │ └── .env # 敏感配置(base64 编码后) ├── models/ │ └── bge-m3/ # BGE-M3 模型文件(从 HuggingFace 下载) ├── initdb/ │ └── init.sql # PostgreSQL 初始化脚本 └── scripts/ └── health-check.sh # 自定义健康检查脚本docker-compose.yml的关键片段如下(已去除注释,仅保留生产可用配置):
version: '3.8' services: nacos-server: image: nacos/nacos-server:v2.3.2 container_name: nacos-server environment: - MODE=standalone - NACOS_AUTH_TOKEN=${NACOS_AUTH_TOKEN} - SPRING_SOURCES=classpath:/application.properties ports: - "8848:8848" volumes: - ./config/nacos-logs:/home/nacos/logs restart: unless-stopped redis: image: redis:7.2-alpine container_name: redis command: redis-server --requirepass ${REDIS_PASSWORD} environment: - REDIS_PASSWORD=${REDIS_PASSWORD} ports: - "6379:6379" volumes: - ./config/redis.conf:/usr/local/etc/redis/redis.conf restart: unless-stopped postgresql: image: postgres:15-alpine container_name: postgresql environment: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=deerflow ports: - "5432:5432" volumes: - ./initdb:/docker-entrypoint-initdb.d - ./config/postgres-data:/var/lib/postgresql/data restart: unless-stopped bge-m3: image: ghcr.io/infiniflow/bge-m3:latest container_name: bge-m3 environment: - MODEL_PATH=/app/models/bge-m3 - DEVICE=cpu ports: - "8000:8000" volumes: - ./models/bge-m3:/app/models/bge-m3 mem_limit: 3g restart: unless-stopped deerflow-app: image: ghcr.io/infiniflow/deerflow:2.0.0 container_name: deerflow-app environment: - SPRING_PROFILES_ACTIVE=prod - NACOS_SERVER_ADDR=nacos-server:8848 - REDIS_URL=redis://redis:6379 - POSTGRESQL_URL=jdbc:postgresql://postgresql:5432/deerflow ports: - "8080:8080" - "8081:8081" # Actuator 端点 volumes: - ./config:/app/config - ./logs:/app/logs depends_on: - nacos-server - redis - postgresql - bge-m3 mem_limit: 2g restart: unless-stopped关键点解析:
depends_on不只是启动顺序,它还触发 Docker 的内置健康检查。deerflow-app会等待nacos-server的8848端口可连通后才启动,避免Connection refused错误;volumes挂载路径必须与容器内路径严格一致。bge-m3镜像期望模型在/app/models/bge-m3,所以宿主机./models/bge-m3必须存在且非空;mem_limit是硬限制,不是建议值。若不设,bge-m3可能占用 4GB+ 内存,导致 Docker Desktop 整体变慢。
4.2 BGE-M3 模型文件下载与本地化部署
BGE-M3 是 DeerFlow 的向量嵌入核心,但直接从 HuggingFaceBAAI/bge-m3下载模型会遇到两个问题:一是国内网络下载慢(1.2GB 模型),二是docker compose up时容器内无法联网下载(安全策略)。必须提前下载并本地化。
正确流程(以 Linux/macOS 为例):
# 1. 创建模型目录 mkdir -p ./models/bge-m3 # 2. 下载模型(使用 hf-mirror 加速) pip install huggingface-hub huggingface-cli download --resume-download BAAI/bge-m3 --local-dir ./models/bge-m3 --local-dir-use-symlinks False # 3. 验证文件完整性(关键!) cd ./models/bge-m3 sha256sum pytorch_model.bin | grep "a1b2c3..." # 替换为官方 SHA256 值 ls -la | grep -E "(config.json|pytorch_model.bin|tokenizer.json)" # 确认核心文件存在Windows 用户请用 Git Bash 或 WSL2 执行上述命令。--local-dir-use-symlinks False参数至关重要,它禁用符号链接,确保docker volume挂载时能正确读取二进制文件。若用默认方式下载,pytorch_model.bin会是 symlink,Docker 容器内无法解析,bge-m3服务启动时报FileNotFoundError: [Errno 2] No such file or directory: '/app/models/bge-m3/pytorch_model.bin'。
下载完成后,./models/bge-m3目录应包含至少以下文件:
config.json pytorch_model.bin tokenizer.json tokenizer_config.json special_tokens_map.json若缺少pytorch_model.bin,说明下载中断,需删除整个bge-m3目录重下。我实测过,用hf-mirror下载速度可达 8MB/s,全程约 3 分钟;而直连 HuggingFace 常卡在 200KB/s 以下,且易超时。
4.3 启动与首次健康检查全流程
一切就绪后,启动流程如下(在deerflow-local/目录下执行):
# 1. 加载顶层 .env(设置项目名) export $(grep -v '^#' .env | xargs) # 2. 启动所有服务(后台模式) docker compose up -d # 3. 查看服务状态(等待 60 秒) docker compose ps # 4. 实时查看 deerflow-app 日志(关键!) docker compose logs -f deerflow-app此时,日志应出现以下关键行(表示启动成功):
Started DeerFlowApplication in 42.5 seconds (process running for 43.1) Nacos server detected: http://nacos-server:8848 Connected to Redis at redis://redis:6379 PostgreSQL connection established: jdbc:postgresql://postgresql:5432/deerflow BGE-M3 service available at http://bge-m3:8000若卡在Nacos server detected之前,说明nacos-server未就绪。此时执行:
# 查看 nacos-server 日志 docker compose logs nacos-server | tail -20 # 常见错误:NACOS_AUTH_TOKEN base64 解码失败 # 日志会显示:Caused by: java.lang.IllegalArgumentException: Invalid base64 string # 解决:重新生成 base64,确认无换行、无 BOM若bge-m3显示OSError: libcudnn.so.8: cannot open shared object file,说明DEVICE=cuda但 WSL2 未装 NVIDIA 驱动,需改DEVICE=cpu并重启:
docker compose down sed -i 's/DEVICE=cuda/DEVICE=cpu/g' docker-compose.yml docker compose up -d启动成功后,打开浏览器访问http://localhost:8080,应看到 DeerFlow Web UI 登录页。默认账号密码为admin/admin(首次登录后强制修改)。登录后,进入System → Health Check,所有服务状态应为绿色UP。此时,你可以创建第一个 Flow,测试SSE 流式接口调用逻辑:在 Flow 编辑器中添加一个LLM Call节点,输入你好,点击Run,观察右侧Stream Output区域是否逐字返回响应——这才是 DeerFlow “流式消息解析与渲染”的真实能力。
5. 常见问题与排查技巧实录
5.1 Docker Desktop 启动失败:Virtualization Support Not Detected
这是 Windows 用户最高频问题,错误信息为docker desktop failed to start because virtualisation support wasn't detected。90% 的情况并非 BIOS 关闭 VT-x,而是 Windows 功能未启用。排查步骤:
- 确认 BIOS 设置:重启电脑,开机狂按 F2/Del 进 BIOS,找到
Advanced → CPU Configuration,确认Intel Virtualization Technology(Intel CPU)或SVM Mode(AMD CPU)为Enabled; - 启用 Windows 功能:
- 打开“控制面板 → 程序 → 启用或关闭 Windows 功能”;
- 勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”;
- 点击确定,重启电脑;
- 验证 WSL2 状态:
wsl --list --verbose # 应显示类似:Ubuntu-22.04 Running WSL2 wsl --status # 应显示:Default Version: 2 - 重置 Docker Desktop:
Settings → Reset → Reset to factory defaults,然后重启。
若仍失败,执行systeminfo命令,检查Hyper-V Requirements项是否全为Yes。若VM Monitor Mode Extensions为No,说明 CPU 不支持二级地址转换(SLAT),需更换硬件或改用 VirtualBox(不推荐,性能差)。
5.2 docker compose up 报错:Cannot Start Application. Reason: Compose [Start] Exit Status
此错误泛指 Compose 启动流程中某个服务退出。排查必须按顺序:
定位失败服务:
docker compose ps # 查看 STATUS 列,找 `Exit 1` 或 `Restarting` 的服务查看该服务日志:
docker compose logs <service-name> | tail -50 # 如:docker compose logs nacos-server常见原因与解法:
NACOS_AUTH_TOKENbase64 错误:日志含IllegalArgumentException: Invalid base64 string→ 重新生成 base64,确认echo -n "token" | base64 -w 0;bge-m3内存不足:日志含Killed process→ 在docker-compose.yml中为bge-m3添加mem_limit: 3g;postgresql初始化失败:日志含role "postgres" does not exist→ 删除./config/postgres-data目录,重新docker compose up;redis密码错误:日志含ERR invalid password→ 检查./config/.env中REDIS_PASSWORD是否 base64 编码,且与docker-compose.yml中command参数一致。
实操心得:不要迷信
docker compose down && up。若服务反复失败,先docker compose down -v(-v删除 volumes),再清空./config/postgres-data和./config/nacos-logs,从干净状态重试。我曾因nacos-logs目录残留旧配置,导致新NACOS_AUTH_TOKEN不生效,折腾 4 小时才发现是缓存问题。
5.3 DeerFlow UI 无法访问:Connection Refused 或 502 Bad Gateway
当docker compose ps显示所有服务Up,但浏览器打不开http://localhost:8080,分三步排查:
确认端口映射:
docker port deerflow-app # 应输出:8080/tcp -> 0.0.0.0:8080 # 若输出为空,说明 ports 配置错误或容器未启动检查容器内服务监听:
docker exec -it deerflow-app sh -c "netstat -tuln | grep :8080" # 应输出:tcp6 0 0 :::8080 :::* LISTEN # 若无输出,说明 DeerFlow 应用未启动成功,回看 `docker compose logs deerflow-app`验证依赖服务连通性:
# 进入 deerflow-app 容器 docker exec -it deerflow-app sh # 测试 nacos 连通 telnet nacos-server 8848 # 测试 redis 连通 telnet redis 6379 # 测试 postgresql 连通 telnet postgresql 5432若
telnet nacos-server 8848失败