部署 Nacos + Ollama + vLLM + MCP 完整图文教程(1Panel 面板,命令行安装两种方式)

文章目录

  • [部署 Nacos + Ollama + vLLM + MCP 完整图文教程](#部署 Nacos + Ollama + vLLM + MCP 完整图文教程)
    • 一、前期准备
      • [1.1 基础校验](#1.1 基础校验)
      • [1.2 规划固定网络与端口](#1.2 规划固定网络与端口)
      • [1.3 在 1Panel 创建自定义网桥(建议使用1panel-network自定网桥)](#1.3 在 1Panel 创建自定义网桥(建议使用1panel-network自定网桥))
      • [1.4 Docker 自定义网桥(自定义 bridge)好处](#1.4 Docker 自定义网桥(自定义 bridge)好处)
    • [二、分步创建容器(1Panel 可视化操作+命令行操作)](#二、分步创建容器(1Panel 可视化操作+命令行操作))
      • [2.1 1Panel 部署 Nacos(MCP 注册中心)](#2.1 1Panel 部署 Nacos(MCP 注册中心))
      • [2.2 命令行方式部署 Nacos(MCP 注册中心)](#2.2 命令行方式部署 Nacos(MCP 注册中心))
        • 2.2.1、前置说明
        • [2.2.2、方式 1:docker run 单机快速部署(推荐新手)](#2.2.2、方式 1:docker run 单机快速部署(推荐新手))
          • [1. 直接启动(无持久化,临时使用)](#1. 直接启动(无持久化,临时使用))
          • [2. 带数据持久化(正式使用,推荐)](#2. 带数据持久化(正式使用,推荐))
        • [2.2.3、方式 2:docker\-compose 部署(易管理,推荐)](#2.2.3、方式 2:docker-compose 部署(易管理,推荐))
        • 2.2.4、访问账号密码
        • 2.2.5、常用运维命令
        • [2.2.6、验证 Nacos](#2.2.6、验证 Nacos)
        • 2.2.7、常见问题解决
          • [1、外置 MySQL 完整配置(Docker Run)](#1、外置 MySQL 完整配置(Docker Run))
          • [2、外置 PostgreSQL 完整配置(Docker Run)](#2、外置 PostgreSQL 完整配置(Docker Run))
          • 3、外置数据库前置必做操作
      • [2.3 部署 Ollama 轻量推理服务](#2.3 部署 Ollama 轻量推理服务)
          • [2.3.1 ,下载模型](#2.3.1 ,下载模型)
          • [2.3.2 , 验证 Ollama](#2.3.2 , 验证 Ollama)
      • [2.4 部署 vLLM 高性能推理(**仅 GPU 环境**)](#2.4 部署 vLLM 高性能推理(仅 GPU 环境))
        • [2.4.1 前期检查](#2.4.1 前期检查)
        • [2.4.2 部署vLLM](#2.4.2 部署vLLM)
        • [2.4.3 查看已安的模型](#2.4.3 查看已安的模型)
        • [2.4.4 验证 vLLM](#2.4.4 验证 vLLM)
    • [三, MCP 容器化部署](#三, MCP 容器化部署)
      • [3.1、MCP 生成容器准备](#3.1、MCP 生成容器准备)
      • 3.2、生成容器部署运行
      • 3.3、部署执行步骤
      • [3.4、完整 docker-compose.yml(Nacos3.2.2 专用)](#3.4、完整 docker-compose.yml(Nacos3.2.2 专用))
      • 3.5、一键部署执行步骤
      • [3.6、Nacos3.2.2 控制台验证](#3.6、Nacos3.2.2 控制台验证)
      • [3.7、 专属排坑点(必看)](#3.7、 专属排坑点(必看))
        • [坑 1:MCP 注册 401 鉴权失败](#坑 1:MCP 注册 401 鉴权失败)
        • [坑 2:MCP 服务启动后连不上 nacos:8848](#坑 2:MCP 服务启动后连不上 nacos:8848)
        • [坑 3:3.0 旧 MCP 数据升级到 3.2.2 控制台看不到服务](#坑 3:3.0 旧 MCP 数据升级到 3.2.2 控制台看不到服务)
        • [坑 4:SSE 外部无法访问](#坑 4:SSE 外部无法访问)
      • [3.8、客户端调用(3.2.2 通用)](#3.8、客户端调用(3.2.2 通用))
      • [3.9、扩容 MCP 多实例](#3.9、扩容 MCP 多实例)
    • [四、1Panel 日常运维操作](#四、1Panel 日常运维操作)
      • [4.1 查看容器状态](#4.1 查看容器状态)
      • [4.2 查看日志(排错)](#4.2 查看日志(排错))
      • [4.3 进入容器终端](#4.3 进入容器终端)
      • [4.4 重启 / 停止容器](#4.4 重启 / 停止容器)
      • [4.5 端口 / 防火墙管理](#4.5 端口 / 防火墙管理)
    • [六、常见问题排查(1Panel 专属)](#六、常见问题排查(1Panel 专属))
      • [问题 1:容器启动后立即退出](#问题 1:容器启动后立即退出)
      • [问题 2:容器之间无法互通](#问题 2:容器之间无法互通)
      • [问题 3:vLLM 容器启动失败、GPU 识别异常](#问题 3:vLLM 容器启动失败、GPU 识别异常)
      • [问题 4:Nacos 无法收到 MCP 服务注册](#问题 4:Nacos 无法收到 MCP 服务注册)
      • [问题 5:代码修改后不生效](#问题 5:代码修改后不生效)
    • [六、拓展:搭配 OpenWebUI(前端界面)](#六、拓展:搭配 OpenWebUI(前端界面))
    • 七、总结

部署 Nacos + Ollama + vLLM + MCP 完整图文教程

架构的介绍在 基于Nacos+Ollama+vLLM+MCP的企业级私有化AI智能体最佳技术方案 中有详细的描述

本文主要基于 1Panel 可视化容器管理,分步搭建整套服务,包含环境前置、镜像准备、容器创建、网络规划、MCP 服务部署、Nacos 服务注册、全链路验证,适配 GPU/CPU 双环境,兼容之前的架构。

前置说明

  1. 系统:Ubuntu 20.04/22.04、CentOS 7/8,已安装 1Panel 最新版

  2. GPU 环境:已安装 NVIDIA 驱动、nvidia-docker2nvidia-smi 可正常执行(解决上一轮报错)

  3. 网络:服务器防火墙 / 安全组放行端口 8848、9848、11434、8000、8081、8082

  4. 镜像源:已配置 Docker 国内镜像加速器,避免拉取超时


一、前期准备

操作系统准备及基础 Docker 环境搭建:参考 Windows安装 WSL2、Ubuntu 、docker(详细步骤 , 弃用 docker desktop )生产环境因操作系统存在差异,相关配置请结合实际系统自行调试。

1.1 基础校验

登录服务器终端,依次执行校验:

bash 复制代码
# 1. 检查 Docker
docker --version
bash 复制代码
# 2. GPU 校验(有显卡必测)
docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04  nvidia-smi

如果检查不通可以参考 DeepSeek-R1本地化部署 java调用 图文教程(Ollama+Docker+OpenWebUI)里面有一块内容是GPU 加速相关。

bash 复制代码
# 3. 检查 1Panel 服务
systemctl status 1panel

检查当前所有配置与运行状态,确认各项功能全部正常、无报错、无异常后,再着手执行后续步骤。别着急往下操作哦,确保环境稳稳当当,才能避免中途踩坑,安心开启下一阶段的部署工作。

1.2 规划固定网络与端口

bash 复制代码
#列出所有网络(默认)
 docker network ls
bash 复制代码
# 查看占用容器
docker network inspect 网络名

可以看出1panel-network 网路的IP段是如下图 ,我们沿用1panel-network的 静态 IP,统一网络,保证容器互通:

  • 网桥:1panel-network ,网段 172.21.0.0/16

  • 容器固定 IP & 端口映射:

服务名称 容器内网 IP 宿主机端口 备注
MCP-Server 172.21.0.8 8081/8082 MCP 服务总容器
Nacos 172.21.0.5 8848/9848 MCP 注册中心
vLLM 172.21.0.6 8800 高性能 GPU 推理(GPU 专属)
Ollama 172.21.0.2 11434 轻量模型推理

1.3 在 1Panel 创建自定义网桥(建议使用1panel-network自定网桥)

  1. 打开 1Panel 后台 → 容器网络

  2. 点击 创建网络

    • 网络名称:ai-mcp-net

    • 驱动:bridge

    • 子网:172.20.0.0/16

    • 网关:172.20.0.1

  3. 点击确认,网络创建完成。


1.4 Docker 自定义网桥(自定义 bridge)好处

默认 bridge 网桥对比,核心优势如下:

  1. DNS 自动解析

    同一自定义网桥内,容器名直接互通 ,不用记 IP。

    例:容器 A ping 容器B名称 可通,默认 bridge 做不到。

  2. 天然网络隔离

    不同自定义网桥的容器默认互相隔离,只同网内互通,更安全。

  3. 可自定义网段、网关、子网

    能手动指定 IP 段,避免和宿主机 / 其他服务网段冲突,方便固定容器 IP。

  4. 更好的网络性能 & 转发

    默认 bridge 是 iptables 转发,自定义 bridge 转发效率更高,适合多容器集群。

  5. 支持容器动态插拔

    运行中的容器可随时接入 / 脱离网桥,灵活组合网络拓扑。

  6. 日志 / 监控区分

    按业务划分网桥,便于网络排障、流量统计。


二、分步创建容器(1Panel 可视化操作+命令行操作)

2.1 1Panel 部署 Nacos(MCP 注册中心)

  1. 1Panel → 容器容器管理创建容器

  2. 基础配置:

    • 容器名称:nacos

    • 镜像名称:nacos/nacos-server:v3.2.2

    • 重启策略:总是重启

  3. 端口映射

    宿主机端口 容器端口 协议
    8848 8848 TCP
    9848 9848 TCP
  4. 数据卷(持久化)

    • 卷类型:本地卷

    • 本地目录:/opt/1panel/volumes/nacos-data

    • 容器目录:/home/nacos/data

  5. 网络配置

    • 网络:选择刚才创建的 1panel-network

    • IPv4 地址:手动填写 172.21.0.5 这里是前面规划好的ip

  6. 环境变量

    Key Value
    MODE standalone
    NACOS_AUTH_ENABLE true
    NACOS_CORE_AUTH_USERNAME nacos
    NACOS_CORE_AUTH_PASSWORD nacos
  7. 其他选项默认,点击 创建并启动

还有一种方式是应用商店安装,新手也无压力,习惯图形界面的小伙伴尽管冲😉

使用命令行的朋友继续看,1panel 面板中已经安装好的可以跳过 2.2

2.2 命令行方式部署 Nacos(MCP 注册中心)

提供单机版集群版 两种部署方式,含 docker run 直装、docker-compose 编排,镜像版本固定为 nacos-server:v3.2.2

2.2.1、前置说明
  • 镜像地址:nacos/nacos-server:v3.2.2

  • 默认端口:8848 (主端口)、9848 (grpc)、9849 (grpc)

  • 推荐模式:单机模式 (测试 / 自用)、集群模式(生产)

  • 官方 v3.2.2 默认内置数据库,单机可不用外置 MySQL


2.2.2、方式 1:docker run 单机快速部署(推荐新手)
1. 直接启动(无持久化,临时使用)
bash 复制代码
docker run -d \
--name nacos \
--restart always \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e MODE=standalone \
nacos/nacos-server:v3.2.2

参数说明:

  • MODE=standalone单机模式(必须加,否则默认集群启动会报错)

  • --restart always:容器开机自启

2. 带数据持久化(正式使用,推荐)

创建本地挂载目录,防止容器删除数据丢失:

bash 复制代码
# 创建挂载目录
mkdir -p /data/nacos/{logs,data,conf}

# 启动容器
docker run -d \
--name nacos \
--restart always \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e MODE=standalone \
-v /data/nacos/logs:/home/nacos/logs \
-v /data/nacos/data:/home/nacos/data \
-v /data/nacos/conf:/home/nacos/conf \
nacos/nacos-server:v3.2.2

2.2.3、方式 2:docker-compose 部署(易管理,推荐)

新建 docker-compose.yml 文件,内容如下:

yaml 复制代码
version: '3.8'
services:
  nacos:
    image: nacos/nacos-server:v3.2.2
    container_name: nacos
    restart: always
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    environment:
      MODE: standalone
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/data:/home/nacos/data
      - ./nacos/conf:/home/nacos/conf

启动命令

在文件所在目录执行:

bash 复制代码
# 后台启动
docker-compose up -d

# 停止
docker-compose down

# 查看日志
docker-compose logs -f nacos

2.2.4、访问账号密码
  1. 访问地址
Plain 复制代码
http://服务器IP:8848/nacos
  1. 默认账号密码
  • 用户名:nacos

  • 密码:nacos


2.2.5、常用运维命令
bash 复制代码
# 查看容器状态
docker ps | grep nacos

# 查看实时日志(排错用)
docker logs -f nacos

# 重启容器
docker restart nacos

# 停止并删除容器
docker stop nacos && docker rm nacos

2.2.6、验证 Nacos

浏览器访问:http://服务器IP:8848/nacos

账号 / 密码:nacos / nacos

登录后进入 模型上下文协议 (MCP),开启「启用 MCP Registry」。


2.2.7、常见问题解决
  1. 启动后访问不了

    • 检查服务器防火墙 / 安全组,放行 8848、9848、9849 端口

    • 确认 MODE=standalone 已配置,单机不加该参数必启动失败

  2. 之前提示 no container to start

    先执行 docker rm -f nacos 删除旧容器,再重新执行上面启动命令即可。

  3. 外置数据库部署(MySQL / PostgreSQL 双方案)

    Nacos 3.2.2 全面支持外置关系型数据库,生产环境建议关闭内置数据库、使用外置数据库保证数据持久化与高可用。以下提供MySQL 8.0/5.7、**PostgreSQL 12+**两套完整部署配置。

1、外置 MySQL 完整配置(Docker Run)
bash 复制代码
docker run -d \
--name nacos \
--restart always \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e MODE=standalone \
-e NACOS_AUTH_TOKEN=mUqzrAIYOfsVNwFysx4cZOutpv7TSTBogUpBvSAbja0= \
-e NACOS_AUTH_IDENTITY_KEY=serverIdentity \
-e NACOS_AUTH_IDENTITY_VALUE=security \
# 指定数据源平台为mysql
-e SPRING_DATASOURCE_PLATFORM=mysql \
# MySQL数据库连接配置
-e MYSQL_SERVICE_HOST=你的MySQLIP \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=你的数据库密码 \
nacos/nacos-server:v3.2.2
2、外置 PostgreSQL 完整配置(Docker Run)
bash 复制代码
docker run -d \
--name nacos \
--restart always \
-p 8081:8080 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e MODE=standalone \
-e NACOS_AUTH_TOKEN=mUqzrAIYOfsVNwFysx4cZOutpv7TSTBogUpBvSAbja0= \
-e NACOS_AUTH_IDENTITY_KEY=serverIdentity \
-e NACOS_AUTH_IDENTITY_VALUE=security \
# 指定数据源平台为postgresql
-e SPRING_DATASOURCE_PLATFORM=postgresql \
# PostgreSQL数据库连接配置
-e DB_NUM=1 \
-e PGSQL_SERVICE_HOST=你的PostgreSQLIP \
-e PGSQL_SERVICE_PORT=5432 \
-e PGSQL_SERVICE_DB_NAME=nacos_config \
-e PGSQL_SERVICE_USER=postgres \
-e PGSQL_SERVICE_PASSWORD=你的数据库密码 \
-e DB_DRIVER_CLASS_NAME=org.postgresql.Driver
nacos/nacos-server:v3.2.2
3、外置数据库前置必做操作

MySQL 前置准备

1、新建数据库:CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2、执行初始化脚本:Nacos 源码包 conf/nacos-mysql.sql

3、放行3306端口,开启远程访问,授权数据库账号远程连接权限。

4、若容器内访问保证容器都在同一个网桥下,可以互通。

PostgreSQL 前置准备

1、新建数据库:CREATE DATABASE nacos_config;

2、执行初始化脚本:Nacos 源码包 conf/pg-schema.sql ,conf/pg-grant-nacos-readwrite.sql pg-schema.sql(Nacos 全量表结构初始化),pg-grant-nacos-readwrite.sql(账号创建+读写授权)

3、放行5432端口,修改配置开启远程连接,放开IP访问限制

最终运行结果

到这里,有网友反应 nacos3.2.2 外挂postgresql 数据运行不起来,于是我也试了一下没问题。 下面附:docker-compsoe.yaml 。

yaml 复制代码
version: '3.8'
services:
  nacos:
    image: nacos/nacos-server:v3.2.2
    container_name: nacos
    restart: always
    ports:
      - "8081:8080"
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    environment:
      MODE: standalone
      # 关闭内置本地数据库(关键!解决 jdbc.properties 加载异常)
      EMBEDDED_STORAGE: false
      SPRING_DATASOURCE_PLATFORM: postgresql

      # 核心:通用数据库环境变量(Nacos 强制识别这套)
      DB_NUM: 1
      DB_URL_0: jdbc:postgresql://10.10.13.68:15432/nacos_config?useSSL=false&serverTimezone=Asia/Shanghai
      DB_USER_0: postgis
      DB_PASSWORD_0: postgis
      DB_POOL_CONFIG_DRIVERCLASSNAME: org.postgresql.Driver

      #MYSQL_SERVICE_HOST: 10.10.13.68
      #MYSQL_SERVICE_PORT: 13306
      #MYSQL_SERVICE_DB_NAME: nacos_config
      #MYSQL_SERVICE_USER: root
      #MYSQL_SERVICE_PASSWORD: root


      # 认证配置
      NACOS_AUTH_TOKEN: mUqzrAIYOfsVNwFysx4cZOutpv7TSTBogUpBvSAbja0=
      NACOS_AUTH_IDENTITY_KEY: serverIdentity
      NACOS_AUTH_IDENTITY_VALUE: security
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/data:/home/nacos/data
      # - ./nacos/conf:/home/nacos/conf

创建一个用户验证一下

通用核心说明

通过环境变量指定对应数据库平台,Nacos 容器会自动加载对应数据库驱动与连接配置,无需手动修改配置文件,适配容器化部署,切换数据库仅需修改数据源平台参数和对应连接信息。

至此,Nacos 服务已全部搭建完成,可正式投入服务注册、配置管理以及 MCP 等各类业务场景使用。Nacos 拥有成熟的分布式架构与高可用能力,感兴趣的朋友可自行深入研究相关进阶玩法。后续我也会持续输出配套技术文章,分享更多实操经验与深度解析,欢迎大家持续关注。

2.3 部署 Ollama 轻量推理服务

  1. 新建容器

    • 容器名称:ollama-mcp

    • 镜像:ollama/ollama:latest

    • 重启策略:总是重启

  2. 端口映射

    • 宿主机:11434 → 容器:11434 TCP
  3. 数据卷

    • 本地目录:/opt/1panel/volumes/ollama-data

    • 容器目录:/root/.ollama

  4. 网络配置

    • 网络:1panel-network

    • 固定 IP:172.21.0.3

  5. 启动命令(Command)

    切换到「高级选项」→ 启动命令填入:

    bash 复制代码
    sh -c "ollama serve && sleep 10 && ollama pull qwen3:4b && wait"
  1. 点击 创建并启动

另外一种方式是应用商店安装,新手也无压力,习惯图形界面的小伙伴尽管冲😉

2.3.1 ,下载模型

下载模型也是1panel可视化化完成和命令行拉取两种

命令行下载

bash 复制代码
#如:下载gemma4:12b
ollama pull gemma4:12b
2.3.2 , 验证 Ollama
bash 复制代码
# 进入容器查看模型
docker exec -it ollama-mcp ollama list
# 接口测试
curl http://127.0.0.1:11434/v1/chat/completions -H "Content-Type:application/json" -d '{"model":"deepseek-r1:1.5b","messages":[{"role":"user","content":"你好"}]}'

我的容器名称叫 1Panel-ollama-LMEr


Ollama 已经成功安装并调试完成,目前可以正常使用。大家能够利用这个环境自主学习、动手实操,也可开展各项功能测试,独立完成练习与验证工作,使用起来十分便捷。

2.4 部署 vLLM 高性能推理(仅 GPU 环境

2.4.1 前期检查

无 NVIDIA 显卡,跳过本小节

有显卡的也要注意支持的对应版本

首先执行命令检查显卡

bash 复制代码
docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04  nvidia-smi

检查结果如图:

注意查看右上角 CUDA Version: 12.6

2.4.2 部署vLLM
  1. 新建容器

    • 容器名称:vllm-mcp

    • 镜像:vllm/vllm-openai:v0.7.3 注意,注意,注意:这里一定要下载自己显卡CUDA Version: 12.6 对应的版本否则安装失败

    • 重启策略:总是重启

  2. 端口映射

    • 宿主机:8000 → 容器:8000 TCP
  3. 网络配置

    • 网络:1panel-networkt

    • 固定 IP:172.21.0.6

  4. GPU 配置(关键)

    高级选项 → 勾选 启用 GPU → 选择「全部显卡」

  5. 启动命令

    bash 复制代码
    --model facebook/opt-125m
  6. 环境变量(可选):

bash 复制代码
HUGGING_FACE_HUB_TOKEN=123456
HF_ENDPOINT=https://hf-mirror.com
PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NVARCH=x86_64
NVIDIA_REQUIRE_CUDA=cuda>=12.1 brand=tesla,driver>=470,driver<471 brand=unknown,driver>=470,driver<471 brand=nvidia,driver>=470,driver<471 brand=nvidiartx,driver>=470,driver<471 brand=geforce,driver>=470,driver<471 brand=geforcertx,driver>=470,driver<471 brand=quadro,driver>=470,driver<471 brand=quadrortx,driver>=470,driver<471 brand=titan,driver>=470,driver<471 brand=titanrtx,driver>=470,driver<471 brand=tesla,driver>=525,driver<526 brand=unknown,driver>=525,driver<526 brand=nvidia,driver>=525,driver<526 brand=nvidiartx,driver>=525,driver<526 brand=geforce,driver>=525,driver<526 brand=geforcertx,driver>=525,driver<526 brand=quadro,driver>=525,driver<526 brand=quadrortx,driver>=525,driver<526 brand=titan,driver>=525,driver<526 brand=titanrtx,driver>=525,driver<526
NV_CUDA_CUDART_VERSION=12.1.55-1
NV_CUDA_COMPAT_PACKAGE=cuda-compat-12-1
CUDA_VERSION=12.1.0
LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
NVIDIA_VISIBLE_DEVICES=all
NVIDIA_DRIVER_CAPABILITIES=compute,utility
NV_CUDA_LIB_VERSION=12.1.0-1
NV_NVTX_VERSION=12.1.66-1
NV_LIBNPP_VERSION=12.0.2.50-1
NV_LIBNPP_PACKAGE=libnpp-12-1=12.0.2.50-1
NV_LIBCUSPARSE_VERSION=12.0.2.55-1
NV_LIBCUBLAS_PACKAGE_NAME=libcublas-12-1
NV_LIBCUBLAS_VERSION=12.1.0.26-1
NV_LIBCUBLAS_PACKAGE=libcublas-12-1=12.1.0.26-1
NV_LIBNCCL_PACKAGE_NAME=libnccl2
NV_LIBNCCL_PACKAGE_VERSION=2.17.1-1
NCCL_VERSION=2.17.1-1
NV_LIBNCCL_PACKAGE=libnccl2=2.17.1-1+cuda12.1
NVIDIA_PRODUCT_NAME=CUDA
NVIDIA_CUDA_END_OF_LIFE=1
NV_CUDA_CUDART_DEV_VERSION=12.1.55-1
NV_NVML_DEV_VERSION=12.1.55-1
NV_LIBCUSPARSE_DEV_VERSION=12.0.2.55-1
NV_LIBNPP_DEV_VERSION=12.0.2.50-1
NV_LIBNPP_DEV_PACKAGE=libnpp-dev-12-1=12.0.2.50-1
NV_LIBCUBLAS_DEV_VERSION=12.1.0.26-1
NV_LIBCUBLAS_DEV_PACKAGE_NAME=libcublas-dev-12-1
NV_LIBCUBLAS_DEV_PACKAGE=libcublas-dev-12-1=12.1.0.26-1
NV_CUDA_NSIGHT_COMPUTE_VERSION=12.1.0-1
NV_CUDA_NSIGHT_COMPUTE_DEV_PACKAGE=cuda-nsight-compute-12-1=12.1.0-1
NV_NVPROF_VERSION=12.1.55-1
NV_NVPROF_DEV_PACKAGE=cuda-nvprof-12-1=12.1.55-1
NV_LIBNCCL_DEV_PACKAGE_NAME=libnccl-dev
NV_LIBNCCL_DEV_PACKAGE_VERSION=2.17.1-1
NV_LIBNCCL_DEV_PACKAGE=libnccl-dev=2.17.1-1+cuda12.1
LIBRARY_PATH=/usr/local/cuda/lib64/stubs
DEBIAN_FRONTEND=noninteractive
VLLM_USAGE_SOURCE=production-docker-image
  1. 创建并启动容器。
2.4.3 查看已安的模型
bash 复制代码
curl http://127.0.0.1:8800/v1/models

默认安装了facebook/opt-125m 模型

2.4.4 验证 vLLM
bash 复制代码
curl http://127.0.0.1:8800/v1/completions \
-H "Content-Type:application/json" \
-d '{
    "model":"facebook/opt-125m",
    "prompt":"用中文介绍中国",
    "max_tokens":100,
    "temperature":0.7
}'

返回结果如下图

本次针对目标模型开展多轮重复性调用测试,过程中发现模型输出的回答内容逻辑表述略显怪异,部分语句语序、表达逻辑不符合常规应答范式。经过反复核查确认,该异常仅体现在文本表述层面,模型能够稳定接收输入指令、完整执行运算逻辑,且可正常输出预期结果,并未出现接口调用失败、无返回数据、计算偏差、程序崩溃等会干扰验证流程的关键性问题。

本次测试核心目标仅为验证模型能否正常运行并给出有效输出,而非校验回答语言流畅度与表述规范性。综合所有测试样本判定,本次验证各项核心指标达标,测试流程顺利完成,可认定模型验证工作成功通过。

三, MCP 容器化部署

使用网络 1panel-network,容器间用容器名 DNS 互通,杜绝 127.0.0.1(127.0.0.1) 连通性问题。

容器名 容器内访问地址 宿主机端口映射 GPU
nacos nacos:8848 8848:8848、9848:9848 不需要
ollama ollama:11434/v1 11434:11434 挂载 NVIDIA GPU
vllm vllm:8000/v1 8000:8000 挂载 NVIDIA GPU
mcp-ollama 内部 8200 8200:8200 不需要
mcp-vllm 内部 8100 8100:8100 不需要

3.1、MCP 生成容器准备

  1. 创建网关目录结构
Plain 复制代码
ai-stack/
├── docker-compose.yml
├── mcp-ollama/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── main.py
└── mcp-vllm/
    ├── Dockerfile
    ├── requirements.txt
    └── main.py
  1. Dockerfile(两个 MCP 目录完全一致)
dockerfile 复制代码
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py .
EXPOSE 8200
# 保留原启动方式,增加PYTHONUNBUFFERED保证日志实时输出
ENV PYTHONUNBUFFERED=1
CMD ["python", "main.py"]
  1. requirements.txt (两个 MCP 目录完全一致)
txt 复制代码
mcp[sse]
starlette
uvicorn
openai
pydantic>=2.0
nacos-mcp-wrapper-python
  1. mcp-ollama/main.py(容器 DNS 地址适配 3.2.2)
python 复制代码
from nacos_mcp_wrapper.server.nacos_mcp import NacosMCP
from nacos_mcp_wrapper.server.nacos_settings import NacosSettings
from openai import OpenAI
from openai import APIError
from pydantic import BaseModel

# Nacos连接配置
nacos_settings = NacosSettings()
nacos_settings.SERVER_ADDR = "1Panel-nacos-mcp-standalone:8848"
nacos_settings.NAMESPACE = "public"
nacos_settings.USERNAME = "nacos"
nacos_settings.PASSWORD = "nacos"

SERVICE_NAME = "ollama-mcp-nacos322"

# Ollama客户端
ollama_client = OpenAI(
    base_url="http://1Panel-ollama-mcp:11434/v1",
    api_key="dummy",
    timeout=120.0
)

class ChatReq(BaseModel):
    prompt: str
    model: str = "qwen3:4b"

# MCP实例
mcp = NacosMCP(SERVICE_NAME, nacos_settings=nacos_settings)

# 注册工具
@mcp.tool()
async def llm_chat(req: ChatReq) -> str:
    """调用Ollama大模型对话"""
    try:
        resp = ollama_client.chat.completions.create(
            model=req.model,
            messages=[{"role": "user", "content": req.prompt}]
        )
        return resp.choices[0].message.content.strip()
    except APIError as e:
        return f"Ollama调用异常:{str(e)}"
    except Exception as e:
        return f"异常:{str(e)}"

# 【核心】原生启动SSE,内部自动注册Nacos MCP Registry,无需传host/port
if __name__ == "__main__":
    # 官方标准调用,transport指定sse,内置uvicorn托管
    mcp.run(transport="sse")
  1. mcp-vllm/main.py
python 复制代码
from nacos_mcp_wrapper.server.nacos_mcp import NacosMCP
from nacos_mcp_wrapper.server.nacos_settings import NacosSettings
from openai import OpenAI
from openai import APIError
from pydantic import BaseModel

# Nacos连接配置
nacos_settings = NacosSettings()
nacos_settings.SERVER_ADDR = "1Panel-nacos-mcp-standalone:8848"
nacos_settings.NAMESPACE = "public"
nacos_settings.USERNAME = "nacos"
nacos_settings.PASSWORD = "nacos"

SERVICE_NAME = "vllm-mcp-nacos322"

# vLLM客户端
vllm_client = OpenAI(
    base_url="http://1Panel-vllm-ZH2n:8800/v1",
    api_key="sk-vllm-nacos-322",
    timeout=120.0
)

class ChatReq(BaseModel):
    prompt: str
    model: str = "Qwen3-4B"

# MCP实例
mcp = NacosMCP(SERVICE_NAME, nacos_settings=nacos_settings)

# 注册工具
@mcp.tool()
async def llm_chat(req: ChatReq) -> str:
    """调用vLLM大模型对话"""
    try:
        resp = vllm_client.chat.completions.create(
            model=req.model,
            messages=[{"role": "user", "content": req.prompt}]
        )
        return resp.choices[0].message.content.strip()
    except APIError as e:
        return f"vLLM调用异常:{str(e)}"
    except Exception as e:
        return f"异常:{str(e)}"

# 原生SSE启动,内部自动注册Nacos、维持心跳
if __name__ == "__main__":
    mcp.run(transport="sse")

3.2、生成容器部署运行

yml 复制代码
services:
  # ========== MCP网关:封装Ollama自动注册Nacos3.2.2 ==========
  mcp-ollama:
    build: ./mcp-ollama
    container_name: mcp-ollama
    restart: always
    networks:
      - 1panel-network
    ports:
      - "8200:8200"
    environment:
      NACOS_SERVER_ADDR: "1Panel-nacos-mcp-standalone:8848"
      NACOS_NAMESPACE: "public"
      NACOS_USERNAME: "nacos"
      NACOS_PASSWORD: "nacos"


  # ========== MCP网关:封装vLLM自动注册Nacos3.2.2 ==========
  mcp-vllm:
    build: ./mcp-vllm
    container_name: mcp-vllm
    restart: always
    networks:
      - 1panel-network
    ports:
      - "8100:8100"
    environment:
      NACOS_SERVER_ADDR: "1Panel-nacos-mcp-standalone:8848"
      NACOS_NAMESPACE: "public"
      NACOS_USERNAME: "nacos"
      NACOS_PASSWORD: "nacos"


# 顶层声明:这是外部已存在网络,compose不会自动创建
networks:
  1panel-network:
    external: true

3.3、部署执行步骤

bash 复制代码
# yml所在目录下执行 

# 构建 & 启动容器
 docker compose up -d

# 重新构建 & 重启容器 mcp-ollama
docker compose build mcp-ollama
docker compose up -d mcp-ollama

# 重新构建 & 重启容器  ollame
docker compose build mcp-vllm
docker compose up -d mcp-vllm
 
# ollama mcp注册日志
docker logs mcp-ollama -f
# vllm mcp注册日志
docker logs mcp-vllm -f

最后看到如下结果即成功

3.4、完整 docker-compose.yml(Nacos3.2.2 专用)

结合前面章节给出Nacos 3.2.2 完整 Docker Compose 全套部署方案,Nacos/Ollama/vLLM/MCP 网关全部容器化同网桥互通,适配 3.2.2 鉴权规则、MCP Registry 原生兼容,修正 3.2.x 专属配置差异,根据自己机器配置稍作调整即可部署 。

yaml 复制代码
version: "3.8"

# 统一网桥,所有容器互通
networks:
  ai-nacos-net:
    driver: bridge

volumes:
  nacos-data:
  ollama-models:
  vllm-cache:

services:
  # ========== Nacos 3.2.2 单机独立部署 ==========
  nacos:
    image: nacos/nacos-server:v3.2.2
    container_name: nacos
    restart: always
    ports:
      - "8081:8080"
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    environment:
      MODE: standalone
      # 关闭内置本地数据库(关键!解决 jdbc.properties 加载异常)
      EMBEDDED_STORAGE: false
      SPRING_DATASOURCE_PLATFORM: postgresql

      # 核心:通用数据库环境变量(Nacos 强制识别这套)
      DB_NUM: 1
      DB_URL_0: jdbc:postgresql://10.10.13.68:15432/nacos_config?useSSL=false&serverTimezone=Asia/Shanghai
      DB_USER_0: postgis
      DB_PASSWORD_0: postgis
      DB_POOL_CONFIG_DRIVERCLASSNAME: org.postgresql.Driver

      #MYSQL_SERVICE_HOST: 10.10.13.68
      #MYSQL_SERVICE_PORT: 13306
      #MYSQL_SERVICE_DB_NAME: nacos_config
      #MYSQL_SERVICE_USER: root
      #MYSQL_SERVICE_PASSWORD: root


      # 认证配置
      NACOS_AUTH_TOKEN: mUqzrAIYOfsVNwFysx4cZOutpv7TSTBogUpBvSAbja0=
      NACOS_AUTH_IDENTITY_KEY: serverIdentity
      NACOS_AUTH_IDENTITY_VALUE: security
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/data:/home/nacos/data
      # - ./nacos/conf:/home/nacos/conf

    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8848/nacos/actuator/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  # ========== Ollama 容器 ==========
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: always
    networks:
      - ai-nacos-net
    ports:
      - "11434:11434"
    volumes:
      - ollama-models:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

  # ========== vLLM OpenAI兼容服务 ==========
  vllm:
    image: vllm/vllm-openai:latest
    container_name: vllm
    restart: always
    networks:
      - ai-nacos-net
    ports:
      - "8000:8000"
    volumes:
      - vllm-cache:/root/.cache/huggingface
    command: >
      --model Qwen3-4B
      --host 0.0.0.0
      --port 8000
      --api-key sk-vllm-nacos-322
      --tensor-parallel-size 1
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

  # ========== MCP网关:封装Ollama自动注册Nacos3.2.2 ==========
  mcp-ollama:
    build: ./mcp-ollama
    container_name: mcp-ollama
    restart: always
    networks:
      - ai-nacos-net
    ports:
      - "8200:8200"
    depends_on:
      nacos:
        condition: service_healthy
      ollama:
        condition: service_started

  # ========== MCP网关:封装vLLM自动注册Nacos3.2.2 ==========
  mcp-vllm:
    build: ./mcp-vllm
    container_name: mcp-vllm
    restart: always
    networks:
      - ai-nacos-net
    ports:
      - "8100:8100"
    depends_on:
      nacos:
        condition: service_healthy
      vllm:
        condition: service_started

3.5、一键部署执行步骤

启动整套服务

bash 复制代码
cd ai-stack
docker compose up -d

compose 会等待 nacos 健康检测通过后,再启动两个 MCP 服务,避免注册过早失败。

查看 MCP 注册日志

bash 复制代码
# ollama mcp注册日志
docker logs mcp-ollama -f
# vllm mcp注册日志
docker logs mcp-vllm -f

出现 Register MCP Server to Nacos success 代表注册成功。

3.6、Nacos3.2.2 控制台验证

  1. 访问:http://宿主机IP:8848/nacos

  2. 账号密码:nacos / nacos

  3. 左侧菜单:AI 管理中心 → MCP 管理 → MCP 服务列表

  4. 列表中可见两个 MCP 服务实例,健康状态正常,实例地址为容器内网 SSE 地址,Nacos 自动健康探测。

3.7、 专属排坑点(必看)

坑 1:MCP 注册 401 鉴权失败

原因:3.2.2 强制校验NACOS_AUTH_IDENTITY_KEY/VALUE,不能省略;旧版 compose 少这两个变量会直接拒绝注册。

修复:compose 里完整复制全套鉴权 5 个环境变量。

坑 2:MCP 服务启动后连不上 nacos:8848
  1. 确认所有容器都在同一个ai-nacos-net网桥

  2. MCP 代码内地址绝对不能写 127.0.0.1(127.0.0.1) / 宿主机 IP ,必须写容器名nacos:8848

  3. 测试连通性:docker exec -it mcp-vllm ping nacos

坑 3:3.0 旧 MCP 数据升级到 3.2.2 控制台看不到服务

3.0.0 升级 3.2.2 存在 MCP 元数据结构变更,执行官方迁移工具:

bash 复制代码
java -jar mcp-migration-tool.jar 宿主机IP:8848 nacos nacos

新部署(全新 volume)无需迁移,直接使用。

坑 4:SSE 外部无法访问

MCP 启动代码固定 host="0.0.0.0",不要用 127.0.0.1(127.0.0.1);宿主机防火墙放行 8100、8200 端口。

3.8、客户端调用(3.2.2 通用)

  1. 直连 SSE 地址

Ollama MCP:http://宿主机IP:8200/mcp/messages

vLLM MCP:http://宿主机IP:8100/mcp/messages

  1. Nacos MCP Router 统一接入(推荐生产)

客户端仅配置 Nacos3.2.2 地址,自动服务发现 + 负载均衡,无需硬编码 LLM 地址。

3.9、扩容 MCP 多实例

相同服务名多启动实例,Nacos3.2.2 自动多实例负载均衡:

bash 复制代码
docker compose up -d --scale mcp-vllm=2

四、1Panel 日常运维操作

4.1 查看容器状态

1Panel → 容器 → 容器管理,查看所有容器状态为 运行中

4.2 查看日志(排错)

点击对应容器右侧 日志 ,实时查看运行日志,排查启动报错、接口异常。

4.3 进入容器终端

容器右侧 终端 ,直接进入容器内部执行命令。

4.4 重启 / 停止容器

选中容器,点击重启、停止、删除,可视化操作,无需命令行。

4.5 端口 / 防火墙管理

1Panel → 安全 → 防火墙,放行 8848、9848、11434、8000、8081、8082


六、常见问题排查(1Panel 专属)

问题 1:容器启动后立即退出

  1. 查看容器日志,检查启动命令、依赖包、代码语法错误;

  2. 检查挂载目录权限:chmod 755 /soft/ai-mcp-stack/mcp

  3. 确认 ai-mcp-net 网络和固定 IP 无冲突。

问题 2:容器之间无法互通

  1. 确认所有容器都加入 ai-mcp-net 网桥;

  2. 检查代码内容器内网 IP(172.20.0.11/12)与实际一致;

  3. 关闭宿主机防火墙测试连通性。

问题 3:vLLM 容器启动失败、GPU 识别异常

  1. 确认 1Panel 容器配置已开启 GPU

  2. 重装 nvidia-docker2 并重启 Docker;

  3. 调低显存利用率:--gpu-memory-utilization 0.7

问题 4:Nacos 无法收到 MCP 服务注册

  1. 检查 8848 端口放行;

  2. 确认 Nacos 后台已开启 MCP Registry;

  3. 重新执行 curl 注册命令。

问题 5:代码修改后不生效

MCP 代码挂载在本地目录,重启 mcp-main 容器 即可加载新代码。


六、拓展:搭配 OpenWebUI(前端界面)

如需网页聊天界面,直接在 1Panel 新建 OpenWebUI 容器:

  1. 镜像:ghcr.io/open-webui/open-webui:main

  2. 端口映射:3030:3000

  3. 网络:加入 ai-mcp-net

  4. 启动后访问 http://IP:3030,后台配置 Ollama /vLLM 地址,即可可视化使用模型。

七、总结

本教程详细介绍了在 1Panel 环境下部署 Nacos + Ollama + vLLM + MCP 的完整技术栈,为构建企业级 AI 应用提供了完整的容器化解决方案。

核心部署架构:整个系统以 Nacos 3.2.2 作为服务注册与发现中心,Ollama 提供轻量级模型推理服务,vLLM 为 GPU 环境提供高性能推理加速,MCP(Model Control Plane)作为模型控制平面统一管理模型服务。所有组件均通过 Docker 容器化部署,确保环境一致性和可移植性。

部署流程要点

  1. 前期准备:重点规划了固定网络与端口,创建自定义 Docker 网桥(如 1panel-network),确保容器间网络互通且端口不冲突。
  2. 分步部署
    • Nacos 部署提供了 1Panel 可视化与命令行两种方式,详细说明了单机快速部署、持久化配置及外置数据库配置。
    • Ollama 部署注重轻量推理,包含模型下载与验证步骤。
    • vLLM 部署针对 GPU 环境,提供了完整的 CUDA 环境检查与部署流程。
    • MCP 容器化部署是核心,提供了完整的 docker-compose.yml 配置及一键部署脚本。

关键运维与排错

  • 1Panel 提供了便捷的容器状态查看、日志监控、终端访问等运维功能。
  • 针对常见问题如容器启动失败、网络不通、Nacos 服务注册失败、GPU 识别异常等提供了详细的排查方案。
  • 特别强调了 MCP 部署中的专属坑点,如 401 鉴权失败、Nacos 连接问题、SSE 外部访问等。

技术价值:本方案将 AI 模型服务标准化、容器化,通过 Nacos 实现服务治理,MCP 统一模型管理,形成了可扩展、易维护的生产级 AI 服务架构。无论是开发测试还是生产环境,都能快速搭建起稳定可靠的 AI 推理平台。

后续拓展:可搭配 OpenWebUI 等前端界面,为用户提供更友好的交互体验,进一步完善 AI 应用生态。

后续我会完整梳理一套详尽落地应用案例,感兴趣的朋友可以持续关注更新。

相关推荐
weixin_307779131 小时前
从工具到协作者:AI在后端研发中的流程重构与组织赋能
人工智能·后端·python·算法·自动化
AI帮小忙1 小时前
CTF WEB 解题技能
python
科芯创展1 小时前
30VIN,0.15A,0.8uA低功耗,稳压LDO,XZ6328
python
装不满的克莱因瓶1 小时前
循环神经网络及LSTM——从序列建模到长期依赖记忆机制
人工智能·pytorch·python·rnn·深度学习·神经网络·lstm
叫我:松哥1 小时前
基于神经网络的汽车与自行车的分类算法设计与实现,采用ResNet50和迁移学习,准确率达到99%
人工智能·python·神经网络·机器学习·分类·汽车·迁移学习
靖待1 小时前
【解决方法】python写Excel单元格截断长文本
python·excel·解决方法
우리帅杰2 小时前
【AI测试】Python AI大模型介绍
开发语言·人工智能·python·ai编程
li-xun2 小时前
我给自己的 Django 博客做了一个在线工具箱:从图片压缩到正则测试,尽量都在浏览器本地处理
后端·python·django
geovindu2 小时前
python: Generators Pattern
开发语言·python·设计模式·生成器模式