先说结论:这套组合能跑通,而且跑通之后非常顺手。我花了一个周末把 Windows 上的 Docker Desktop、扣子 Coze 和 DeepSeek 串了起来,中间踩了不少坑,尤其是新版 Coze 扩展入口和 DeepSeek 请求报错这两个地方,差点劝退。这篇文章把我完整的安装、配置、验证和排错过程写下来,照着走一遍,基本能少走我一半弯路。
如果你只想用云端版 Coze,那这篇文章不适合你;但如果你想在 Windows 本机用 Docker 跑一套自主可控的 Coze 环境,再把 DeepSeek 作为底层大模型接进去,那这篇就是给你准备的。
1. 为什么非要在 Windows 上用 Docker 跑 Coze?
1.1 这套组合解决了什么问题
扣子 Coze 是一个 AI Bot 开发平台,核心价值是把大模型、插件、知识库、工作流这些能力编排到一起。云端版确实方便,但如果你需要本地开发调试、对接私有数据、或者只是想在一个隔离环境里折腾,本地部署就很有必要。
而 DeepSeek 是目前性价比很高的大模型,API 兼容 OpenAI 风格,调用起来很简单。Coze 负责"编排",DeepSeek 负责"思考",Docker 负责"装下这一切"。三者各司其职,组合起来就是一个完整的本地 AI 应用开发底座。
先说清楚整体的架构:Windows 宿主机上装 Docker Desktop,用它跑 Coze 容器,Coze 容器通过 API 调用 DeepSeek。整个过程里,Docker Desktop 是底座,Coze 是运行在容器里的核心应用,DeepSeek 是外部模型服务。这个架构的好处是 Coze 环境跟 Windows 系统隔离,升级、备份、迁移都干净利落。
1.2 适用人群与前置条件
我默认你具备这些基础:知道 Docker 是什么、会敲命令行、看得懂基本的 YAML 配置。如果你完全没接触过容器,建议先把 Docker 的镜像、容器、端口映射这些概念弄明白再动手。
硬件上,Coze 本身不吃太多资源,但 DeepSeek 是走 API 调用的,所以对本地硬件没有强制要求。唯一需要注意的是磁盘空间,Docker 镜像和容器日志加起来大概要占 10GB 到 15GB,最好提前清理一下磁盘。
操作系统方面,Windows 10 64 位专业版或 Windows 11 都行,但关键是必须开启虚拟化。怎么确认?打开任务管理器,在"性能"标签里看 CPU 那栏,如果"虚拟化"显示"已启用"就说明没问题。如果没启用,需要进 BIOS 把 Intel VT-x 或 AMD-V 打开,这一步不做,后边 Docker 怎么都起不来。
2. Windows 下 Docker Desktop 的安装与归置
2.1 下载装机与装到非 C 盘的操作
Docker Desktop 官方安装包直接去官网下载即可。但这里有一个 Windows 用户特别头疼的问题:安装包默认把 Docker Desktop 装到 C 盘,对系统盘空间紧张的人极不友好。
装到其他盘其实有技巧。Docker Desktop 的安装程序(Docker Desktop Installer.exe)支持命令行参数,用管理员权限打开终端,在安装包所在目录执行:
start /wait "Docker Desktop Installer.exe" install --installation-dir="D:\Docker"注意--installation-dir指定的是程序安装目录,但 WSL2 的发行版(docker-desktop 和 docker-desktop-data)默认还是存到系统盘的%LOCALAPPDATA%下。要彻底挪走,还需要在安装完成后,用wsl --export把这两个发行版导出、注销、再导入到 D 盘:
wsl --shutdown wsl --export docker-desktop D:\WSL\docker-desktop.tar wsl --export docker-desktop-data D:\WSL\docker-desktop-data.tar wsl --unregister docker-desktop wsl --unregister docker-desktop-data wsl --import docker-desktop D:\WSL\docker-desktop D:\WSL\docker-desktop.tar wsl --import docker-desktop-data D:\WSL\docker-desktop-data D:\WSL\docker-desktop-data.tar我实测这个方案是有效的,重启 Docker Desktop 后,点开设置里的 Resources 看磁盘占用,WSL 的数据已经迁移到了 D 盘。唯一的坑是第一次导入后,如果 Docker Desktop 起不来,去 Windows 服务里把 "LxssManager" 或 "WSL Service" 重启一下就好。
2.2 必须提前做好的基础配置
装好之后,先别急着拉镜像,把下面三件事做完再动手。
第一,设置 WSL2 内核。Docker Desktop 的新版本默认使用 WSL2 后端,这是 Windows 上跑 Linux 容器的最优解。如果之前装过旧版本或用过 Hyper-V,建议在设置里确认一下是否切到了 WSL2 后端。
第二,配置镜像加速。国内环境拉 Docker Hub 的镜像经常超时,建议在 Docker Desktop 的 Settings -> Docker Engine 里,把 registry-mirrors 加上:
{ "registry-mirrors": [ "https://docker.m.daocloud.io" ] }改完点 Apply & Restart。这一步我在实操中遇到的概率几乎是 100%,不配置的话,后边拉 Coze 镜像大概率会卡死。
第三,分配合理的内存。默认 2GB 不够用,我给 Docker 分配了 6GB。设置路径是 Settings -> Resources -> Advanced,把 Memory 从 2GB 调到 6GB 左右,Swap 保持默认。这一步决定了 Coze 容器跑多个服务时会不会被 OOM 杀掉。
3. 扣子 Coze 的拉取与启动
3.1 镜像选择与端口规划
这里需要区分一下,如果你的 Coze 是社区版或开源定制版,通常项目仓库会提供 Dockerfile 或 docker-compose.yml;如果拉的是预构建镜像,先docker search确认一下镜像名和 tag。
我当时拉的是 Coze 社区镜像,执行:
docker pull your-registry/coze-studio:latest拉下来之后,端口规划要提前想好。Coze 的控制台、API 服务、插件服务往往不止一个端口,我用的映射是:
8000:Coze 主控制台,浏览器访问入口8001:Coze API 服务端口8002:插件扩展服务端口
端口冲突是很常见的问题,尤其 8000 这个口经常被其他本地服务占用。启动前先检查:
netstat -ano | findstr :8000如果有进程占用,要么换宿主端口,要么停掉占用进程。建议直接换个宿主端口,比如18000:8000,避免影响其他服务。
3.2 启动命令详解与数据持久化
我用的是 docker run 一次性启动,命令如下:
docker run -d \ --name coze \ --restart=always \ -p 18000:8000 \ -p 18001:8001 \ -p 18002:8002 \ -v D:\coze-data:/app/data \ -v D:\coze-logs:/app/logs \ -e "ENV=production" \ your-registry/coze-studio:latest逐个解释一下每个参数的实际作用。
-d是后台运行,--restart=always让容器在 Docker 启动时自动拉起,这样 Windows 重启后不用手动开容器。-p做了三组端口映射,宿主端口和容器端口可以不一样。-v做数据持久化,把容器里的/app/data和/app/logs挂载到 D 盘目录,这样容器重装、升级镜像时数据不会丢。这一点极其重要,我有一次没做数据挂载,容器删掉重来,所有配置和 Bot 数据全部蒸发,血泪教训。
启动之后,用docker logs -f coze看日志,看到类似Application startup complete或者Uvicorn running on http://0.0.0.0:8000的信息,基本就说明服务起来了。浏览器访问http://localhost:18000,如果能看到 Coze 的控制台页面,说明容器侧正常。
3.3 用 docker-compose 管理的另一种方式
如果你的 Coze 项目本身带 docker-compose.yml,我更推荐用 compose 方式,因为 Coze 这种多服务应用,compose 可以把数据库、缓存、应用服务一次性编排起来。比如项目里提供了docker-compose.yml,直接在你拉下来的项目目录执行:
docker compose up -dcompose 文件里通常会有几个关键服务:
coze-app:主应用postgres:元数据存储redis:缓存和会话状态
把这三个服务都跑起来之后,执行docker compose ps看到三个容器状态都是 Up,说明环境已经就绪。compose 的好处是端口、卷、环境变量都写在文件里,换机器部署直接拷贝项目目录再执行一次即可,可迁移性好不少。
4. 把 DeepSeek 大模型配置进 Coze
4.1 获取 DeepSeek API Key
Coze 本身不带大模型能力,它需要对接外部模型服务。DeepSeek 的接入方式并不复杂,核心是三个参数:API Key、API Base URL、模型名称。
先到 DeepSeek 开放平台(平台域名注册后可进入控制台)注册账号,然后在"API Keys"页面创建一个新的 Key。创建之后这个 Key 只显示一次,务必立刻复制保存,丢了只能重建。我给 Key 起了个名字叫coze-local,方便区分用途。
DeepSeek 的 API 兼容 OpenAI 格式,所以基地址是https://api.deepseek.com(也可以按官方文档用 v1 路径,视当前版本而异),模型名通常是deepseek-chat和deepseek-reasoner两个。我日常对话用deepseek-chat,复杂推理任务切到deepseek-reasoner,后者的推理链更细致,但响应时间也明显变长。
4.2 在 Coze 管理后台完成模型 Provider 配置
登录 Coze 控制台之后,找到模型配置或供应商(Provider)设置页面。新版 Coze 的模型配置入口变化比较大,如果你找不到,重点找"模型广场""资源库"或者"设置 -> 模型供应商"这几个入口之一。
在配置页面里,新建一个 Provider,类型选择 OpenAI Compatible,然后填入以下内容:
provider_name: deepseek base_url: https://api.deepseek.com api_key: sk-xxxxxxxxxxxxxxxxxxxx model_list: - deepseek-chat - deepseek-reasoner如果页面支持直接测试,填完之后立即点击测试按钮。如果弹窗提示Request Extension Preparation Failed或Connection error,先别急着怀疑配置写错,90% 的情况是网络层面到 API 的连通性有问题。判断方法很简单:在宿主机上直接curl https://api.deepseek.com,能通就说明是本机到 API 没问题;如果宿主机通而容器内不通,就要去看容器网络和 DNS 设置了。
4.3 环境变量方式的额外补充
有一些模块支持直接用环境变量注入模型配置,在 docker run 里追加这些参数也行:
-e "DEEPSEEK_API_KEY=sk-xxxxxxxx" \ -e "DEEPSEEK_BASE_URL=https://api.deepseek.com" \ -e "DEEPSEEK_MODEL=deepseek-chat"这里的逻辑是:Coze 应用启动时读取环境变量来初始化模型客户端。如果你改的是页面配置但没生效,很可能是程序启动时优先读环境变量,页面配置只在运行时热加载。两种方式生效机制不同,我建议以环境变量为主配置,页面配置为辅,这样重启容器也能保持一致。
4.4 如何判断 DeepSeek 配置真的生效
配置完之后,不要急着建复杂的 Bot,先在 Coze 的对话测试窗口里发一句简单的"你好"。如果正常返回一句话,说明配置链路已经通了。
我习惯再测试一次deepseek-reasoner,让它回答一个需要推理的问题,比如"9.11 和 9.9 哪个大"这种经典题。reasoner 模型会输出完整的推理过程和最终答案,从日志里能看到它在思考,这是判断模型是否切换成功的直观证据。
5. 端到端验证:从新建 Bot 到完整对话
5.1 创建第一个测试 Bot
进入 Coze 控制台后,找到"创建 Bot"或"新建应用"的按钮。我给测试 Bot 取名deepseek-tester,配置项里把默认模型切换成 DeepSeek。如果你在模型选择列表里看不到 deepseek-chat,回去检查 Provider 配置的 model_list 是否填写正确。
Bot 创建好之后,先别加插件、知识库这些扩展,保持最简配置。在对话输入框里输入"用一句话介绍你自己"。这里有个细节:如果配置成功,Bot 会以 DeepSeek 的语气回答,并可能主动说明自己是 DeepSeek 模型,这就说明模型已经生效。
接下来再测一轮连续对话,连续问三四个问题,观察上下文是否保持连贯。Coze 会维护会话状态,如果你发现后续回答完全忘了前文内容,大概率是 Redis 缓存或会话存储服务没起,回去看 docker logs 里的报错。
5.2 遇到 "Request Extension Preparation Failed" 的排查实录
这个报错信息我单独拎出来说,因为太典型了。它的字面意思是"请求扩展准备失败",初次遇到会误以为插件扩展没装好,实际上它更多是指模型请求的扩展上下文准备阶段出了问题。
我那次排查过程是这样的:点击测试按钮不到 3 秒就弹出报错,说明请求根本没到模型,Coze 在处理请求前置环节就抛错了。先看 Coze 容器日志:
docker logs --tail 100 coze日志里出现connection refused和timeout,判断是网络出站问题。再细分:容器里访问不了外网?还是访问不了 DeepSeek API?我用docker exec -it coze bash进容器执行:
curl -I https://api.deepseek.com结果提示 DNS 解析失败。这就有意思了,宿主机能解析,容器内不行。最终确认是 Docker Desktop 内置 DNS 与 Windows 的 DNS 配置冲突,解决方法是在 Docker Engine 设置里加上:
{ "dns": ["223.5.5.5", "119.29.29.29"] }改完重启 Docker Desktop,再进容器 curl,通了。这个坑我不写出来,你很可能要在网上搜好几个小时。
5.3 对话长度上限与其他模型相关报错
用 DeepSeek 一段时间后,我遇到过"对话长度已达上限,请开启新对话"的提示。这不是 Coze 的问题,而是 DeepSeek 的上下文窗口到了限制。
DeepSeek-chat 的上下文长度虽然不小,但长对话、塞入大段知识库资料后,token 会迅速耗尽。我把这个问题的规避策略说明白:
- 短期方案:在 Coze 对话窗口点"新建对话",清空上下文,立即恢复。
- 中期方案:在 Bot 配置里,把"最大 token 数"调低,给上下文留出余量。
- 长期方案:把知识库改为按需检索,不要一股脑全塞给模型。
6. 常见问题与避坑记录
6.1 Docker Desktop 启动失败或驱动报错
Windows 上 Docker Desktop 启动失败的概率很高,我碰到过"由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常(代码 31)"的报错。这个报错通常和 WSL2 或虚拟化功能有关。
排查步骤按顺序来:
- 确认 Windows 功能里的"适用于 Linux 的 Windows 子系统"和"虚拟机平台"两项是否开启。用管理员 PowerShell 执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart更新 WSL2 内核,在仓库下载最新的 wsl_update_x64.msi 安装。
如果还不行,卸载 Docker Desktop 后删除残留目录
%LOCALAPPDATA%\Docker,重装一次。注意这里的路径默认在 C 盘,如果你之前把数据迁到了 D 盘,卸载前务必备份配置。
6.2 镜像拉取超时与网络问题
镜像拉取慢或超时,基本都是网络原因。前面提到的 registry-mirrors 是首选方案。另一个备选方案是找可用的镜像替代源,比如 Docker Hub 的镜像改名或者通过代理拉取(注意合规)。但我实测最好的方案还是配置国内镜像加速,加完之后拉取速率会明显改善。
如果你配置了加速还是拉不下来,可以试着重启 Docker Desktop,有时候加速配置需要重启才生效,这个细节我在改完配置后经常忽略。
6.3 容器启动后访问不了页面
容器日志显示启动成功,但浏览器访问 18000 端口打不开页面。检查顺序:
- 看容器端口映射是否生效:
docker port coze,确认输出的映射关系。 - 看 Windows 防火墙是否拦截了端口。临时放行:在 PowerShell 用管理员权限执行
netsh advfirewall firewall add rule name="coze" dir=in action=allow protocol=TCP localport=18000。注意放行端口是宿主端口(18000),不是容器端口。 - 如果你用
localhost打不开,试试127.0.0.1:18000,有些情况下 localhost 解析到 IPv6 地址会导致访问异常。
6.4 数据备份与恢复实操
容器用久了,配置和 Bot 数据都在卷目录里。备份就做两件事:一是把 docker-compose.yml 或 docker run 命令复制一份保存;二是把挂载的目录(D:\coze-data 和 D:\coze-logs)压缩归档。
恢复的时候更简单,重新执行原来的 docker run 命令,再解压数据到对应目录,启动容器即可。这个备份方案非常"笨"但非常可靠,我就靠这套方法在换机器时无损迁移过一次。
7. 一些真实的经验感触
这套环境跑通之后,我最大的感受是"能折腾"和"值得折腾"是两码事。Coze + DeepSeek + Docker 这套组合,在 Windows 上确实能做到本地可控,但前提是你要愿意花时间把 Docker 基础调好,把网络问题解决掉,否则每一步都可能卡住。
尤其是 DeepSeek 作为大模型接入 Coze 之后,对话质量完全够用,对大多数日常场景,deepseek-chat 的响应速度和回答质量都让我满意。如果你之后想接入本地模型(比如 Ollama 跑的 Qwen 这类),原理是一模一样的,只是把 Base URL 和模型名改一下,整个链路的搭建经验是完全通用的。