应用与服务
应用是栈内的可部署单元。每个应用作为一个或多个服务(容器)运行。理解这种关系是有效管理部署的关键。
应用与服务的区别
在 sh0 中,应用和服务之间的区别很重要:
应用
应用是一个 配置——它定义了要部署什么、从哪个源(Git、镜像、模板)、使用什么设置(环境变量、域名、资源限制)。应用是跨部署持久存在的实体。
服务
服务是一个 运行实例——从部署创建的实际 Docker 容器。服务是临时的。每次部署创建新服务,并在(健康检查通过后)移除旧服务。
把应用看作蓝图,服务看作建好的建筑。当您重新部署应用时,sh0 从更新的蓝图创建新服务,验证其正常工作,然后拆除旧服务。
Diagram showing an App box containing configuration (Git URL, env vars, domain), with arrows pointing to Service v1 (old, being removed) and Service v2 (new, running)
应用生命周期
应用在其生命周期中经历多个状态,从创建到活跃部署:
生命周期状态
| 状态 | 标记 | 描述 |
|---|---|---|
| 已创建 | Gray | 应用已配置但从未部署。 |
| 构建中 | Blue | 源代码正在克隆,容器镜像正在构建。 |
| 部署中 | Yellow | 容器正在启动,健康检查正在运行。 |
| 运行中 | Green | 应用已上线并提供服务。健康检查通过中。 |
| 已停止 | Gray | 应用已被手动停止。容器未运行。 |
| 失败 | Red | 构建或部署失败。如果可用,之前的版本继续运行。 |
App list showing apps in different states: 'frontend' with a green Running badge, 'worker' with a yellow Deploying badge, and 'migration-job' with a gray Stopped badge
零停机部署
当应用处于运行状态并且您触发新部署时,sh0 使用蓝绿策略。旧服务在新服务构建和启动时继续处理流量。只有在新服务通过健康检查后才切换流量。如果新服务失败,旧服务继续运行。
创建应用
应用在栈内创建。导航到栈并点击 Add App。您可以从三种来源创建应用:
- Git 仓库 -- 提供 URL,sh0 自动克隆、检测技术栈、构建和部署。
- Docker 镜像 -- 从 Docker Hub、GitHub Container Registry 或任何私有注册表拉取并运行现有镜像。
- 模板 -- 从 170+ 个预配置的流行应用模板中选择。
Add App dialog showing three source options as cards: Git Repository with a branch icon, Docker Image with a container icon, and Template with a grid icon
应用设置
每个应用有一个综合设置面板,分为多个类别。
常规设置
- 名称 -- 应用在栈内的标识符。也用作 Docker 容器名和内部主机名。
- 端口 -- 应用在容器内监听的端口。sh0 将外部流量路由到此端口。
- 来源 -- Git URL、Docker 镜像或模板配置。
- 分支 -- 对于基于 Git 的应用,要跟踪和部署的分支。
- 自动部署 -- 启用后,推送到跟踪的分支会自动触发部署。
构建设置
- 构建命令 -- 覆盖默认构建命令(例如
npm run build)。 - 启动命令 -- 覆盖默认启动命令(例如
node server.js)。 - Dockerfile 路径 -- 使用自定义 Dockerfile 而非 sh0 自动生成的。
- 构建参数 -- 向 Docker 构建过程传递构建时变量。
App settings page showing the Build Settings section with fields for Build Command, Start Command, Dockerfile Path, and Build Arguments
资源限制
您可以为每个应用设置 CPU 和内存限制,防止单个应用消耗所有服务器资源:
| 设置 | 默认值 | 描述 |
|---|---|---|
| CPU 限制 | 无限制 | 容器可使用的最大 CPU 核数(例如 0.5、1、2) |
| 内存限制 | 无限制 | 最大 RAM(例如 256m、512m、1g)。超出时容器被终止。 |
| 内存预留 | 无限制 | 软限制。Docker 尝试将容器保持在此值附近。 |
curl -X PUT http://localhost:9000/api/apps/APP_ID \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"cpu_limit": 1.0, "memory_limit": "512m"}' 内存不足
当容器超出其内存限制时,Docker 立即将其终止 (OOMKilled)。如果您的应用频繁达到限制,请增加分配或排查内存泄漏。在监控部分查看内存使用图表。
重启策略
重启策略决定容器停止或崩溃时的处理方式:
| 策略 | 行为 |
|---|---|
always | 始终重启容器,无论退出码。应用默认值。 |
on-failure | 仅在容器以非零退出码退出时重启。 |
unless-stopped | 除非用户明确停止,否则重启。 |
no | 永不重启。适用于一次性任务如迁移。 |
Tip
对于长期运行的服务(Web 服务器、API),使用
always。对于一次性任务(数据库迁移、种子脚本),使用 no 以便任务完成后容器停止。健康检查
健康检查验证应用在部署后是否正常工作。sh0 支持两种类型:
- HTTP 健康检查 -- sh0 向指定路径(默认:
/)发送 HTTP GET 请求,期望得到 2xx 响应。 - TCP 健康检查 -- sh0 验证容器是否在配置的端口上监听。用于非 HTTP 服务。
{"health_check": {"type": "http", "path": "/health", "interval": 10, "timeout": 5, "retries": 3, "start_period": 30}} App health check settings showing type selector (HTTP/TCP), path field, interval, timeout, retries, and start period fields with sensible defaults
Note
在部署期间,sh0 等待健康检查通过后再将流量路由到新容器。如果健康检查在配置的重试次数后失败,部署被标记为失败,之前的版本继续提供服务。