Featured image of post 使用 Docker 部署 CLIProxyAPI 与 New API 并配置互联

使用 Docker 部署 CLIProxyAPI 与 New API 并配置互联

在 Docker 环境下分别部署 CLIProxyAPI 和 New API,通过 Docker 网络实现容器间互通,将 CLIProxyAPI 作为 New API 的上游渠道。

本文介绍如何在 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 后启动:

1
docker compose up -d

默认容器名为 cli-proxy-api,监听 8317 端口。

config.yaml 中需要确认以下两项:

1
2
3
4
5
host: ""      # 绑定所有网络接口,容器内其他服务可以访问
port: 8317

api-keys:
  - "your-api-key"   # New API 调用 CPA 时使用的鉴权 key

部署 New API

songquanpeng/new-api 为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# docker-compose.yml(New API)
services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - ./data:/data
1
docker compose up -d

方案一:共享 Docker 网络(推荐)

创建共享网络

1
docker network create shared-net

将两个容器加入同一网络

1
2
docker network connect shared-net cli-proxy-api
docker network connect shared-net new-api

完成后,两个容器在 shared-net 内可以通过容器名互相解析。

验证连通性

在 New API 容器内向 CPA 发起请求,确认网络可达:

1
2
3
docker exec new-api wget -O- \
  --header="Authorization: Bearer your-api-key" \
  http://cli-proxy-api:8317/v1/models 2>&1

返回模型列表则说明互联成功。

调试时建议始终加上 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,直接使用即可:

1
http://host.docker.internal:8317

Linux 原生 Docker

Linux 上无 host.docker.internal,需要获取 New API 容器所在网络的网关 IP,即宿主机在该网络中的地址:

1
2
docker inspect new-api \
  --format '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}'

输出示例:172.18.0.1。将该 IP 作为 Base URL:

1
http://172.18.0.1:8317

也可以在 compose 文件中通过 extra_hostshost.docker.internal 注入容器,使 Linux 环境与 Docker Desktop 行为一致:

1
2
3
4
services:
  new-api:
    extra_hosts:
      - "host.docker.internal:host-gateway"

配置后同样使用 http://host.docker.internal:8317

注意事项

  • 该方案流量路径为:New API 容器 → 宿主机网关 → 宿主机端口映射 → CPA 容器,比直接走 Docker 网络多一跳。
  • 网关 IP 在容器重建后通常不变,但取决于 Docker 的网络分配,不如容器名稳定。
  • 若宿主机防火墙限制了容器访问宿主机端口,需放行对应规则。

持久化网络配置(可选)

上述 docker network connect 命令在容器重启后仍然有效,但若容器被删除并重建则需要重新执行。更可靠的方式是在 compose 文件中直接声明共享网络。

若两个服务在同一 docker-compose.yml 中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
services:
  cli-proxy-api:
    # ...
    networks:
      - shared-net

  new-api:
    # ...
    networks:
      - shared-net

networks:
  shared-net:

若分属不同的 compose 文件,则将网络声明为 external:

1
2
3
4
# 两个 compose 文件中均添加
networks:
  shared-net:
    external: true

先手动创建网络,再分别启动两个 compose 项目:

1
2
3
docker network create shared-net
docker compose -f docker-compose.cpa.yml up -d
docker compose -f docker-compose.newapi.yml up -d

常用命令

1
2
3
4
5
6
7
8
# 查看容器所在网络及 IP
docker inspect <容器名> --format '{{json .NetworkSettings.Networks}}'

# 查看网络内所有容器
docker network inspect shared-net

# 容器内测试连通性
docker exec <容器名> wget -O- http://<目标容器名>:<端口>/path 2>&1
comments powered by Disqus
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 设计