前置知识:
以下做了解,知道自己做的是干什么的,才能知道自己在干什么!
1.dify是什么
Dify 是一个开源的低代码平台,旨在帮助开发者快速构建基于大语言模型(LLM)的应用程序。它提供了一个可视化的界面,支持工作流编排、插件集成、知识库管理、API 调用等功能,用户可以通过拖拽方式搭建 AI Agent、聊天机器人、自动化流程等应用。Dify 支持连接多种大模型(如 GPT、通义千问、Claude 等),并允许自定义提示词、数据处理逻辑和前后端集成。
Dify 的主要功能包括:
- 可视化工作流设计:通过图形界面配置 AI 应用的执行流程。
- 支持 RAG(检索增强生成):可以上传文档建立私有知识库,结合向量数据库实现精准问答。
- 多模型支持:兼容主流大模型 API,便于切换和测试不同模型效果。
- 插件与工具集成:支持调用外部 API、数据库、Python 脚本等扩展能力。
- 开发者友好:提供 API 接口和 SDK,便于嵌入现有系统。
Dify 的优势在于:
- 低门槛:非技术人员也能参与 AI 应用开发。
- 灵活性高:支持从简单问答到复杂业务流程的构建。
- 社区活跃:开源项目更新快,生态逐步完善。
- 易于部署:支持本地部署和云服务部署,保障数据安全。
2.dify与ragflow对比,
RagFlow 是另一个开源项目,专注于 RAG(Retrieval-Augmented Generation)流程的优化。它强调对文档解析的深度理解,利用大模型来结构化处理复杂文档(如 PDF、扫描件、表格等),提升信息提取和检索的准确性。RagFlow 的目标是打造更可靠的知识检索系统,特别适合需要高精度文档理解和问答的场景。
RagFlow 的特点包括:
- 强大的文档解析能力:能处理非结构化数据,识别图文混排、表格、公式等内容。
- 基于 LLM 的文本预处理:在索引阶段就使用大模型进行语义理解与结构化。
- 高召回率与准确率:相比传统 RAG 工具,在复杂文档上的表现更优。
- 专精于知识库构建与检索:更适合做企业级知识管理系统。
对比 Dify 和 RagFlow:
| 维度 | Dify | RagFlow |
|---|---|---|
| 核心定位 | 通用型 AI 应用开发平台 | 专注 RAG 流程优化的知识引擎 |
| 功能范围 | 广泛,涵盖对话、自动化、Agent 编排 | 聚焦文档解析、知识提取、检索增强 |
| 使用难度 | 中等,有可视化界面降低使用门槛 | 相对较高,需一定技术背景配置和调优 |
| 扩展性 | 支持插件、API、脚本等多种集成方式 | 主要服务于检索链路,扩展性集中在 RAG 层 |
| 适用场景 | 构建客服机器人、AI 助手、自动化流程等 | 企业知识库、智能问答、文档分析等 |
| 是否支持多模型 | 是 | 是,但主要用于内部处理 |
如何选择:
如果你的需求是构建一个完整的 AI 应用,比如带对话界面的客服系统、带有条件判断的自动化流程、或需要集成多个工具和服务的 Agent,那么 Dify 更合适。它提供了端到端的解决方案,开发效率高,适合产品化落地。
如果你的核心需求是对大量复杂文档(如合同、报告、PDF 扫描件)进行高精度的信息抽取和问答,追求更高的检索准确率和语义理解能力,那么 RagFlow 是更好的选择。它可以作为后端知识引擎,为其他系统提供高质量的检索服务。
实际应用中,两者也可以结合使用:用 RagFlow 构建高性能的知识检索模块,再将结果接入 Dify 的工作流中,由 Dify 完成对话管理、用户交互和流程控制,从而发挥各自优势。
3.环境
1.windows通过wsl使用Linux,然后才能使用docker
2.docker 介绍
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖(如库、配置文件、运行环境等)打包到一个轻量级、可移植的“容器”中。这个容器可以在任何支持 Docker 的系统上运行,确保应用在不同环境中具有一致的行为。
Docker 的核心概念包括:
- 镜像(Image):是一个只读模板,包含运行某个应用所需的所有内容,比如代码、运行时、库、环境变量等。
- 容器(Container):是镜像的运行实例,可以启动、停止、删除。多个容器可以独立运行在同一台机器上,互不干扰。
- Dockerfile:是一个文本文件,定义了如何构建一个镜像,包含一系列指令(如安装软件、复制文件、设置环境变量等)。
- 仓库(Registry):用于存储和分发镜像,最常用的是 Docker Hub,也可以搭建私有仓库。
Docker 可以完成的主要功能包括:
- 环境一致性:解决“在我机器上能跑”的问题,开发、测试、生产环境保持一致。
- 快速部署与扩展:通过镜像快速启动服务,适合微服务架构和持续集成/持续部署(CI/CD)流程。
- 资源利用率高:相比虚拟机,容器共享操作系统内核,更轻量,启动更快,占用资源更少。
- 多服务隔离运行:可以在同一台主机上运行多个容器,彼此隔离,互不影响。
- 支持多种应用场景:如部署 Web 应用、数据库、消息队列、AI 模型服务等。
3.docker desktop介绍
- Docker 是技术标准和引擎本身。
- Docker Desktop 是为了让普通用户(尤其是开发人员)在 Windows 或 Mac 上更方便地使用 Docker 而提供的完整工具套件。
Docker Desktop 是其在桌面操作系统上的实现和封装,让非 Linux 用户也能轻松使用 Docker 进行开发和测试。如果你在 Linux 上使用 Docker,通常直接安装 Docker Engine 即可;而在 Windows 或 macOS 上,则推荐使用 Docker Desktop 来获得完整的体验。
- 为什么你用了 WSL,还是需要“Docker Desktop for Windows”?
虽然 WSL(Windows Subsystem for Linux)让你可以在 Windows 上运行一个接近原生的 Linux 环境,但它本身并不是一个完整的独立操作系统。它依赖于 Windows 内核提供的兼容层(特别是 WSL2 使用的是轻量级虚拟机技术),所以 不能像在真正的 Linux 主机上那样直接安装和运行 Docker 引擎(Docker Engine) 。
所以怎么办?—— Docker Desktop 的作用
Docker Desktop for Windows 实际上做了这样几件事:
- 在后台启动一个极小的 Linux 虚拟机(基于 WSL2 技术),专门用来运行 Docker 引擎(Docker Daemon)
- 把这个 Docker 引擎暴露给 Windows 和所有已启用集成的 WSL 发行版
- 提供 GUI 界面、设置选项、Kubernetes 支持等高级功能
换句话说:
👉 Docker Desktop 利用 WSL2 运行 Docker 引擎,然后让 Windows 和你的 WSL 发行版都能通过同一个 docker 命令访问它。
配置过程:
1.配置wsl
(详细见wsl启动文档)
其中注意:确保虚拟机服务启用!!!!
控制面板=》程序=》windows服务、

确保wsl是2.0以上

2.下载docker desktop
如果你的电脑是 Intel 或 AMD 处理器,下载 AMD64 版本amd
2.换镜像源
方便拉取容器镜像
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://docker.1ms.run",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com",
"https://docker.m.daocloud.io/",
"https://huecker.io/",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru/",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://xx4bwyg2.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
3.简单上手使用
获取 Docker Desktop |Docker 文档
简单测试:
激活wsl输入以下命令
docker pull docker/welcome-to-docker
docker run -d -p 8080:80 docker/welcome-to-docker

访问

到此docker配置完成
强烈建议:

即使后续创建的项目放在d盘,项目的镜像源还是c盘,占很大!!!
docker常见命令在文章末尾已经奉上!
3.安装dify
来到重头戏部分了!需要好好干喽!
主要是拉源码,改配置文件,docker运行,dify插件!
1.拉源码
方法一
(不推荐,做了解):
不能修改源码
docker拉
在你的终端(Windows PowerShell、CMD 或 WSL)中执行以下命令:
docker run -d --name dify -p 8080:80 \
-v ./dify/data:/app/api/storage \
-e DATABASE_URL="sqlite:///./data/database.db" \
-e PROVIDER="local" \
langgenius/dify-api:latest
docker run -d --name dify-web -p 3000:3000 \
--restart unless-stopped \
langgenius/dify-web:latest
常见问题:

解决方法:
确保wsl集成已经启用。我的是ubuntu

拉d盘:
docker stop dify
docker rm dify
#删除之前创建的,因为我拉错位置存在c盘了。
#创建目录
mkdir -p /mnt/d/linux/dify/data
#拉取并运行最新后端:版本迭代可能所需参数改变
docker run -d --name dify -p 8080:80 \
-v /mnt/d/linux/dify/data:/app/api/storage \
-e DATABASE_URL="sqlite:///./data/database.db" \
-e PROVIDER=local \
-e OPENDAL_SCHEME=local \
-e OPENDAL_LOCAL_ROOT=/app/api/storage \
-e OPENAI_API_KEY="" \
langgenius/dify-api:latest
#运行前端
docker run -d --name dify-web -p 3000:3000 \
--restart unless-stopped \
langgenius/dify-web:latest
#查看日志 等待出现 Booting worker with pid:,按 Ctrl+C 退出。
docker logs -f dify
方式二:
从github上拉源码
git clone github.com/langgenius/…

需要魔法
2.改配置文件
方便管理,将docker改名为dify

进入dify文件夹,启用cmd
工作逻辑:
yaml就是docker的配置文件,默认用docker-compose.yml这个配置文件
env.example 是示例文件,去掉.example ,就用这个环境
然后修改.env(通过记事本打开,直接编辑),将末尾添加如下语句
\`# 启用自定义模型`
`CUSTOM_MODEL_ENABLED=true`
`\# 指定 Olama 的 API地址(根据部署环境调整IP)`
`OLLAMA_API_BASE_URL=host.docker.internal:11434`
配置完环境变量后
yaml会自动访问.env,并使用其中的变量

修改
PLUGIN_PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-320}
PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600}
PIP_MIRROR_URL: ${PIP_MIRROR_URL:-https://pypi.tuna.tsinghua.edu.cn/simple}

技巧:可能版本不同位置不同,可以让cursor给你找出位置,不建议让他直接修改!
3.docker运行dify
然后在cmd输入,docker-compose up -d,拉取docker镜像

讲解:
Docker compose是一个容器集成工具,可以将多个docker容器集成在一起打包成一个服务,具体看下面的链接
docker compose入门4—常用命令_docker compose down -d-CSDN博客
输入docker-compose up -d后,就开始拉取Dify需要的docker镜像。默认用当前目录下的docker-compose.yml这个配置文件
可能会出现拉取docker镜像失败的情况,在docker镜像的服务地址中添加下面几个
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://kqdukn27.mirror.aliyuncs.com"
]
安装完毕后,各个docker服务就启用了

我遇到的问题是端口被占用了,以下是解决方法:(如果你的没问题,可以跨过4)
4.解决端口占用:
方法一:
在 PowerShell(管理员) 中运行:
netstat -ano | findstr :80
关闭占用80端口的服务
方法二:(推荐)
修改docker-compose.yml,换一个端口(最快解决)
我让cursor给我找出端口配置位置:


我改成了8081,注意
-
左边的 80 是主机(外部)端口 - 这是报错的地方
-
右边的 80 是容器内部端口
#删除旧容器:为了读到新改的配置
docker-compose down
#重新构建并启动
docker-compose up -d
如果还不行:

!!!打开.env文件(yaml会读取env文件的变量并使用,可能被覆盖了)
EXPOSE_NGINX_PORT=8081
重新构建

终于解决了!
然后再docker-desktop中就可以看到dify的compose服务启动了
备注:如果更改默认启用的配置文件,用下面命令指定用哪个配置文件
docker-compose -f docker-compose-xxx.yml up -d
如何卸载ragflow,只需要在ragflow当前目录的cmd输入
docker-compose down即可

点进dify查看有什么docker容器服务。

5.装插件
使用大模型
在浏览器中输入(http://localhost:8081/install) 我的端口是8081,你设的什么就用什么
访问 Dify。默认设置管理员账号

设置大模型,使用ollama。
点击设置=》模型供应商=》安装ollama=》添加模型


下载完成后添加模型:

其中ollama本地部署可见ollama技术文档。
cmd通过ollama list 查看已经下载的模型

我使用
deepseek-r1:7b
基础地址用ollama的服务地址,这里用docker主机的地址(想了解,下面详细解释)
http://host.docker.internal:11434
然后我们知识库还用到嵌入模型,这里我选
bge-m3这个Embedding词嵌入模型
Chat模型和Embedding模型都设置好后,就可以建知识库了
到这里,Dify就配置好了

基础url配置解释:
http://host.docker.internal:11434 就是在访问你的本地 Ollama 服务(运行在 Windows 主机上)
为什么不能用 localhost??
ollama服务运行在windows主机上
dify容器 运行在docker的虚拟环境(wsl2虚拟机中)
那怎么从容器访问主机?
Docker 提供了一个特殊域名:
host.docker.internal
它的作用是:让容器内部可以访问宿主机(也就是你的 Windows 电脑)!!
装插件
你上传的工作文档类型
常见文档:markdown,ppt,doc
使用dify
1.前置知识:
我创建的项目可以得到源码吗?
没有传统源码,有结构化的json配置,相当于低代码源码,可以在dify中复用
docker常用命令:
| 序号 | 命令 | 说明 |
|---|---|---|
| 1 | docker pull 镜像名 | 从镜像仓库下载指定镜像,例如:docker pull ubuntu |
| 2 | docker run 镜像名 | 创建并启动一个容器,例如:docker run hello-world |
| 3 | docker run -d 镜像名 | 后台运行容器(守护模式),例如:docker run -d nginx |
| 4 | docker run -p 主机端口:容器端口 镜像名 | 映射主机端口到容器,实现外部访问,例如:docker run -p 8080:80 nginx |
| 5 | docker run -v 主机路径:容器路径 镜像名 | 挂载主机目录到容器,实现数据持久化,例如:docker run -v /data:/app nginx |
| 6 | docker run --name 容器名 镜像名 | 为容器指定名称,便于管理,例如:docker run --name my-nginx nginx |
| 7 | docker ps | 查看当前正在运行的容器 |
| 8 | docker ps -a | 查看所有容器(包括已停止的) |
| 9 | docker stop 容器ID或名称 | 停止一个正在运行的容器 |
| 10 | docker start 容器ID或名称 | 启动一个已停止的容器 |
| 11 | docker rm 容器ID或名称 | 删除一个已停止的容器 |
| 12 | docker rmi 镜像名或ID | 删除本地镜像,例如:docker rmi ubuntu |
| 13 | docker logs 容器ID或名称 | 查看容器的日志输出 |
| 14 | docker exec -it 容器ID或名称 /bin/bash | 进入正在运行的容器内部执行命令(常用 shell) |
| 15 | docker images | 列出本地所有镜像 |