Dify是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式AI应用的创建和部署,相对于AnythingLLM来说dify更强大且灵活度比较高可以二次开发,不仅可以构建RAG管道,还可以有AI工作流、聊天助手、Agent、模型管理等丰富功能组件。
dify支持的模型有很多
安装docker
安装dify前首先需要安装docker,我的系统为Ubuntu系统,以Ubuntu为例展示安装过程。
1.首先卸载所有冲突的包,运行命令:
python
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
2.然后设置 Docker 的apt存储库:
python
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
但是当我运行sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
这行代码时,出现以下报错:
python
curl: (35) OpenSSL SSL_connect: 连接被对方重设 in connection to download.docker.com:443
当时没注意继续运行下一行命令sudo chmod a+r /etc/apt/keyrings/docker.asc
,出现报错才让我注意到:
python
chmod: 无法访问 '/etc/apt/keyrings/docker.asc': 没有那个文件或目录
错误是由于在下载 Docker 的 GPG 密钥时网络连接失败,导致 /etc/apt/keyrings/docker.asc
文件未成功创建。接下来进行排查:
1.检查网络连通性
python
# 测试能否 ping 通(如果服务器禁 ping 可能无响应,但可忽略)
ping download.docker.com
# 直接尝试通过 HTTPS 访问(更准确)
curl -v https://download.docker.com
如果出现 Connected to download.docker.com 且返回 HTTP 状态码,说明网络正常。
如果超时或失败,可能是网络限制或 DNS 问题。
我的网络是没有问题的。
2.解决网络限制
更换镜像源。如果无法直连 Docker 官方服务器,可改用国内镜像源(如阿里云、清华源)。
以 阿里云镜像 为例:
python
# 下载阿里云提供的 Docker GPG 密钥
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
以上这行代码代替sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
,然后接着往下运行没问题。
2.接下来安装 Docker 包:
python
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

有点问题,后面加上--fix-missing
:
错误是由于网络连接问题导致无法从 Docker 官方服务器下载软件包。错误核心:Could not handshake: Error in the pull function
表示 SSL/TLS 握手失败。
手动下载并安装依赖包,下载缺失的 .deb 文件:
python
# 示例(替换为实际报错的 URL)
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.7.25-1_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-buildx-plugin_0.20.0-1~ubuntu.20.04~focal_amd64.deb
sudo cp /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak
sudo sed -i 's|https://download.docker.com|https://mirrors.aliyun.com/docker-ce|g' /etc/apt/sources.list.d/docker.list
sudo apt-get update
如果无法下载,可通过浏览器访问 Docker Ubuntu 仓库 手动查找对应版本。
然后重新进行安装 Docker 包,就可以了。
3.验证是否成功安装 Docker:
python
docker --version
出来版本号则证明安装成功。
4.测试是否可以使用 Docker拉取镜像并运行:
python
sudo docker run hello-world
出现报错:
python
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 130.211.15.150:443: connect: connection refused.
See 'docker run --help'.
报错信息 dial tcp 130.211.15.150:443: connect: connection refused
表示 Docker 引擎无法连接到 Docker Hub 的镜像仓库,调整一下镜像源:
python
vim /etc/docker/daemon.json
配如下地址:
python
{
"registry-mirrors": [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
重新加载配置文件及docker服务:
python
systemctl daemon-reload
systemctl restart docker
然后拉取镜像,可以成功拉取
安装dify
到dify官网下载整个工程,然后进入dify
目录下的docker
目录下,运行以下两条命令行:
python
cp .env.example .env
docker compose up -d

dify配置完成。
其他的就是ollama和模型的安装,这个在上一篇有讲过就不再赘述了。
安装完之后,点击进入网址,首次登录设置管理员账户:
然后输入账号密码登录。
下一次启动服务运行命令:
python
docker-compose up -d
在dify中构建RAG
1.配置模型
进入主页后首先点击个人信息这块如图中①,然后点模型供应商,找到ollama后添加模型
然后填入模型名称和URL(http://host.docker.internal:11434
)后点保存,模型名称要是忘了可以终端ollama list
来查看(先添加llm的deepseek然后再是text的nomic)。
如果不行的话host.docker.internal
换成本机的IP试一下,如果还是有如下的弹窗报错:
python
An error occurred during credentials validation: HTTPConnectionPool(host='1
92.168.16.60', port=11434): Max retries exceeded with url: /api/embed (
Caused by NewConnectionError('<urllib3.connection.HTTPConnection object
at 0x7f4698337bc0>: Failed to establish a new connection: [Errno 113] No
route to host'))
可以试一下以下方法。
2.配置ollama报错解决
在/etc/systemd/system/ollama.service
文件里的[Service]部分下添
加一行:
python
Environment="OLLAMA_HOST=0.0.0.0"
重载systemd并重启Ollama:
python
sudo systemctl daemon-reload
sudo systemctl restart ollama
这也做大概率就能解决问题了。
但是在我这还是继续有这样的报错弹窗,继续分析。
journalctl -u ollama -n 50
日志片段:
python
-- Logs begin at Mon 2024-08-05 07:19:16 CST, end at Fri 2025-02-21 10:19:54 CS>
2月 21 10:19:28 yons-MS-7E06 systemd[1]: ollama.service: Main process exited, c>
2月 21 10:19:28 yons-MS-7E06 systemd[1]: ollama.service: Failed with result 'ex>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: ollama.service: Scheduled restart job,>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: Stopped Ollama Service.
2月 21 10:19:31 yons-MS-7E06 systemd[1]: Started Ollama Service.
2月 21 10:19:31 yons-MS-7E06 ollama[62023]: Error: listen tcp 0.0.0.0:11434: bi>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: ollama.service: Main process exited, c>
2月 21 10:19:31 yons-MS-7E06 systemd[1]: ollama.service: Failed with result 'ex>
2月 21 10:19:35 yons-MS-7E06 systemd[1]: ollama.service: Scheduled restart job,>
2月 21 10:19:35 yons-MS-7E06 systemd[1]: Stopped Ollama Service.
2月 21 10:19:35 yons-MS-7E06 systemd[1]: Started Ollama Service.
journalctl日志显示listen tcp 0.0.0.0:11434: bind: address already in use
,说明Ollama服务因端口冲突无法启动。
运行docker exec -it dify bash
和docker network ls
出现 permission denied
,说明当前用户未加入 docker 组,首先修复Docker用户组权限:
python
# 将当前用户加入docker组
sudo usermod -aG docker $USER
# 立即生效组权限变更(无需重启)
newgrp docker
# 验证权限
ls -l /var/run/docker.sock
# 正确输出应包含「docker」组权限,例如:
# srw-rw---- 1 root docker 0 Aug 5 07:19 /var/run/docker.sock
确认Docker服务状态
python
# 检查Docker服务是否运行
sudo systemctl status docker | grep Active
# 如果未运行,启动服务
sudo systemctl start docker
精确查找容器
python
# 列出所有容器(包括已停止的)
docker ps -a
# 典型输出示例:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# a1b2c3d4e5f6 nginx:latest ... 2 hours ago Up 2 hours 80/tcp my-nginx
根据 docker ps
输出,Dify部署是通过Docker Compose项目运行的(容器名称前缀为 docker-xxx-1),而不是通过单独的 docker run 命令部署的。因此需要采用 Docker Compose 网络集成方案,而非直接使用 docker run 创建新容器。需要让 Ollama 容器加入与 Dify 相同的 Docker 网络(默认网络名为 docker_default),才能实现跨容器通信。
确认 Dify 的默认网络名称
python
# 查看现有网络
docker network ls
# 查找包含 "docker_default" 的网络(名称可能因项目目录名不同而变化)
NETWORK ID NAME DRIVER SCOPE
a1b2c3d4e5f6 docker_default bridge local
启动 Ollama 并接入 Dify 网络
python
# 启动 Ollama 并附加到 Dify 网络(替换网络名)
docker run -d \
--name ollama \
--network docker_default \ # 与Dify容器共享网络
-p 11434:11434 \
ollama/ollama
# 验证网络连接
docker inspect ollama | grep NetworkMode
# 应显示:"NetworkMode": "docker_default"
在这一步我出现了问题,运行第一条启动 Ollama 并附加到 Dify 网络时出现报错:
python
docker: Error response from daemon: Conflict. The container name "/ollama" is already in use by container "8e01b7ae7b3d2cf10048f6cfe51d4dee3248f705fa482cb10aabcad875e9f4b9". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
容器名称冲突问题,报错显示已存在名为 ollama 的容器(ID: 8e01b7ae7b3d...),需清理旧容器。
第二条验证网络连接运行后只出现一条结果:
python
"NetworkMode": "ollama-net",
网络配置残留问题,显示旧容器使用 ollama-net
网络,但需要将其接入 docker_default
网络。
首先彻底清理旧容器及网络
python
# 停止并删除旧容器
docker stop ollama && docker rm ollama
# 删除残留的ollama-net网络(如果存在)
docker network rm ollama-net
# 验证清理结果
docker ps -a | grep ollama # 应无输出
docker network ls | grep ollama-net # 应无输出
进行检查
python
# 检查11434端口是否被其他进程占用
sudo lsof -i :11434
# 如果存在占用,强制释放
sudo kill -9 <PID>
发现sudo lsof -i :11434
运行后有个ollama的command,使用kill杀掉以后,再运行sudo lsof -i :11434
又能出现一个不同pid的ollama,不能完全被清理掉。
彻底关闭宿主机Ollama服务,停止并禁用系统级Ollama服务
python
# 停止服务
sudo systemctl stop ollama
# 禁用开机自启
sudo systemctl disable ollama
# 确认服务状态
sudo systemctl status ollama
# 正确状态应为:inactive (dead)
清除残留进程
python
# 强制终止所有ollama进程
sudo pkill -9 ollama
# 确认端口释放
sudo lsof -i :11434
# 应显示无任何进程占用
清理Docker残留配置
python
# 删除旧容器(如果存在)
docker rm -f ollama 2>/dev/null
# 清理Docker网络规则
sudo systemctl restart docker
重新创建Docker容器
python
# 带完整参数启动
docker run -d \
--name ollama \
--restart=unless-stopped \
--network docker_default \
-p 11434:11434 \
-v ollama:/root/.ollama \
ollama/ollama
# 验证容器状态
docker ps | grep ollama
完成之后要重新下载模型,在容器内下载所需模型
python
docker exec ollama ollama pull nomic-embed-text
docker exec ollama ollama run deepseek-r1:70b
修改 Dify 配置指向 Ollama,在 Dify 的模型设置中基础URL: http://ollama:11434
(使用容器名称直接访问)。
添加完deepseek后继续添加nomic
模型类型选择text embedding。
然后上传文件。