拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于Docker Compose部署Sub2API:轻量API网关的容器化实践

1. 项目概述与核心价值最近在折腾一些需要调用外部API的自动化脚本时遇到了一个挺普遍的问题很多服务提供的API调用方式比较“重”要么需要复杂的鉴权流程要么返回的数据结构嵌套太深处理起来很麻烦。后来在社区里发现了Sub2API这个项目它本质上是一个轻量级的API网关和转换层能把那些复杂的、不标准的API接口“翻译”成更简单、更统一的格式供内部调用。这想法挺妙的相当于给你的代码和外部服务之间加了一个“翻译官”。但Sub2API本身是一个需要部署和运行的服务对于个人开发者或者小团队来说最头疼的就是环境配置问题。“在我机器上好好的怎么到你那儿就不行了”这种场景太常见了。这时候Docker的优势就体现出来了。用Docker来部署Sub2API相当于把整个运行环境包括操作系统、运行时、库依赖、配置和应用本身一起打包成一个标准化的“集装箱”。无论你的开发机是Windows、macOS还是Linux也无论生产环境是云服务器还是本地虚拟机只要这个“集装箱”能运过去应用就能以完全相同的方式跑起来。所以这篇内容就是一次完整的实操记录我会带你从零开始基于Docker把Sub2API服务搭建起来。整个过程会涵盖Docker环境的准备、Sub2API镜像的获取与运行、核心配置的详解以及部署后如何测试和使用。我的目标不仅是让你能“照着做成功”更希望你能理解每一步背后的“为什么”这样以后遇到类似的服务部署你就能举一反三了。无论你是刚接触Docker的新手还是想寻找一种更优雅的API中间件部署方案的老手相信这篇内容都能给你带来直接的帮助。2. 环境准备跨越平台差异的基石在真正动手部署Sub2API之前我们必须先把它的“运行舞台”——Docker环境给搭建好。这一步是基础但也恰恰是新手最容易踩坑的地方因为不同的操作系统Windows, macOS, Linux准备工作差异很大。我会针对最常见的几种情况把关键步骤和避坑要点讲清楚。2.1 Docker核心概念与安装决策首先我们得统一一下认知。Docker有两个核心产品Docker Engine和Docker Desktop。Docker Engine这是Docker的核心一个后台服务守护进程负责创建和运行容器。在Linux服务器上我们通常直接安装它。Docker Desktop这是一个面向开发者的桌面应用程序它集成了Docker Engine、一个可视化管理界面Docker Dashboard、以及用于在Windows/macOS上运行Linux容器的关键组件。对于Windows和macOS用户安装Docker Desktop是最省事的选择。安装决策路径如果你的系统是 Linux如 Ubuntu, CentOS直接安装Docker Engine。不推荐在Linux上装Docker Desktop那是给桌面系统用的。如果你的系统是 Windows 10/11 或 macOS强烈推荐安装Docker Desktop。它会帮你处理好所有底层虚拟化的问题。接下来我们分系统来看具体操作。2.2 Windows/macOS通过Docker Desktop安装对于绝大多数Windows和macOS开发者走这条路最平滑。Windows用户特别注意Windows系统需要开启硬件虚拟化Hyper-V或WSL2后端和BIOS中的虚拟化技术Intel VT-x或AMD-V。如果你在安装或启动Docker Desktop时遇到类似“Docker Desktop failed to start because virtualisation support wasn’t detected”的错误请按以下步骤排查检查BIOS/UEFI设置重启电脑进入BIOS/UEFI设置界面通常是开机时按F2、Del、F10等键找到“Virtualization Technology”VT-x或“SVM Mode”选项确保其状态为Enabled。启用Windows功能在Windows搜索框输入“启用或关闭Windows功能”打开窗口后确保Hyper-V和适用于Linux的Windows子系统这两个选项被勾选。如果之前没勾选勾选后需要重启电脑。使用WSL2作为后端推荐Docker Desktop默认或推荐使用WSL2。你需要先安装WSL2。以管理员身份打开PowerShell或命令提示符运行wsl --install命令它会帮你安装默认的Linux发行版通常是Ubuntu并设置WSL2。完成后在Docker Desktop设置中确保“Use the WSL 2 based engine”选项被选中。安装步骤访问 Docker 官网的 Docker Desktop 下载页面。根据你的系统Windows或macOS Intel/Apple Silicon下载对应的安装包。运行安装程序基本上一路“Next”即可。安装完成后启动Docker Desktop。首次启动可能会要求你同意服务条款并可能需要输入系统密码来安装辅助组件。启动成功后你会在系统托盘Windows或菜单栏macOS看到Docker的鲸鱼图标。打开终端如PowerShell, Terminal, iTerm2输入docker --version和docker run hello-world命令进行验证。如果能看到版本信息并成功运行一个测试容器说明安装成功。注意对于国内用户从Docker Hub拉取镜像速度可能很慢。我们可以在Docker Desktop的设置中配置镜像加速器。在设置中找到“Docker Engine”选项在JSON配置中添加国内镜像源例如阿里云或中科大的镜像地址然后应用并重启Docker。2.3 Linux直接安装Docker Engine在Linux服务器上部署我们直接安装Docker Engine。这里以最流行的Ubuntu 22.04 LTS为例。卸载旧版本如果是全新安装可跳过sudo apt-get remove docker docker-engine docker.io containerd runc设置Docker的APT仓库# 更新软件包索引并安装依赖 sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release # 添加Docker的官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null安装Docker Engine# 更新APT索引这次会包含Docker仓库 sudo apt-get update # 安装最新版本的Docker Engine、containerd和Docker Compose插件 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin验证安装# 查看版本 sudo docker --version # 运行测试容器 sudo docker run hello-world如果看到“Hello from Docker!”等信息说明安装成功。管理Docker服务Linux特有# 启动Docker服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # 查看服务状态 sudo systemctl status docker将当前用户加入docker组避免每次用sudo 默认情况下运行docker命令需要sudo权限。为了方便可以将你的用户加入docker组。sudo usermod -aG docker $USER执行此命令后你需要完全退出当前终端会话并重新登录或者重启系统这个改动才会生效。之后你就可以直接用docker命令而不需要加sudo了。实操心得在Linux生产环境我强烈建议使用docker-compose现在是docker compose插件来管理多容器应用。它不仅能用YAML文件清晰定义整个应用栈还能方便地管理网络、卷挂载等。对于Sub2API这种可能依赖数据库如Redis做缓存的服务用Compose编排是更专业的选择。我们后续的部署也会采用这种方式。3. Sub2API项目解析与部署方案设计在把Sub2API塞进Docker容器之前我们有必要先搞清楚它到底是什么以及我们打算如何来部署它。知其然更要知其所以然。3.1 Sub2API究竟是什么解决了什么问题简单来说Sub2API是一个API转换与代理工具。它的核心功能是“翻译”和“简化”。想象一下这个场景你需要调用某个第三方天气API但这个API的认证方式很古怪比如要在URL里拼接一个动态token返回的JSON数据结构复杂得像迷宫比如data.result.list[0].weather.main.temp而且每次调用还有频率限制。你的业务代码里如果直接调用这个API就会充斥着各种字符串拼接、复杂的数据解析和繁琐的错误处理逻辑代码又臭又长而且难以维护。Sub2API的作用就是站在你的业务代码和这个“不友好”的第三方API中间。你只需要向Sub2API发起一个简单的、格式固定的请求比如GET /weather?cityBeijingSub2API就会在背后帮你完成所有“脏活累活”请求转换根据你预先配置好的规则把你简单的请求转换成第三方API要求的复杂格式包括URL、请求头、参数、认证信息等。代理请求代表你去调用那个复杂的第三方API。响应转换拿到第三方API返回的复杂数据后再根据规则只提取你关心的字段并组装成你定义的简单格式返回给你。这样一来你的业务代码就清爽了只需要和Sub2API这个“友好接口”打交道。同时Sub2API还可以集中管理API密钥、实现请求缓存、限流、日志记录等通用功能提升了安全性和可观测性。3.2 部署方案选型为什么选择Docker Compose对于Sub2API的部署我们有几种选择直接运行在宿主机上安装Python/Node.js取决于Sub2API的实现语言环境然后克隆代码、安装依赖、运行。这是最直接但也是最不推荐的方式因为存在严重的“环境依赖”问题。使用Docker运行单个容器docker run -p 8080:8080 sub2api-image。这种方式解决了环境一致性问题适合快速测试。使用Docker Compose编排这是我们推荐的方案。因为一个完整的Sub2API应用很可能不仅仅是一个主服务。它可能需要一个数据库比如PostgreSQL或MySQL用来存储API的配置规则、用户信息、调用日志等。一个缓存服务比如Redis用来做API响应的缓存提升性能并减少对上游API的调用压力。一个反向代理比如Nginx用来做SSL终结、负载均衡如果部署多个实例、或者提供更友好的访问域名。Docker Compose允许我们用一个docker-compose.yml文件把所有这些服务容器的定义、它们之间的网络连接、数据卷挂载、环境变量配置等全部描述清楚。然后只需要一个docker compose up -d命令整个应用栈就能一键启动。管理起来启动、停止、查看日志、更新也极其方便。我们的部署目标使用Docker Compose部署一个包含Sub2API主服务、Redis缓存可选的完整应用栈并确保配置数据持久化。3.3 获取Sub2API的Docker镜像部署的第一步是获得Sub2API的镜像。通常项目作者会在Docker Hub或GitHub Container Registry上提供官方镜像。查找镜像打开终端使用docker search sub2api命令可以搜索相关镜像。但更可靠的方式是直接去项目的官方文档或GitHub仓库查看确认推荐的镜像名称例如someauthor/sub2api:latest或ghcr.io/someorg/sub2api:latest。拉取镜像假设我们确定的镜像名是codex-switch/sub2api这是一个示例请以实际项目为准。docker pull codex-switch/sub2api:latest这个命令会从Docker Hub拉取标记为latest的镜像到本地。如果网络慢记得配置镜像加速器。验证镜像拉取完成后可以用docker images查看本地已有的镜像列表确认codex-switch/sub2api是否存在。注意事项在生产环境中绝对不要使用:latest标签。因为latest是一个浮动标签今天拉取的和明天拉取的可能是完全不同的版本会导致不可预知的行为。务必使用具体的版本号标签例如:v1.2.0以确保部署的一致性。我们这里为了教程演示暂时使用latest。4. 核心配置详解与Docker Compose编排有了镜像接下来就是如何配置和运行它。我们将通过一个docker-compose.yml文件来定义整个服务栈。这个文件是部署的核心我会逐部分解释其含义。4.1 编写docker-compose.yml文件在你的项目目录下例如~/projects/sub2api-deploy创建一个名为docker-compose.yml的文件。version: 3.8 # 指定Compose文件格式版本 services: # Sub2API 主服务 sub2api: image: codex-switch/sub2api:latest # 使用的镜像请替换为实际镜像名 container_name: sub2api-server # 为容器指定一个易读的名字 restart: unless-stopped # 重启策略除非手动停止否则总是重启应对意外退出 ports: - 3000:3000 # 端口映射将宿主机的3000端口映射到容器的3000端口 environment: # 设置环境变量这是配置应用的主要方式 - NODE_ENVproduction # 设置运行环境为生产环境 - REDIS_HOSTredis # Redis服务的主机名这里用服务名“redis”Compose网络内可解析 - REDIS_PORT6379 - API_BASE_URLhttp://sub2api:3000 # 应用自身的基础URL用于内部链接生成 - LOG_LEVELinfo # 日志级别 # 更多配置根据Sub2API的实际要求添加例如数据库连接、密钥等 # - DB_HOSTpostgresql # - DB_USERsub2api_user # - DB_PASSWORDyour_strong_password_here volumes: # 挂载配置文件如果需要从外部管理配置 # - ./config:/app/config:ro # 挂载日志目录将容器内日志持久化到宿主机 - ./logs:/app/logs # 挂载数据目录如果应用有需要持久化的文件 - ./data:/app/data depends_on: - redis # 声明依赖确保redis服务先启动 networks: - sub2api-network # 将服务连接到自定义网络 # Redis 缓存服务 redis: image: redis:7-alpine # 使用官方Redis镜像alpine版本更轻量 container_name: sub2api-redis restart: unless-stopped ports: - 6379:6379 # 暴露Redis端口方便宿主机调试连接生产环境可去掉 command: redis-server --appendonly yes # 启动命令开启AOF持久化 volumes: # 持久化Redis数据 - ./redis-data:/data networks: - sub2api-network # 定义自定义网络使服务间可以通过服务名通信 networks: sub2api-network: driver: bridge4.2 关键配置解析与环境变量这个YAML文件定义了2个服务sub2api和redis和1个网络。image指定容器基于哪个镜像创建。这是必须的。container_name给容器起个名字便于管理。如果不指定Docker会生成一个随机名字。restart: unless-stopped这是非常重要的重启策略。它意味着如果容器正常退出docker stop它不会重启。如果容器异常退出进程崩溃、宿主机重启等Docker会自动重启它。这对于保证服务的可用性至关重要。ports端口映射格式为宿主机端口:容器内端口。这里我们把宿主机的3000端口映射到Sub2API容器的3000端口。这样你访问http://localhost:3000就能访问到容器内的服务。environment这是配置应用的灵魂。Sub2API会读取这些环境变量来调整自己的行为。具体需要哪些变量必须查阅Sub2API项目的官方文档。常见的配置包括数据库连接字符串DATABASE_URLRedis连接信息如示例中的REDIS_HOST,REDIS_PORT应用密钥SECRET_KEY,API_KEYS日志级别LOG_LEVEL外部API的凭据等。重要提示永远不要将密码、密钥等敏感信息直接硬编码在docker-compose.yml文件中尤其是如果你打算将此文件提交到Git仓库。应该使用Docker Secrets在Swarm中或通过外部文件如.env文件引入或者使用Docker/Kubernetes的密文管理功能。volumes数据卷挂载用于持久化数据。容器本身是无状态的停止后其内部产生的数据会丢失。通过挂载可以将容器内的特定目录如/app/logs,/app/data, Redis的/data链接到宿主机的目录如./logs,./data,./redis-data。这样即使容器销毁数据依然保留在宿主机上。./logs:/app/logs将当前目录下的logs文件夹映射到容器的/app/logs。./代表docker-compose.yml文件所在的目录。:ro表示只读挂载read-only适用于配置文件。depends_on服务启动依赖。它告诉Composesub2api服务需要等redis服务启动之后才能启动。注意depends_on只控制启动顺序并不等待依赖服务“就绪”比如Redis完成加载。对于严格的健康依赖需要结合healthcheck配置。networks自定义网络。所有加入sub2api-network的服务在容器内部可以通过服务名如redis直接相互访问无需知道IP地址。这比使用默认的bridge网络更方便、更隔离。4.3 使用.env文件管理敏感配置为了避免敏感信息泄露最佳实践是使用.env文件。在docker-compose.yml同目录下创建一个名为.env的文件。在这个文件中定义你的环境变量# .env 文件 SUB2API_SECRET_KEYyour_super_secret_key_here REDIS_PASSWORDyour_redis_password EXTERNAL_API_KEYkey_for_upstream_service修改docker-compose.yml引用这些变量environment: - SECRET_KEY${SUB2API_SECRET_KEY} - REDIS_PASSWORD${REDIS_PASSWORD} - EXTERNAL_API_KEY${EXTERNAL_API_KEY}至关重要将.env文件添加到.gitignore中确保它不会被提交到版本控制系统。现在你的目录结构应该类似这样sub2api-deploy/ ├── docker-compose.yml ├── .env # 被.gitignore忽略 ├── logs/ # 目录会在首次启动时自动创建 ├── data/ # 同上 └── redis-data/ # 同上5. 启动、验证与基础操作配置完成后我们就可以启动整个服务栈了。5.1 启动与停止服务在包含docker-compose.yml文件的目录下打开终端。启动服务后台模式docker compose up -d-d参数代表“detached”让服务在后台运行。执行后你会看到Compose拉取镜像如果本地没有、创建网络、启动容器的过程。查看服务状态docker compose ps这个命令会列出当前目录下Compose项目中的所有容器并显示它们的状态Up、Exit、端口映射等信息。查看实时日志# 查看所有服务的日志 docker compose logs # 查看特定服务如sub2api的日志并持续输出-f docker compose logs -f sub2api启动后务必查看日志确认服务没有报错特别是sub2api服务是否成功连接到了redis。停止服务docker compose down这个命令会停止并移除所有由docker compose up创建的容器、网络。但不会移除数据卷如./redis-data所以你的数据是安全的。 如果想同时移除数据卷可以使用docker compose down -v请谨慎使用这会删除所有数据。重启服务docker compose restart或者先停止再启动docker compose down docker compose up -d5.2 验证服务运行状态服务启动后我们需要验证它是否正常工作。检查容器内部进程# 进入sub2api容器内部 docker exec -it sub2api-server /bin/sh # 或者如果镜像是基于bash # docker exec -it sub2api-server /bin/bash # 在容器内可以查看进程、检查文件等 ps aux exit # 退出容器通过端口访问验证 打开你的浏览器访问http://localhost:3000根据你docker-compose.yml中映射的端口。如果Sub2API提供了Web管理界面或默认的API端点如/health或/你应该能看到响应。 更常用的方法是使用curl命令curl http://localhost:3000/health如果返回{status:ok}或类似的JSON说明服务健康。测试API转换功能如果已知 假设Sub2API配置了一个将简单请求转换为某公共API的规则。你可以根据其文档尝试调用一个配置好的端点。curl http://localhost:3000/api/v1/weather?cityBeijing观察返回结果是否符合预期。5.3 服务更新与维护当Sub2API发布新版本时你需要更新服务。拉取最新镜像docker compose pull这个命令会拉取docker-compose.yml中定义的所有服务的最新镜像如果使用latest标签。对于生产环境你应该在docker-compose.yml中指定具体版本号然后修改文件中的版本号再执行docker compose pull。重新创建并启动容器docker compose up -dCompose会检测到镜像已更新并重新创建容器。由于我们使用了数据卷你的配置和数据不会丢失。清理无用镜像 更新多次后本地会留下很多旧的、无用的镜像称为“dangling images”占用磁盘空间。可以定期清理# 删除所有未被任何容器引用的镜像 docker image prune -a # 更激进的清理删除所有停止的容器、未使用的网络、构建缓存等 docker system prune -a执行docker system prune -a前请务必确认因为它会删除所有未被使用的资源。6. 常见问题与深度排查指南即使按照步骤操作在实际部署中也可能遇到各种问题。这里我整理了一些常见问题及其排查思路很多都是我自己踩过的坑。6.1 Docker环境与启动问题问题1Docker Desktop启动失败提示“Virtualization support wasn‘t detected”。原因这是Windows/macOS上最常见的问题。根本原因是宿主机你的电脑的硬件虚拟化支持没有开启或者被其他软件如某些安卓模拟器、旧版Hyper-V冲突占用。排查步骤确认BIOS/UEFI设置重启进入BIOS找到“Virtualization Technology”Intel VT-x或“AMD-V”选项确保为Enabled。这是硬件基础必须开启。检查Windows功能确保“Hyper-V”和“Windows Subsystem for Linux”已启用适用于Windows。检查冲突软件关闭或卸载可能占用虚拟化技术的软件如VMware Workstation与WSL2不兼容的版本、VirtualBox、某些安卓模拟器如BlueStacks。有时需要完全卸载并重启。尝试切换后端在Docker Desktop设置中尝试在“WSL 2”和“Hyper-V”后端之间切换如果可用然后重启Docker。使用命令行诊断在PowerShell管理员中运行systeminfo查看“Hyper-V 要求”部分确认所有项目都显示“是”。问题2在Linux上执行docker命令提示“Permission denied”。原因当前用户不在docker用户组中因此没有权限与Docker守护进程通信。解决将用户加入docker组见2.3节然后务必注销并重新登录或者重启终端。仅执行usermod命令不会立即生效。问题3拉取镜像速度极慢或超时。原因默认的Docker Hub镜像源在国内访问速度不佳。解决配置国内镜像加速器。Docker Desktop在设置 - Docker Engine中编辑JSON配置添加registry-mirrors项。例如使用阿里云加速器需要登录阿里云容器镜像服务获取专属地址{ registry-mirrors: [https://your-id.mirror.aliyuncs.com] }Linux Docker Engine编辑/etc/docker/daemon.json文件不存在则创建添加同样配置然后重启Docker服务sudo systemctl restart docker。6.2 Sub2API服务特定问题问题4容器启动后立刻退出状态为Exited (1)。原因这是最典型的问题。通常是因为应用启动失败可能是配置错误、依赖服务如Redis未就绪、或端口冲突。排查查看日志docker compose logs sub2api。日志会明确告诉你失败原因比如“无法连接到Redis:6379”、“配置文件缺失”、“环境变量XXX未设置”等。检查环境变量确认docker-compose.yml和.env文件中的环境变量名称和值是否正确特别是密码、连接字符串等。检查端口冲突宿主机3000端口是否已被其他程序占用可以用netstat -ano | findstr :3000(Windows) 或lsof -i:3000(Linux/macOS) 检查。检查依赖服务确认redis容器是否正常运行 (docker compose ps)。depends_on只保证启动顺序不保证健康。如果Sub2API启动时Redis还在初始化可能导致连接失败。可以考虑在sub2api服务中添加restart: on-failure或实现应用内的重试逻辑。问题5能访问首页但调用配置的API端点返回错误如404, 502。原因Sub2API应用本身运行正常但具体的API规则配置有问题或者上游服务不可用。排查查看应用日志docker compose logs -f sub2api在调用失败时观察日志输出看是否有更详细的错误信息如“上游API返回400”、“规则解析失败”等。检查Sub2API配置确认你通过Sub2API的管理界面或配置文件定义的API转换规则是正确的包括目标URL、请求方法、参数映射、响应解析规则等。测试上游API尝试直接调用Sub2API规则中配置的原始上游API例如用Postman确认该API本身是可用的并且你的密钥、参数无误。检查网络连通性进入sub2api容器内部 (docker exec -it sub2api-server sh)尝试ping或curl上游API的域名看容器内网络是否能访问外网。问题6修改了docker-compose.yml或.env后如何让配置生效解决仅仅修改文件不会影响正在运行的容器。你需要重新创建服务。docker compose down docker compose up -d这会停止旧容器并用新的配置创建新容器。6.3 数据与持久化问题问题7重启容器后之前配置的API规则或数据丢失了。原因Sub2API的配置数据默认可能存储在容器内部的文件系统或内存中。容器重建后这些数据就没了。解决必须确保配置数据被持久化。查阅Sub2API文档确认它支持哪种持久化方式如配置文件、环境变量、连接外部数据库。使用数据卷如果Sub2API通过读取容器内某个目录下的配置文件如/app/config来加载规则那么你应该将这个目录通过volumes挂载到宿主机。这样你可以在宿主机上编辑配置文件重启容器后配置依然存在。使用外部数据库如果Sub2API支持通常应该支持在environment中配置DATABASE_URL指向一个外部数据库服务如另一个PostgreSQL容器。这样所有配置数据都存储在独立的、持久化的数据库中。问题8Redis数据文件 (./redis-data) 权限错误导致Redis容器启动失败。原因Redis容器默认以redis用户UID 1001运行如果宿主机上的./redis-data目录所有者是root或当前用户Redis进程可能没有写入权限。解决确保./redis-data目录存在。更改目录权限sudo chown -R 1001:1001 ./redis-data将所有者改为UID 1001。或者在docker-compose.yml的redis服务中添加user: 1001:1001来明确指定运行用户虽然官方镜像已经指定。6.4 网络与连接问题问题9在宿主机上无法通过localhost:3000访问服务。排查确认容器在运行docker compose ps。确认端口映射docker port sub2api-server查看容器端口映射情况。检查防火墙宿主机防火墙如Windows Defender防火墙、Linux的ufw/iptables可能阻止了3000端口的入站连接。需要添加规则放行。Docker Desktop网络问题Windows/macOS特有有时Docker Desktop的网络适配器会出现问题。尝试在Docker Desktop中执行“Restart”或“Troubleshoot”功能。问题10Sub2API容器内无法连接到redis服务尽管配置了depends_on。原因depends_on只控制启动顺序不等待服务“就绪”。可能Sub2API启动时Redis容器已运行但Redis服务进程尚未完成初始化并开始监听端口。解决应用内重试最好的方式是在Sub2API的应用代码中实现连接Redis时的重试机制和指数退避。使用健康检查在docker-compose.yml中为redis服务定义healthcheck并为sub2api服务添加condition: service_healthy到depends_on中Compose文件格式v2.1支持。这能确保Sub2API只在Redis健康后才启动。增加启动延迟一个简单但不优雅的变通方法是在Sub2API的启动命令前加一个睡眠例如在command中写sh -c sleep 10 node app.js。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门