1. 本地 Docker 编排 Ollama、open-webui 与 MySQL-MCP 的真实场景
如果你正在折腾本地 AI 工具链,大概率会遇到这样一个局面:Ollama 跑在 11434 端口,open-webui 跑在 3000 端口,MySQL-MCP 又单独占一个 8000 端口,三个容器各自为政,模型调用走一套 Key,MCP 工具调用走另一套配置,最后连自己都记不清哪个服务该填哪个地址。这套 Docker Compose 编排方案要解决的就是这个问题——把 Ollama、open-webui、MySQL-MCP 三个服务放进同一张网络里,再用 TaoToken 的统一 Key 和 API 通道把模型调用与工具调用串起来,让本地 AI 工具链真正能跑通「对话→查库→返回结果」的完整链路。
这篇文章面向的是已经装好 Docker Desktop、想在本机搭一套可跟做的 AI 工具链的开发者。我会给出可直接复制的config.toml与settings.json骨架、CC Switch 与 Cline 的配置片段,以及容器启动后验证 MCP 连通与 Key 生效的具体命令。整套流程实测下来,从零到能查库大约 20 分钟,前提是镜像拉取顺利。
需要提前说明的是,Ollama 负责本地模型推理,open-webui 负责对话界面,MySQL-MCP 负责把自然语言转成 SQL 去操作数据库,而 TaoToken 在这里扮演的是统一 API 网关的角色——它不替代任何编辑器,也不碰你的生产库,只是把模型调用的 Key 和通道收敛到一个地方管理。下面按编排顺序展开。
2. TaoToken 前置:统一 Key 与 API 通道的准备
在写 Compose 文件之前,先把 TaoToken 这边的准备工作做完,否则后面容器起来了还要回头改配置。TaoToken 的核心作用是提供一个统一的 API 入口,让你在 open-webui、Cline、CC Switch 这些工具里填同一个 Key 就能调用模型,不用每个工具单独申请。
第一步是拿到 API Key。访问控制台地址https://taotoken.net/console,登录后在 API Keys 页面创建一个新 Key,复制出来备用。这个 Key 后面会填到 open-webui 的 OpenAI 兼容接口配置里,也会填到 Cline 的settings.json中。
第二步是确认 API 通道地址。TaoToken 的 API 端点是https://taotoken.net/api,它兼容 OpenAI 的/v1/chat/completions格式,所以任何支持自定义 OpenAI Base URL 的工具都能接。open-webui 里填https://taotoken.net/api/v1,Cline 里填https://taotoken.net/api,具体路径按工具要求微调。
第三步是了解模型对话入口。如果你想先验证 Key 是否生效,可以直接打开https://taotoken.net/models在网页里发一条消息,能正常返回就说明 Key 和通道都没问题。这一步比在容器里排查快得多,建议先做。
如果你后续要做长期编码或 Agent 任务,可以关注 Coding Plan 页面https://taotoken.net/coding-plan,它针对高频调用场景做了额度优化。接入文档在https://taotoken.net/doc,里面有各工具的详细配置示例,遇到格式问题可以对照。
注意:TaoToken 的 Key 只用于模型调用通道,不要把它写进 MySQL-MCP 的环境变量里,MCP 连的是本地数据库,两者职责分开。
3. 可复制配置:docker-compose.yml 与 MCP 骨架
这一节给出完整的编排文件。我试过把三个服务放在同一个docker-compose.yml里,用自定义网络让它们互相用服务名访问,这样 MySQL-MCP 连数据库时直接写mysql:3306就行,不用去 Docker Desktop 里 inspect 容器 IP。
先建目录结构:
mkdir -p ~/ai-stack/mcpo-docker cd ~/ai-stack然后写docker-compose.yml:
services: ollama: image: ollama/ollama:latest container_name: ollama ports: - "11434:11434" volumes: - ollama_data:/root/.ollama networks: - ai-net restart: unless-stopped open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui ports: - "3000:8080" environment: - OLLAMA_BASE_URL=http://ollama:11434 - OPENAI_API_BASE_URL=https://taotoken.net/api/v1 - OPENAI_API_KEY=sk-你的TaoTokenKey volumes: - openwebui_data:/app/backend/data depends_on: - ollama networks: - ai-net restart: unless-stopped mysql: image: mysql:8.4 container_name: mysql environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: demo_db ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: - ai-net restart: unless-stopped mcpo: build: ./mcpo-docker container_name: mcpo ports: - "8000:8000" volumes: - ./mcpo-docker/config.json:/app/config.json depends_on: - mysql networks: - ai-net restart: unless-stopped volumes: ollama_data: openwebui_data: mysql_data: networks: ai-net: driver: bridge关键点在于OPENAI_API_BASE_URL和OPENAI_API_KEY这两个环境变量,它们让 open-webui 在保留本地 Ollama 模型的同时,也能通过 TaoToken 调用云端模型。ai-net网络让 mcpo 能用mysql这个服务名直连数据库。
接着准备 mcpo 的config.json,这是 MCP 服务器的注册骨架:
{ "mcpServers": { "mysql": { "command": "uvx", "args": [ "--from", "mysql_mcp_server_pro", "mysql_mcp_server_pro", "--mode", "stdio" ], "env": { "MYSQL_HOST": "mysql", "MYSQL_PORT": "3306", "MYSQL_USER": "root", "MYSQL_PASSWORD": "root123456", "MYSQL_DATABASE": "demo_db", "MYSQL_ROLE": "admin" } } } }MYSQL_HOST填mysql而不是 IP,靠的就是 Compose 的服务名解析。MYSQL_ROLE设为admin允许增删改查,如果只想查询可以改成readonly。
如果你用 Cline 或 CC Switch 做客户端,对应的settings.json片段如下:
{ "mcpServers": { "mysql": { "url": "http://localhost:8000/mysql", "type": "streamableHttp" } }, "openai": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "model": "gpt-4o-mini" } }Cline 走的是 HTTP 方式连 MCP,所以填http://localhost:8000/mysql;模型部分走 TaoToken 的 OpenAI 兼容接口。CC Switch 的配置逻辑类似,把baseUrl和apiKey换成 TaoToken 的即可。
4. 启动与验证:MCP 连通与 Key 生效的检查步骤
配置写完后,按顺序启动并逐项验证。不要一次性up -d然后指望全绿,分步排查更省时间。
先拉镜像并启动基础服务:
docker compose up -d ollama mysql docker compose logs -f ollama等 Ollama 日志出现Listening on 127.0.0.1:11434后,拉一个模型进去:
docker exec -it ollama ollama pull qwen2.5:7b docker exec -it ollama ollama listollama list能看到模型名就说明推理服务就绪。接着启动 open-webui 和 mcpo:
docker compose up -d open-webui mcpo docker compose psdocker compose ps里四个服务都应该是running状态。然后验证 MCP 连通性,打开浏览器访问http://localhost:8000/mysql/docs,能看到 Swagger 文档页面就说明 mcpo 把 MySQL MCP 挂载成功了。如果 404,检查config.json是否挂载正确:
docker exec -it mcpo cat /app/config.json再验证 Key 是否生效。访问http://localhost:3000,注册管理员账号后进入设置,在「连接」里应该能看到两个来源:本地 Ollama 和 OpenAI 兼容接口。点开 OpenAI 那一项,确认 Base URL 是https://taotoken.net/api/v1,Key 已填入。然后在对话界面选一个云端模型发消息,能返回就说明 TaoToken 通道打通了。
最后做一次端到端验证:在 open-webui 对话框里输入「查一下 demo_db 里有哪些表」,如果左下角出现扳手图标且模型调用了 mysql 工具,返回了表列表,整条链路就跑通了。命令行侧可以用 curl 直接测 MCP:
curl -X POST http://localhost:8000/mysql \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'返回工具列表 JSON 就说明 MCP 服务正常响应。
5. 本篇常见错排查
部署过程中最容易卡住的地方集中在网络解析和 Key 格式上,下面列几个我踩过的坑。
mcpo 连不上 MySQL,报Can't connect to MySQL server。九成是MYSQL_HOST填了localhost或127.0.0.1。在容器里localhost指向容器自身,不是宿主机也不是 mysql 容器。正确做法是填 Compose 服务名mysql,前提是两者在同一个ai-net网络里。用docker exec -it mcpo ping mysql能通就说明网络没问题。
open-webui 里云端模型报 401。检查OPENAI_API_KEY是否带了sk-前缀,以及 Base URL 是否漏了/v1。TaoToken 的兼容接口路径是https://taotoken.net/api/v1,少写/v1会 404。改完环境变量后要docker compose up -d open-webui重建容器才生效,光 restart 不会重新读 environment。
http://localhost:8000/mysql/docs返回 404。先确认config.json里的 server 名是mysql,路径里的/mysql要和它一致。如果 server 名写成mysql-mcp,那访问路径就是/mysql-mcp/docs。另外 mcpo 启动时如果 uvx 下载依赖失败,日志里会有Failed to start server,用docker compose logs mcpo看具体报错。
Ollama 模型拉取卡住。大模型文件动辄几个 GB,网络波动很正常。可以换小模型先跑通流程,比如qwen2.5:3b或deepseek-r1:1.5b,验证链路后再换大模型。docker exec -it ollama ollama pull支持断点续传,中断后重跑即可。
Cline 里 MCP 显示未连接。Cline 的settings.json里 MCP 类型要写streamableHttp,URL 用http://localhost:8000/mysql,不要加/docs。如果 Cline 跑在另一台机器上,localhost要换成宿主机的局域网 IP。
6. 语义一致 CTA
整套编排跑通后,你手里就有了一套本地可用的 AI 工具链:Ollama 提供本地推理,open-webui 提供对话入口,MySQL-MCP 提供数据库操作能力,而 TaoToken 把模型调用的 Key 和通道统一收口。后续要扩展其他 MCP 服务,只需在config.json里加一段 server 配置,重启 mcpo 容器即可。
如果你在接入过程中遇到 Key 或通道问题,建议先到 API Keys 页面https://taotoken.net/api-keys核对 Key 状态,再对照接入文档https://taotoken.net/doc检查 Base URL 格式。想快速验证模型是否可用,直接打开模型对话页面https://taotoken.net/models发一条消息最直观。长期做编码或 Agent 任务的话,Coding Plan 页面https://taotoken.net/coding-plan有对应的额度方案可以参考。