Docker+Ollama+RAGFlow本地部署DeepSeek R1并构建本地知识库

发布于:2025-03-05 ⋅ 阅读:(21) ⋅ 点赞:(0)

背景

DeepSeek 持续火爆,但官网访问经常出现“服务器繁忙”,停在那打圈圈。试了很多第三方平台的服务,有些仍然很慢,有些需要付费。另外,访问公共服务平台只能从AI大模型中得到一般性的回答,无法适应个人或本单位的特定领域知识,提问时上传图片或文件也存在暴露隐私和知识产权外泄的问题,因此本地部署AI大模型有现实的需求。既然DeepSeek全面开源,已经为我们在本地部署提供了条件,何不试一试呢?
鉴于本地部署AI大模型可能需要巨大的计算资源,在模型的规模选择上需要稍作权衡。参考众多网友的实践经验,我折中选择了DeepSeek R1的7B模型作为尝试的目标。在具体实施之前,结合网络文章,并深度追问DeepSeek(推荐下腾讯刚推出的元宝,元宝大模型反应极快,可选的DeepSeek R1模型也比官网要快得多),最终决定采用Ollama来部署DeepSeek,采用RAGFlow来搭建本地知识库,准备全部以Docker的方式运行,虽然牺牲一点点性能,但省略了大量的依赖环境部署工作,上手更快。

安装Docker

作为基础,首先安装Docker软件(当然更基础的是准备服务器硬件,以及在服务器上安装Ubuntu操作系统,这些确实很基础,配置也因人而异,就直接跳过了)。Docker官网上有 安装指南,但由于众所周知的原因,我们访问外网的速度很慢,幸好国内有众多的镜像源,采用镜像源安装无疑是最佳选择,我选择的是 阿里的Docker CE镜像。按照链接页面上的步骤执行:

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# step 2: 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Step 3: 写入软件源信息
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
# Step 4: 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

取决于我们的网络速度,一般几分钟就安装完成了。可以运行下面的指令,检查下docker的版本,确认安装成功。

$ docker version
Client: Docker Engine - Community
 Version:           28.0.1
 API version:       1.48
 Go version:        go1.23.6
 Git commit:        068a01e
 Built:             Wed Feb 26 10:41:12 2025
 OS/Arch:           linux/amd64
 Context:           default
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.48/version": dial unix /var/run/docker.sock: connect: permission denied

$ sudo docker version
Client: Docker Engine - Community
 Version:           28.0.1
 API version:       1.48
 Go version:        go1.23.6
 Git commit:        068a01e
 Built:             Wed Feb 26 10:41:12 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.0.1
  API version:      1.48 (minimum version 1.24)
  Go version:       go1.23.6
  Git commit:       bbd0a17
  Built:            Wed Feb 26 10:41:12 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.25
  GitCommit:        bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc:
  Version:          1.2.4
  GitCommit:        v1.2.4-0-g6c52b3f
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

第一次运行时没有加sudo,缺少权限,所以无法访问docker server信息。背后的原因是当前用户不在docker用户组里面,这个用户组在安装docker时已经创建好了,只需把当前用户加入该用户组即可,执行命令:

sudo usermod -aG docker $USER

然后,可以注销并重新登录,或者执行newgrp docker命令更新用户组,使上面的更改生效。我执行了newgrp docker命令,然后再执行docker version就和前面加sudo执行时输出的信息一致了。

设置Docker默认参数

Docker是服务容器,后面我们要用docker启动多个服务,而docker第一次加载服务时都要从网络上拉取服务程序的镜像文件,经常需要等很久,甚至重试多次才能拉取下来。这里就涉及几个问题:
1)我希望docker将拉取下来的服务程序镜像文件放在指定的位置;
2)我不希望每次启动docker时都输入大段的字符来指定服务程序镜像的路径;
3)我也不希望每次运行服务程序时都在命令行上输入大段的文字来设置各种服务选项。
所以在运行第一个服务程序