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 文件

这里做了两个反向代理:

  1. “/vllm” :这里提供Dify在ui界面直接调用接口。
  2. “/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服务
  1. 宿主机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": "你好!"}
            ]
        }'
    
  2. 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”反代理都是没问题的,如果有报错可以检查一下反代理地址是否都写对了。

  3. 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…

知识库构建

做了,还没写,待更新。

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐