本文介绍如何在 Docker 中分别部署 CLIProxyAPI(CPA)与 New API,并通过 Docker 网络将二者互联,使 New API 可以将 CPA 作为上游 API 渠道使用。
前置知识:Docker 容器的网络隔离
Docker 中每个容器拥有独立的网络命名空间。容器内的 localhost 指向容器自身,而非宿主机或其他容器。
因此,即使 CPA 在宿主机上通过 http://localhost:8317 可以访问,New API 容器内同样的地址也只会指向 New API 容器本身。容器间通信必须通过 Docker 网络,使用容器 IP 或容器名作为地址。
部署 CLIProxyAPI
使用官方提供的 docker-compose.yml,按需修改 config.yaml 后启动:
|
|
默认容器名为 cli-proxy-api,监听 8317 端口。
config.yaml 中需要确认以下两项:
|
|
部署 New API
以 songquanpeng/new-api 为例:
|
|
|
|
方案一:共享 Docker 网络(推荐)
创建共享网络
|
|
将两个容器加入同一网络
|
|
完成后,两个容器在 shared-net 内可以通过容器名互相解析。
验证连通性
在 New API 容器内向 CPA 发起请求,确认网络可达:
|
|
返回模型列表则说明互联成功。
调试时建议始终加上
2>&1,将 wget 的错误输出合并到 stdout 中。wget 的 exit code 本身不足以判断问题类型:exit 6 代表 HTTP 401 认证失败,而非网络不通。
在 New API 中添加 CPA 渠道
进入 New API 管理界面(默认 http://localhost:3000),添加渠道时填写:
| 字段 | 值 |
|---|---|
| 类型 | OpenAI |
| Base URL | http://cli-proxy-api:8317(方案一)或 http://host.docker.internal:8317(方案二) |
| API Key | CPA config.yaml 中配置的 key |
保存后点击「测试」,返回成功即配置完成。
方案二:经由宿主机端口映射访问(不配置共享网络)
若不希望修改 Docker 网络配置,可以利用 CPA 已有的宿主机端口映射(8317:8317),让 New API 容器通过宿主机网关 IP 访问 CPA。
该方案的前提是:CPA 的端口已映射到宿主机,且宿主机的网关 IP 在 New API 容器内可达。
Docker Desktop(Windows / macOS)
Docker Desktop 提供了内置域名 host.docker.internal,在容器内解析为宿主机 IP,直接使用即可:
|
|
Linux 原生 Docker
Linux 上无 host.docker.internal,需要获取 New API 容器所在网络的网关 IP,即宿主机在该网络中的地址:
|
|
输出示例:172.18.0.1。将该 IP 作为 Base URL:
|
|
也可以在 compose 文件中通过 extra_hosts 将 host.docker.internal 注入容器,使 Linux 环境与 Docker Desktop 行为一致:
|
|
配置后同样使用 http://host.docker.internal:8317。
注意事项
- 该方案流量路径为:New API 容器 → 宿主机网关 → 宿主机端口映射 → CPA 容器,比直接走 Docker 网络多一跳。
- 网关 IP 在容器重建后通常不变,但取决于 Docker 的网络分配,不如容器名稳定。
- 若宿主机防火墙限制了容器访问宿主机端口,需放行对应规则。
持久化网络配置(可选)
上述 docker network connect 命令在容器重启后仍然有效,但若容器被删除并重建则需要重新执行。更可靠的方式是在 compose 文件中直接声明共享网络。
若两个服务在同一 docker-compose.yml 中:
|
|
若分属不同的 compose 文件,则将网络声明为 external:
|
|
先手动创建网络,再分别启动两个 compose 项目:
|
|
常用命令
|
|