1Panel 面板部署 Nacos + Ollama + vLLM + MCP 完整图文教程:TaoToken 统一 Key 接入与命令行安装两种方式 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基础地址是 https://taotoken.net/api 注意 API 地址后面不加 UTM 参数。你需要先去控制台创建一个 API Key控制台入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后客户端里填的 base_url 就是https://taotoken.net/apiapi_key 填你创建的那串。如果你只是想先验证模型能不能通可以直接用模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 试一下不用写代码。如果你打算长期用编码工具或 Agent建议看一下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它针对高频编码场景做了额度优化。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到协议细节可以查。这里要强调一点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-network1Panel 默认会创建一个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-networkIPv4 地址填 172.21.0.5。环境变量加MODEstandalone、NACOS_AUTH_ENABLEtrue、NACOS_CORE_AUTH_USERNAMEnacos、NACOS_CORE_AUTH_PASSWORDnacos。点创建并启动。命令行方式如果你习惯敲命令用 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 MODEstandalone \ -e NACOS_AUTH_ENABLEtrue \ -e NACOS_CORE_AUTH_USERNAMEnacos \ -e NACOS_CORE_AUTH_PASSWORDnacos \ -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-networkIP 填 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 list4.3 部署 vLLMGPU 高性能推理vLLM 只在有 NVIDIA 显卡时部署它的吞吐比 Ollama 高很多适合生产环境。镜像版本一定要和你的 CUDA 版本匹配前面nvidia-smi看到的是 12.6就选支持 12.6 的镜像。1Panel 面板方式创建容器名称vllm-mcp镜像vllm/vllm-openai:v0.7.3按你的 CUDA 版本调整。端口 8000→8000。网络1panel-networkIP 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 注册进 NacosMCP 网关的作用是把 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 PYTHONUNBUFFERED1 CMD [python, main.py]mcp[sse] starlette uvicorn openai pydantic2.0 nacos-mcp-wrapper-pythonmcp-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_urlhttp://ollama-mcp:11434/v1, api_keydummy, timeout120.0 ) class ChatReq(BaseModel): prompt: str model: str qwen3:4b mcp NacosMCP(SERVICE_NAME, nacos_settingsnacos_settings) mcp.tool() async def llm_chat(req: ChatReq) - str: 调用Ollama大模型对话 try: resp ollama_client.chat.completions.create( modelreq.model, messages[{role: user, content: req.prompt}] ) return resp.choices[0].message.content.strip() except APIError as e: return fOllama调用异常{str(e)} if __name__ __main__: mcp.run(transportsse)mcp-vllm/main.py把 base_url 改成http://vllm-mcp:8000/v1api_key 改成sk-vllm-nacos-322SERVICE_NAME 改成vllm-mcp-nacos322模型默认值改成Qwen3-4B。然后写docker-compose.ymlversion: 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_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite 。6. 本篇常见错排查坑 1MCP 注册 401 鉴权失败。Nacos 3.2.2 强制校验NACOS_AUTH_IDENTITY_KEY和NACOS_AUTH_IDENTITY_VALUEcompose 里少这两个变量会直接拒绝注册。把鉴权相关的环境变量补全。坑 2MCP 服务连不上 nacos:8848。先确认所有容器都在同一个网桥然后进容器测试连通性docker exec -it mcp-vllm ping nacos代码里的地址绝对不能写 127.0.0.1 或宿主机 IP必须写容器名。坑 3vLLM 容器启动失败、GPU 识别异常。检查 1Panel 容器配置里有没有勾选 GPU重装 nvidia-docker2 后重启 Docker显存不够就加--gpu-memory-utilization 0.7。坑 4Nacos 收不到 MCP 注册。确认 8848 端口放行Nacos 后台「启用 MCP Registry」已打开MCP 容器日志里有没有报连接超时。坑 5容器之间无法互通。确认所有容器都加入了同一个自定义网桥检查固定 IP 有没有冲突临时关掉宿主机防火墙测试。坑 6代码修改后不生效。MCP 代码是 COPY 进镜像的改完要重新 builddocker compose build mcp-ollama docker compose up -d mcp-ollama7. 长期编码与 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 可能变容器名是稳定的。这套配置我反复重建过几次只要网桥和容器名不变起来就能用。