文章目录
- [部署 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 双环境,兼容之前的架构。
前置说明
系统:Ubuntu 20.04/22.04、CentOS 7/8,已安装 1Panel 最新版
GPU 环境:已安装 NVIDIA 驱动、
nvidia-docker2,nvidia-smi可正常执行(解决上一轮报错)网络:服务器防火墙 / 安全组放行端口
8848、9848、11434、8000、8081、8082镜像源:已配置 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自定网桥)
-
打开 1Panel 后台 → 容器 → 网络
-
点击 创建网络
-
网络名称:
ai-mcp-net -
驱动:
bridge -
子网:
172.20.0.0/16 -
网关:
172.20.0.1
-
-
点击确认,网络创建完成。

1.4 Docker 自定义网桥(自定义 bridge)好处
和默认 bridge 网桥对比,核心优势如下:
-
DNS 自动解析
同一自定义网桥内,容器名直接互通 ,不用记 IP。
例:容器 A
ping 容器B名称可通,默认 bridge 做不到。 -
天然网络隔离
不同自定义网桥的容器默认互相隔离,只同网内互通,更安全。
-
可自定义网段、网关、子网
能手动指定 IP 段,避免和宿主机 / 其他服务网段冲突,方便固定容器 IP。
-
更好的网络性能 & 转发
默认 bridge 是
iptables转发,自定义 bridge 转发效率更高,适合多容器集群。 -
支持容器动态插拔
运行中的容器可随时接入 / 脱离网桥,灵活组合网络拓扑。
-
日志 / 监控区分
按业务划分网桥,便于网络排障、流量统计。
二、分步创建容器(1Panel 可视化操作+命令行操作)
2.1 1Panel 部署 Nacos(MCP 注册中心)
-
1Panel → 容器 → 容器管理 → 创建容器
-
基础配置:
-
容器名称:
nacos -
镜像名称:
nacos/nacos-server:v3.2.2 -
重启策略:总是重启
-
-
端口映射
宿主机端口 容器端口 协议 8848 8848 TCP 9848 9848 TCP -
数据卷(持久化)
-
卷类型:本地卷
-
本地目录:
/opt/1panel/volumes/nacos-data -
容器目录:
/home/nacos/data
-
-
网络配置
-
网络:选择刚才创建的
1panel-network -
IPv4 地址:手动填写
172.21.0.5这里是前面规划好的ip
-
-
环境变量
Key Value MODE standalone NACOS_AUTH_ENABLE true NACOS_CORE_AUTH_USERNAME nacos NACOS_CORE_AUTH_PASSWORD nacos -
其他选项默认,点击 创建并启动。

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


使用命令行的朋友继续看,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、访问账号密码
- 访问地址
Plain
http://服务器IP:8848/nacos
- 默认账号密码
-
用户名:
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、常见问题解决
-
启动后访问不了
-
检查服务器防火墙 / 安全组,放行 8848、9848、9849 端口
-
确认
MODE=standalone已配置,单机不加该参数必启动失败
-
-
之前提示 no container to start
先执行
docker rm -f nacos删除旧容器,再重新执行上面启动命令即可。 -
外置数据库部署(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 轻量推理服务
-
新建容器
-
容器名称:
ollama-mcp -
镜像:
ollama/ollama:latest -
重启策略:总是重启
-
-
端口映射
- 宿主机:
11434→ 容器:11434TCP
- 宿主机:
-
数据卷
-
本地目录:
/opt/1panel/volumes/ollama-data -
容器目录:
/root/.ollama
-
-
网络配置
-
网络:
1panel-network -
固定 IP:
172.21.0.3
-
-
启动命令(Command)
切换到「高级选项」→ 启动命令填入:
bashsh -c "ollama serve && sleep 10 && ollama pull qwen3:4b && wait"

- 点击 创建并启动 。
另外一种方式是应用商店安装,新手也无压力,习惯图形界面的小伙伴尽管冲😉


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
-
新建容器
-
容器名称:
vllm-mcp -
镜像:
vllm/vllm-openai:v0.7.3注意,注意,注意:这里一定要下载自己显卡CUDA Version: 12.6 对应的版本否则安装失败 -
重启策略:总是重启
-
-
端口映射
- 宿主机:
8000→ 容器:8000TCP
- 宿主机:
-
网络配置
-
网络:
1panel-networkt -
固定 IP:
172.21.0.6
-
-
GPU 配置(关键)
高级选项 → 勾选 启用 GPU → 选择「全部显卡」
-
启动命令
bash--model facebook/opt-125m -
环境变量(可选):
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
- 创建并启动容器。
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 生成容器准备
- 创建网关目录结构
Plain
ai-stack/
├── docker-compose.yml
├── mcp-ollama/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── main.py
└── mcp-vllm/
├── Dockerfile
├── requirements.txt
└── main.py
- 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"]
- requirements.txt (两个 MCP 目录完全一致)
txt
mcp[sse]
starlette
uvicorn
openai
pydantic>=2.0
nacos-mcp-wrapper-python
- 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")
- 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 控制台验证
-
访问:
http://宿主机IP:8848/nacos -
账号密码:
nacos / nacos -
左侧菜单:AI 管理中心 → MCP 管理 → MCP 服务列表
-
列表中可见两个 MCP 服务实例,健康状态正常,实例地址为容器内网 SSE 地址,Nacos 自动健康探测。
3.7、 专属排坑点(必看)
坑 1:MCP 注册 401 鉴权失败
原因:3.2.2 强制校验NACOS_AUTH_IDENTITY_KEY/VALUE,不能省略;旧版 compose 少这两个变量会直接拒绝注册。
修复:compose 里完整复制全套鉴权 5 个环境变量。
坑 2:MCP 服务启动后连不上 nacos:8848
-
确认所有容器都在同一个
ai-nacos-net网桥 -
MCP 代码内地址绝对不能写 127.0.0.1(127.0.0.1) / 宿主机 IP ,必须写容器名
nacos:8848 -
测试连通性:
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 通用)
- 直连 SSE 地址
Ollama MCP:http://宿主机IP:8200/mcp/messages
vLLM MCP:http://宿主机IP:8100/mcp/messages
- 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:容器启动后立即退出
-
查看容器日志,检查启动命令、依赖包、代码语法错误;
-
检查挂载目录权限:
chmod 755 /soft/ai-mcp-stack/mcp; -
确认
ai-mcp-net网络和固定 IP 无冲突。
问题 2:容器之间无法互通
-
确认所有容器都加入
ai-mcp-net网桥; -
检查代码内容器内网 IP(
172.20.0.11/12)与实际一致; -
关闭宿主机防火墙测试连通性。
问题 3:vLLM 容器启动失败、GPU 识别异常
-
确认 1Panel 容器配置已开启 GPU;
-
重装
nvidia-docker2并重启 Docker; -
调低显存利用率:
--gpu-memory-utilization 0.7。
问题 4:Nacos 无法收到 MCP 服务注册
-
检查 8848 端口放行;
-
确认 Nacos 后台已开启 MCP Registry;
-
重新执行 curl 注册命令。
问题 5:代码修改后不生效
MCP 代码挂载在本地目录,重启 mcp-main 容器 即可加载新代码。
六、拓展:搭配 OpenWebUI(前端界面)
如需网页聊天界面,直接在 1Panel 新建 OpenWebUI 容器:
-
镜像:
ghcr.io/open-webui/open-webui:main -
端口映射:
3030:3000 -
网络:加入
ai-mcp-net -
启动后访问
http://IP:3030,后台配置 Ollama /vLLM 地址,即可可视化使用模型。
七、总结
本教程详细介绍了在 1Panel 环境下部署 Nacos + Ollama + vLLM + MCP 的完整技术栈,为构建企业级 AI 应用提供了完整的容器化解决方案。
核心部署架构:整个系统以 Nacos 3.2.2 作为服务注册与发现中心,Ollama 提供轻量级模型推理服务,vLLM 为 GPU 环境提供高性能推理加速,MCP(Model Control Plane)作为模型控制平面统一管理模型服务。所有组件均通过 Docker 容器化部署,确保环境一致性和可移植性。
部署流程要点:
- 前期准备:重点规划了固定网络与端口,创建自定义 Docker 网桥(如 1panel-network),确保容器间网络互通且端口不冲突。
- 分步部署 :
- Nacos 部署提供了 1Panel 可视化与命令行两种方式,详细说明了单机快速部署、持久化配置及外置数据库配置。
- Ollama 部署注重轻量推理,包含模型下载与验证步骤。
- vLLM 部署针对 GPU 环境,提供了完整的 CUDA 环境检查与部署流程。
- MCP 容器化部署是核心,提供了完整的 docker-compose.yml 配置及一键部署脚本。
关键运维与排错:
- 1Panel 提供了便捷的容器状态查看、日志监控、终端访问等运维功能。
- 针对常见问题如容器启动失败、网络不通、Nacos 服务注册失败、GPU 识别异常等提供了详细的排查方案。
- 特别强调了 MCP 部署中的专属坑点,如 401 鉴权失败、Nacos 连接问题、SSE 外部访问等。
技术价值:本方案将 AI 模型服务标准化、容器化,通过 Nacos 实现服务治理,MCP 统一模型管理,形成了可扩展、易维护的生产级 AI 服务架构。无论是开发测试还是生产环境,都能快速搭建起稳定可靠的 AI 推理平台。
后续拓展:可搭配 OpenWebUI 等前端界面,为用户提供更友好的交互体验,进一步完善 AI 应用生态。
后续我会完整梳理一套详尽落地应用案例,感兴趣的朋友可以持续关注更新。