使用docker将Dify部署到本地

140 阅读13分钟

前置知识:

以下做了解,知道自己做的是干什么的,才能知道自己在干什么!

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:

维度DifyRagFlow
核心定位通用型 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 来获得完整的体验。


  1. 为什么你用了 WSL,还是需要“Docker Desktop for Windows”?

虽然 WSL(Windows Subsystem for Linux)让你可以在 Windows 上运行一个接近原生的 Linux 环境,但它本身并不是一个完整的独立操作系统。它依赖于 Windows 内核提供的兼容层(特别是 WSL2 使用的是轻量级虚拟机技术),所以 不能像在真正的 Linux 主机上那样直接安装和运行 Docker 引擎(Docker Engine)

所以怎么办?—— Docker Desktop 的作用

Docker Desktop for Windows 实际上做了这样几件事:

  1. 在后台启动一个极小的 Linux 虚拟机(基于 WSL2 技术),专门用来运行 Docker 引擎(Docker Daemon)
  2. 把这个 Docker 引擎暴露给 Windows 和所有已启用集成的 WSL 发行版
  3. 提供 GUI 界面、设置选项、Kubernetes 支持等高级功能

换句话说: 👉 Docker Desktop 利用 WSL2 运行 Docker 引擎,然后让 Windows 和你的 WSL 发行版都能通过同一个 docker 命令访问它。

配置过程:

1.配置wsl

(详细见wsl启动文档)

其中注意:确保虚拟机服务启用!!!!

控制面板=》程序=》windows服务、

image-20251020192424391

确保wsl是2.0以上

image-20251020192513508


2.下载docker desktop

  1. 访问官网:www.docker.com/products/do…

​ 如果你的电脑是 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

image-20251020193733339

访问

http://localhost:8080

image-20251020193802475

到此docker配置完成

强烈建议:

image-20251020203524894

即使后续创建的项目放在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

常见问题:

image-20251020195457060

解决方法:

确保wsl集成已经启用。我的是ubuntu

image-20251020195613603

拉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/…

image-20251021090316496

需要魔法

2.改配置文件

方便管理,将docker改名为dify

image-20251021110953612

进入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,并使用其中的变量

image-20251021111131971

修改

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}

image-20251021115529003

技巧:可能版本不同位置不同,可以让cursor给你找出位置,不建议让他直接修改!

3.docker运行dify

然后在cmd输入,docker-compose up -d,拉取docker镜像

image-20251021115829378

讲解:

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服务就启用了

image-20251021120434585

我遇到的问题是端口被占用了,以下是解决方法:(如果你的没问题,可以跨过4)

4.解决端口占用:

方法一:

PowerShell(管理员) 中运行:

netstat -ano | findstr :80

image-20251021122435081关闭占用80端口的服务

方法二:(推荐)

修改docker-compose.yml,换一个端口(最快解决)

我让cursor给我找出端口配置位置:

image-20251021120830473

image-20251021121051430

我改成了8081,注意

  • 左边的 80 是主机(外部)端口 - 这是报错的地方

  • 右边的 80 是容器内部端口

#删除旧容器:为了读到新改的配置
docker-compose down
#重新构建并启动
docker-compose up -d

如果还不行:

image-20251021122214508

!!!打开.env文件(yaml会读取env文件的变量并使用,可能被覆盖了)

EXPOSE_NGINX_PORT=8081

重新构建

image-20251021122351525

终于解决了!

然后再docker-desktop中就可以看到dify的compose服务启动了

备注:如果更改默认启用的配置文件,用下面命令指定用哪个配置文件

docker-compose -f docker-compose-xxx.yml up -d

如何卸载ragflow,只需要在ragflow当前目录的cmd输入

docker-compose down即可

image-20251021140238752

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

image-20251021140257748

5.装插件
使用大模型

在浏览器中输入(http://localhost:8081/install) 我的端口是8081,你设的什么就用什么

访问 Dify。默认设置管理员账号

image-20251021140549736

设置大模型,使用ollama。

点击设置=》模型供应商=》安装ollama=》添加模型

image-20251021140655786

image-20251021140849702

下载完成后添加模型:

image-20251021141432838

其中ollama本地部署可见ollama技术文档。

cmd通过ollama list 查看已经下载的模型

image-20251021141531366

我使用

deepseek-r1:7b 

基础地址用ollama的服务地址,这里用docker主机的地址(想了解,下面详细解释)

http://host.docker.internal:11434

然后我们知识库还用到嵌入模型,这里我选

bge-m3这个Embedding词嵌入模型

Chat模型和Embedding模型都设置好后,就可以建知识库了

到这里,Dify就配置好了

image-20251021142526842


基础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常用命令:

序号命令说明
1docker pull 镜像名从镜像仓库下载指定镜像,例如:docker pull ubuntu
2docker run 镜像名创建并启动一个容器,例如:docker run hello-world
3docker run -d 镜像名后台运行容器(守护模式),例如:docker run -d nginx
4docker run -p 主机端口:容器端口 镜像名映射主机端口到容器,实现外部访问,例如:docker run -p 8080:80 nginx
5docker run -v 主机路径:容器路径 镜像名挂载主机目录到容器,实现数据持久化,例如:docker run -v /data:/app nginx
6docker run --name 容器名 镜像名为容器指定名称,便于管理,例如:docker run --name my-nginx nginx
7docker ps查看当前正在运行的容器
8docker ps -a查看所有容器(包括已停止的)
9docker stop 容器ID或名称停止一个正在运行的容器
10docker start 容器ID或名称启动一个已停止的容器
11docker rm 容器ID或名称删除一个已停止的容器
12docker rmi 镜像名或ID删除本地镜像,例如:docker rmi ubuntu
13docker logs 容器ID或名称查看容器的日志输出
14docker exec -it 容器ID或名称 /bin/bash进入正在运行的容器内部执行命令(常用 shell)
15docker images列出本地所有镜像