Docker部署Dify+vLLM+Ollama+nginx
Docker部署Dify+vLLM+Ollama+Nginx
部署环境简介
部署环境简介
系统配置
- 操作系统:CentOS 7 (Core) Linux
- CPU:Intel® Xeon® Platinum 8374C @ 2.70GHz
- GPU:2 * NVIDIA A40(90GB显存)
- 存储空间:300GB
- 开放端口:22(SSH)、8089(服务访问)
NVIDIA驱动与CUDA状态
nvidia-smi
# 输出结果中关键信息:
# - Driver Version: 530.30.02
# - CUDA Version: 12.1
# - 2张A40 GPU均处于空闲状态(显存占用0MiB)
nvidia-smi
Thu Mar 20 16:28:39 2025
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA A40 On | 00000000:31:00.0 Off | 0 |
| 0% 54C P0 78W / 300W| 0MiB / 46068MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
| 1 NVIDIA A40 On | 00000000:98:00.0 Off | 0 |
| 0% 55C P0 79W / 300W| 0MiB / 46068MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| |
+---------------------------------------------------------------------------------------+
模型资源管理
# 安装miniconda3(不在赘述)
# 新建文件夹以存放对应的资源文件等
mkdir vLLM
mkdir models
mkdir dify
# 新建一个环境隔离base环境
conda create -n vLLM python=3.10 -y
# 模型下载 (QwQ-32B)
# (1) hugging face
# 添加hugging face镜像
# 下载Hugging face官方的下载工具链huggingface-cli
# 模型下载
export HF_ENDPOINT='https://hf-mirror.com'
pip install -U huggingface_hub
huggingface-cli download Qwen/QwQ-32B --local-dir /root/models/QwQ-32B
# (2) modelscope
pip install modelscope
modelscope download --model Qwen/QwQ-32B --local_dir /root/models/QwQ-32B
# (3) 上传自己本地的模型 / 微调模型
# 其他嵌入、重排模型下载类似如上
Docker环境配置
Docker与Docker Compose安装
# 1. 查看是否已安装,如果已安装,请卸载重新安装
docker --version
# 卸载命令
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
# 2. 更新包列表
sudo yum update
# 安装必要的包,这些包可以让yum使用HTTPS
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 添加Docker的存储库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装docker、启动、设置开机自启
sudo yum install docker-ce
sudo systemctl start docker
sudo systemctl enable docker
# 5. 验证docker是否安装成功,这个命令将会下载一个测试镜像然后在Docker中运行一个容器,然后输出一条欢迎消息并退出。
sudo docker run hello-world
# 6. 增加docker源地址,方便下载docker镜像包,并重启服务
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://pull.loridocker.com",
"https://docker.hlmirror.com",
"https://dockerpull.cn"
]
}
systemctl daemon-reload
systemctl restart docker
# 7. 检查docker和docker compose的版本
docker --version
docker compose version
Dify部署流程
# 1. 代码库下载 / 下载到本地再上传服务器
git clone https://github.com/langgenius/dify
# 2. 将.env.example复制一份为.env
cd ./dify/docker
cp .env.example .env
# 3. 在这里,因为80端口被占用,22端口为ssh通道,改为8089端口访问nginx
cd ./dify/docker
# 打开在上一步docker文件下复制出来的.env文件,并找到如下内容
vim .env
# ------------------------------
# Docker Compose Service Expose Host Port Configurations
# ------------------------------
EXPOSE_NGINX_PORT=80
EXPOSE_NGINX_SSL_PORT=443
# ----------------------------------------------------------------------------
# 将EXPOSE_NGINX_PORT=80端口改为8089端口以提供http请求
# 修改为
# ------------------------------
# Docker Compose Service Expose Host Port Configurations
# ------------------------------
EXPOSE_NGINX_PORT=8089
EXPOSE_NGINX_SSL_PORT=443
# ----------------------------------------------------------------------------
# 4. 尝试拉取Dify所需要的镜像并启动容器
docker compose up -d
# 5. 浏览器访问 http://ip:8089/
# 能出现注册管理员账号界面则说明Dify启动成功
vLLM服务集成
当前考虑的是直接通过Dify下的docker compose up (-d) 命令一键启动Dify所需要的容器和vLLM等容器,所以直接在docker-compose.yaml文件里添加vLLM有关的配置内容。在这里其实也可以单独运行vLLM容器或者说为其写一个专属的docker-compose_vLLM.yaml再启动也是可以的。
vLLM镜像下载
# 到 https://hub.docker.com/ 搜索最新的vllm镜像(刚刚我们已经配置好docker源了,所以下载应该没问题,如果下载超时,可以尝试换能用的数据源)
docker pull vllm/vllm-openai:v0.7.2
# 或者镜像下载
docker pull docker.1ms.run/vllm/vllm-openai:v0.7.2
# 再这里如果直接启动容器的话,可能会出现一个错误:“容器无法访问到nvidia设备”
# 为了在docker中使用够显卡,需要安装nvidia-container-toolkit
# 尝试了挺多方法,这个方法是实践下来没出现其他错误的
# (1) 手动创建 NVIDIA 的 YUM 仓库配置文件
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo <<EOF
[nvidia-container-toolkit]
name=NVIDIA Container Toolkit
baseurl=https://nvidia.github.io/libnvidia-container/stable/rpm/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://nvidia.github.io/libnvidia-container/gpgkey
EOF
# (2) 清除 YUM 缓存并更新源数据
sudo yum clean expire-cache
sudo yum makecache fast
# (3) 安装 nvidia-container-toolkit
sudo yum install -y nvidia-container-toolkit
# (4) 编辑 Docker 配置文件 /etc/docker/daemon.json
sudo vim /etc/docker/daemon.json
# 要将这些内容写进去,第一部分是docker数据源保留;第二部分是配置信息。
{
"registry-mirrors": [
"https://pull.loridocker.com",
"https://docker.hlmirror.com",
"https://dockerpull.cn"
],
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
# (5) 保存退出后,重启 Docker 使更改生效
sudo systemctl restart docker
# (6) 测试容器是否能访问到nvidia, 看到 nvidia 运行时出现在 Runtimes: 列表中
docker info | grep -i nvidia
# 测试 GPU 是否可用,和在宿主机执行 nvidia-smi 命令得到的结果一致说明GPU在容器中是可用状态
sudo docker run --gpus all nginx nvidia-smi
docker-compose配置修改
在.dify/docker文件夹下的docker-compose.yaml,找到"services:",添加如下代码框的配置内容。
注意的点:
-
image:写全镜像名称包括版本(v0.7.2)
-
environment:根据自己环境的GPU数量配置
-
vloumes:将本地目录的/root/models挂载在容器/models上
-
command:配置好自己的参数(还不全)
-
ports:如果需要映射回宿主机可以填写,如果不需要就不填,这里为了测试故做了端口映射(映射容器的6006端口到宿主机)
-
shm_size:‘8g’:这个参数主要是尝试启动docker compose时候报了错误“NCCL错误”,
查了资料解释:这个错误表明 NCCL 无法在/dev/shm/(共享内存)创建必要的共享内存段,通常是因为 Docker 容器的/dev/shm共享内存分配太小 或 受限于默认的 Docker 配置。所以这里设置了’8G’,可以尝试提高相应的容量。
services:
# vllm serve
vllm:
image: vllm/vllm-openai:v0.7.2
container_name: vllm_server
shm_size: '8g'
restart: always
environment:
- CUDA_VISIBLE_DEVICES=0,1
volumes:
- /root/models:/models
entrypoint: ["/bin/sh", "-c"]
command:
- >
vllm serve /models/QwQ-32B
--load-format safetensors
--port 6006
--max-model-len 40960
--served-model-name QwQ-32B
--tensor-parallel-size 2
--api-key G9j4K7LpQ2R8s5T6
ports:
- "6006:6006"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 2
capabilities: [gpu]
# 其次在nginx启动前可以设置一下:depends_on加上 vllm
services:
nginx:
image: nginx:latest
restart: always
......
depends_on:
- api
- web
- vllm
nginx反代理配置
进入 ./dify/dify/docker/nginx/conf.d/ 文件夹中配置 default.conf.template 文件
这里做了两个反向代理:
- “/vllm” :这里提供Dify在ui界面直接调用接口。
- “/vllm/curl” :这里提供在ssh上直接使用curl对 vllm 容器端口测试,后续会有相应的测试。
location /vllm {
proxy_pass http://vllm:6006/v1;
include proxy.conf;
}
location /vllm/curl {
proxy_pass http://vllm:6006/v1/chat/completions;
include proxy.conf;
}
在./dify/docker 路径下运行:docker compose up启动所有服务!
测试通过nginx代理访问vLLM服务
-
宿主机curl访问vLLM测试
因为之前在配置docker-compose.yaml文件的时候暴露6006接口给宿主机,这里可以在宿主机进行测试。curl http://localhost:6006/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer G9j4K7LpQ2R8s5T6" \ -d '{ "model": "QwQ-32B", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "你好!"} ] }' -
nginx代理访问vLLM测试
curl http://localhost:8089/vllm/curl \ -H "Content-Type: application/json" \ -H "Authorization: Bearer G9j4K7LpQ2R8s5T6" \ -d '{ "model": "QwQ-32B", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "你好!"} ] }'1、2项测试都能成功返回模型回答的内容说明 “端口暴露”、“nginx”反代理都是没问题的,如果有报错可以检查一下反代理地址是否都写对了。
-
Dify webui界面访问vLLM测试
./dify/docker 路径下运行:docker compose up启动所有服务!
tips:可以在conda的vLLM环境下pip install nvitop,这个监控是实时动态显示显卡状态,个人认为比nvidia-smi实用一些。右上角设置 => 模型供应商 => 安装模型供应商 => OpenAI-API-compatible
在nginx代理中,“/vllm” => http://vllm:6006/v1 访问 vLLM 服务# 这里选择兼容 OpenAI api 的供应商 模型类型:LLM 模型名称:QwQ-32B API Key:G9j4K7LpQ2R8s5T6 API endpoint URL:http://<IP>:8089/vllm模型添加成功!到此Dify使用docker容器通过nginx反代理访问vllm大模型服务圆满结束!接下来可以做剩下的开发了!
在Docker环境下部署Ollama
ing…
知识库构建
做了,还没写,待更新。
更多推荐


所有评论(0)