1. 为什么要在 1Panel 里把 Nacos、Ollama、vLLM、MCP 凑成一套

如果你手上有一台带显卡的服务器,想跑一套能自己掌控的 AI 服务,大概率会经历这样的过程:先装个 Ollama 试试本地模型,觉得不错;再想上 vLLM 提升吞吐,结果发现端口、网络、模型路径全要重新理;等模型多了,又想让 Cline、CC Switch 这类编码工具统一调用,于是开始折腾 MCP 和注册中心。最后服务是跑起来了,但容器之间互相 ping 不通、Nacos 收不到注册、vLLM 认不到 GPU,排错排到怀疑人生。

这篇教程就是把这条链路一次讲清楚:用 1Panel 面板做可视化管理,同时给出命令行方式,把 Nacos 3.2.2 作为注册配置中心、Ollama 作为轻量推理、vLLM 作为 GPU 高性能推理、MCP 作为工具链网关全部容器化,并且通过 TaoToken 的统一 Key 和 API 通道,让 Cline、CC Switch 这类客户端只配一个地址就能调用多个模型。适合已经装好 1Panel、想搭私有 AI 服务栈的运维和开发者,也适合刚接触容器编排、想跟着敲一遍的新手。

整套架构的核心思路是:所有容器接入同一个自定义网桥,用容器名做 DNS 互相访问,Nacos 负责服务注册与发现,MCP 网关把 Ollama 和 vLLM 包装成标准 MCP 服务注册进 Nacos,客户端通过 Nacos 或直连 SSE 地址调用。下面按「前置准备 → 逐个部署 → 验证 → 排错」的顺序展开,命令和配置都可以直接复制。

2. TaoToken 前置:统一 Key 与 API 通道怎么接

在开始部署容器之前,先把 TaoToken 这一层理清楚,不然后面客户端配置会乱。TaoToken 的作用是提供一个统一的 API 入口和 Key 管理,你不需要在 Cline、CC Switch、OpenWebUI 里分别填 Ollama、vLLM、云端模型的地址,而是通过一个兼容 OpenAI 协议的通道统一调用。

官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基础地址是 https://taotoken.net/api ,注意 API 地址后面不加 UTM 参数。你需要先去控制台创建一个 API Key,控制台入口在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。

拿到 Key 之后,客户端里填的 base_url 就是 https://taotoken.net/api,api_key 填你创建的那串。如果你只是想先验证模型能不能通,可以直接用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 试一下,不用写代码。如果你打算长期用编码工具或 Agent,建议看一下 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它针对高频编码场景做了额度优化。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到协议细节可以查。

这里要强调一点:TaoToken 是作为统一的 API 通道来用的,不是替代你的编辑器或推理服务。Ollama 和 vLLM 仍然跑在你自己的服务器上,TaoToken 负责的是客户端到模型之间的统一接入层。这样你在 Cline 里切换本地模型和云端模型时,只需要改一个 model 名字,不用改 base_url。

3. 前置准备:网络规划与基础校验

3.1 基础环境校验

登录服务器终端,先确认三件事:Docker 可用、GPU 可识别(如果有显卡)、1Panel 服务正常。

# 检查 Docker 版本
docker --version

# 检查 1Panel 服务状态
systemctl status 1panel

# GPU 环境校验(无显卡跳过)
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

第三条命令如果报错,说明 nvidia-docker2 没装好或者驱动版本不匹配。注意看 nvidia-smi 输出右上角的 CUDA Version,后面选 vLLM 镜像版本要以它为准。比如显示 CUDA Version: 12.6,就选支持 12.6 的 vLLM 镜像,选错了容器会直接退出。

3.2 规划固定网络与端口

先看当前 Docker 网络情况:

# 列出所有网络
docker network ls

# 查看某个网络的详细信息,包括网段和已用 IP
docker network inspect 1panel-network

1Panel 默认会创建一个 1panel-network,网段通常是 172.21.0.0/16。我们沿用这个网桥,给每个容器分配固定 IP,保证重启后地址不变。规划如下:

服务名称容器内网 IP宿主机端口备注
Nacos172.21.0.58848/9848注册配置中心
Ollama172.21.0.311434轻量推理
vLLM172.21.0.68000GPU 高性能推理
MCP-Ollama172.21.0.88200Ollama 的 MCP 网关
MCP-vLLM172.21.0.98100vLLM 的 MCP 网关

如果你不想用 1panel-network,也可以在 1Panel 后台「容器 → 网络」里新建一个,比如叫 ai-mcp-net,子网 172.20.0.0/16,网关 172.20.0.1。自定义网桥的好处是容器名可以直接当域名用,不用记 IP,而且不同网桥之间天然隔离,比默认 bridge 安全。

4. 可复制配置:逐个部署四个核心服务

4.1 部署 Nacos 3.2.2(注册配置中心)

Nacos 是整个栈的服务注册中心,MCP 网关启动后会把自己的 SSE 地址注册进来,客户端通过 Nacos 做服务发现。

1Panel 面板方式:进入「容器 → 容器管理 → 创建容器」,基础配置填容器名 nacos,镜像 nacos/nacos-server:v3.2.2,重启策略选「总是重启」。端口映射加 8848→8848 和 9848→9848。数据卷把本地目录 /opt/1panel/volumes/nacos-data 挂到容器 /home/nacos/data。网络选 1panel-network,IPv4 地址填 172.21.0.5。环境变量加 MODE=standalone、NACOS_AUTH_ENABLE=true、NACOS_CORE_AUTH_USERNAME=nacos、NACOS_CORE_AUTH_PASSWORD=nacos。点创建并启动。

命令行方式:如果你习惯敲命令,用 docker run 带持久化启动:

mkdir -p /data/nacos/{logs,data,conf}

docker run -d \
  --name nacos \
  --restart always \
  --network 1panel-network \
  --ip 172.21.0.5 \
  -p 8848:8848 \
  -p 9848:9848 \
  -p 9849:9849 \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=true \
  -e NACOS_CORE_AUTH_USERNAME=nacos \
  -e NACOS_CORE_AUTH_PASSWORD=nacos \
  -v /data/nacos/logs:/home/nacos/logs \
  -v /data/nacos/data:/home/nacos/data \
  nacos/nacos-server:v3.2.2

启动后访问 http://服务器IP:8848/nacos,账号密码都是 nacos。登录后进入「AI 管理中心 → MCP 管理」,把「启用 MCP Registry」打开,这一步很关键,不开的话 MCP 服务注册不进来。

4.2 部署 Ollama(轻量推理)

Ollama 用来跑小参数模型,适合快速验证和低并发场景。

1Panel 面板方式:创建容器,名称 ollama-mcp,镜像 ollama/ollama:latest,重启策略「总是重启」。端口 11434→11434。数据卷本地目录 /opt/1panel/volumes/ollama-data 挂到 /root/.ollama。网络选 1panel-network,IP 填 172.21.0.3。在「高级选项 → 启动命令」里填:

sh -c "ollama serve && sleep 10 && ollama pull qwen3:4b && wait"

这样容器启动后会自动拉取 qwen3:4b 模型。如果你不想自动拉,把 pull 那段去掉,启动后手动进容器拉。

命令行方式:

docker run -d \
  --name ollama-mcp \
  --restart always \
  --network 1panel-network \
  --ip 172.21.0.3 \
  -p 11434:11434 \
  -v /opt/1panel/volumes/ollama-data:/root/.ollama \
  ollama/ollama:latest

启动后手动拉模型:

docker exec -it ollama-mcp ollama pull qwen3:4b
docker exec -it ollama-mcp ollama list

4.3 部署 vLLM(GPU 高性能推理)

vLLM 只在有 NVIDIA 显卡时部署,它的吞吐比 Ollama 高很多,适合生产环境。镜像版本一定要和你的 CUDA 版本匹配,前面 nvidia-smi 看到的是 12.6,就选支持 12.6 的镜像。

1Panel 面板方式:创建容器,名称 vllm-mcp,镜像 vllm/vllm-openai:v0.7.3(按你的 CUDA 版本调整)。端口 8000→8000。网络 1panel-network,IP 172.21.0.6。在「高级选项」里勾选「启用 GPU」,选「全部显卡」。启动命令填:

--model Qwen3-4B --host 0.0.0.0 --port 8000 --api-key sk-vllm-nacos-322

命令行方式:

docker run -d \
  --name vllm-mcp \
  --restart always \
  --network 1panel-network \
  --ip 172.21.0.6 \
  -p 8000:8000 \
  --gpus all \
  -v /opt/1panel/volumes/vllm-cache:/root/.cache/huggingface \
  vllm/vllm-openai:v0.7.3 \
  --model Qwen3-4B \
  --host 0.0.0.0 \
  --port 8000 \
  --api-key sk-vllm-nacos-322

如果显存不够,加 --gpu-memory-utilization 0.7 降低占用。启动后验证:

curl http://127.0.0.1:8000/v1/models

返回模型列表就说明 vLLM 起来了。

4.4 部署 MCP 网关(把 Ollama 和 vLLM 注册进 Nacos)

MCP 网关的作用是把 Ollama 和 vLLM 包装成标准 MCP 服务,自动注册到 Nacos。先建目录结构:

ai-stack/
├── docker-compose.yml
├── mcp-ollama/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── main.py
└── mcp-vllm/
    ├── Dockerfile
    ├── requirements.txt
    └── main.py

两个目录的 Dockerfile 和 requirements.txt 完全一样:

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py .
EXPOSE 8200
ENV PYTHONUNBUFFERED=1
CMD ["python", "main.py"]
mcp[sse]
starlette
uvicorn
openai
pydantic>=2.0
nacos-mcp-wrapper-python

mcp-ollama/main.py 内容:

from nacos_mcp_wrapper.server.nacos_mcp import NacosMCP
from nacos_mcp_wrapper.server.nacos_settings import NacosSettings
from openai import OpenAI, APIError
from pydantic import BaseModel

nacos_settings = NacosSettings()
nacos_settings.SERVER_ADDR = "nacos:8848"
nacos_settings.NAMESPACE = "public"
nacos_settings.USERNAME = "nacos"
nacos_settings.PASSWORD = "nacos"

SERVICE_NAME = "ollama-mcp-nacos322"

ollama_client = OpenAI(
    base_url="http://ollama-mcp:11434/v1",
    api_key="dummy",
    timeout=120.0
)

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

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)}"

if __name__ == "__main__":
    mcp.run(transport="sse")

mcp-vllm/main.py 把 base_url 改成 http://vllm-mcp:8000/v1,api_key 改成 sk-vllm-nacos-322,SERVICE_NAME 改成 vllm-mcp-nacos322,模型默认值改成 Qwen3-4B。

然后写 docker-compose.yml:

version: "3.8"

networks:
  1panel-network:
    external: true

services:
  mcp-ollama:
    build: ./mcp-ollama
    container_name: mcp-ollama
    restart: always
    networks:
      - 1panel-network
    ports:
      - "8200:8200"
    environment:
      NACOS_SERVER_ADDR: "nacos:8848"
      NACOS_NAMESPACE: "public"
      NACOS_USERNAME: "nacos"
      NACOS_PASSWORD: "nacos"

  mcp-vllm:
    build: ./mcp-vllm
    container_name: mcp-vllm
    restart: always
    networks:
      - 1panel-network
    ports:
      - "8100:8100"
    environment:
      NACOS_SERVER_ADDR: "nacos:8848"
      NACOS_NAMESPACE: "public"
      NACOS_USERNAME: "nacos"
      NACOS_PASSWORD: "nacos"

注意 1panel-network 声明为 external,因为它是 1Panel 已经创建好的,compose 不要重复创建。启动:

cd ai-stack
docker compose up -d
docker logs mcp-ollama -f

看到 Register MCP Server to Nacos success 就说明注册成功。

5. 验证请求与成功结果

5.1 验证 Nacos 服务注册

浏览器打开 http://服务器IP:8848/nacos,登录后进「AI 管理中心 → MCP 管理 → MCP 服务列表」,应该能看到 ollama-mcp-nacos322 和 vllm-mcp-nacos322 两个服务,健康状态正常,实例地址是容器内网 SSE 地址。

5.2 验证 Ollama 接口

curl http://127.0.0.1:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"qwen3:4b","messages":[{"role":"user","content":"你好"}]}'

返回 JSON 里 choices 字段有内容就说明通了。

5.3 验证 vLLM 接口

curl http://127.0.0.1:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen3-4B","prompt":"用中文介绍杭州","max_tokens":100,"temperature":0.7}'

有返回文本就说明 vLLM 正常。小参数模型输出逻辑可能有点怪,这是模型本身的问题,不影响接口验证。

5.4 验证 MCP SSE 地址

curl http://127.0.0.1:8200/mcp/messages
curl http://127.0.0.1:8100/mcp/messages

能返回 SSE 事件流就说明 MCP 网关正常。

5.5 客户端配置:Cline 与 CC Switch

在 Cline 的 MCP 配置里,直连方式填:

{
  "mcpServers": {
    "ollama-local": {
      "url": "http://服务器IP:8200/mcp/messages",
      "transport": "sse"
    },
    "vllm-local": {
      "url": "http://服务器IP:8100/mcp/messages",
      "transport": "sse"
    }
  }
}

如果你用 CC Switch 或 Claude Code 这类工具,通过 TaoToken 统一接入时,settings.json 里填:

{
  "apiBase": "https://taotoken.net/api",
  "apiKey": "你的TaoToken Key",
  "model": "qwen3-4b"
}

这样本地模型和云端模型走同一个入口,切换只改 model 字段。Claude Code 的接入细节可以参考 https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claude-code&utm_campaign=rewrite 。

6. 本篇常见错排查

坑 1:MCP 注册 401 鉴权失败。Nacos 3.2.2 强制校验 NACOS_AUTH_IDENTITY_KEY 和 NACOS_AUTH_IDENTITY_VALUE,compose 里少这两个变量会直接拒绝注册。把鉴权相关的环境变量补全。

坑 2:MCP 服务连不上 nacos:8848。先确认所有容器都在同一个网桥,然后进容器测试连通性:

docker exec -it mcp-vllm ping nacos

代码里的地址绝对不能写 127.0.0.1 或宿主机 IP,必须写容器名。

坑 3:vLLM 容器启动失败、GPU 识别异常。检查 1Panel 容器配置里有没有勾选 GPU,重装 nvidia-docker2 后重启 Docker,显存不够就加 --gpu-memory-utilization 0.7。

坑 4:Nacos 收不到 MCP 注册。确认 8848 端口放行,Nacos 后台「启用 MCP Registry」已打开,MCP 容器日志里有没有报连接超时。

坑 5:容器之间无法互通。确认所有容器都加入了同一个自定义网桥,检查固定 IP 有没有冲突,临时关掉宿主机防火墙测试。

坑 6:代码修改后不生效。MCP 代码是 COPY 进镜像的,改完要重新 build:

docker compose build mcp-ollama
docker compose up -d mcp-ollama

7. 长期编码与 Agent 场景的接入建议

如果你只是偶尔验证模型,用模型对话页面就够了。但如果你打算把 Cline、CC Switch 这类工具长期挂在项目里跑,建议走 Coding Plan,额度和稳定性更适合高频调用。接入文档里有完整的协议说明和示例,遇到 base_url 或 model 名字对不上,先查文档再改配置。

整套栈跑通之后,日常运维在 1Panel 面板里点几下就行:看容器状态、翻日志、进终端、重启服务。端口和防火墙在「安全 → 防火墙」里统一放行 8848、9848、11434、8000、8100、8200。想加前端界面的话,再起一个 OpenWebUI 容器,镜像 ghcr.io/open-webui/open-webui:main,端口 3030→3000,网络加入同一个网桥,后台配 Ollama 和 vLLM 地址就能用。

最后提醒一句:MCP 网关的代码里,Nacos 地址和模型服务地址都用容器名,不要图省事写 IP,容器重建后 IP 可能变,容器名是稳定的。这套配置我反复重建过几次,只要网桥和容器名不变,起来就能用。

更多推荐