CapRover

应用扩缩容与集群


CapRover 提供多种方式来扩展你的应用,通过运行多个进程来充分利用服务器上的全部资源。

运行多个应用实例:

你的披萨应用进展很不错,网站每天有成千上万的访问。只有一个实例已经不够用了,延迟也开始上升。接下来你会考虑在 Captain 上运行多个应用实例。你可以在 Captain Web 的 Apps 页面完成设置。比如把实例数量改成 3,Captain 就会同时运行 3 个应用实例。如果其中任何一个挂掉(崩溃),它会自动拉起一个新的实例替换掉。这样你的披萨应用始终保持 3 个实例在运行。更棒的是:Captain 会自动把请求分发到不同实例之间。

运行多台服务器:

哇,你的披萨应用真的很受欢迎。你在同一台服务器上跑了 3 个实例,RAM 和 CPU 几乎已经打满,这时你需要再买一台服务器。服务器之间怎么连接?Captain 可以帮你搞定。你只需要准备一台安装了 Docker 的服务器,步骤和最初那台 Captain 服务器类似。请确保你的新服务器可以从原来的 Captain 服务器通过 SSH 访问(例如,把 Captain 的 ssh 公钥复制到第二台服务器上)。

CapRover 底层使用 Docker Swarm。它提供了通过 CapRover UI 搭建节点集群的选项。你也可以使用原生 Docker Swarm 命令(例如 docker swarm join...)来搭建集群。这两种方式没有任何区别:第一种用 UI,第二种用命令行。

此时你需要输入以下信息:

  • CapRover IP Address (as seen by remote):你的原始服务器 IP
  • New node IP Address (as seen by Captain):你的第二台服务器 IP
  • Private SSH key for root user:CapRover 服务器上的 SSH 私钥,用于 SSH 登录第二台服务器。在 Linux 上通常位于 /home/yourusername/.ssh/id_rsa
  • Node type:描述新服务器的角色。如果你刚接触 Docker,建议用 worker。更多细节见 Docker Swarm 节点文档

现在到 Captain 的 “Cluster” 页面,在 “Nodes” 区域填入这些信息并点击 Join Cluster。完成,你就拥有自己的集群了。接着你可以把实例数量改成 6,Captain 会在另一台服务器上为你启动一些实例,并自动做负载均衡;如果某台机器挂掉,它也会自动创建新的实例。

Leader 节点是被选举为 Leader 的 manager 节点。Captain 以及 nginx、Certbot(Let's Encrypt)等核心服务会运行在这个节点上。你的所有应用会由 docker swarm 自动分配到各个节点上运行。

注意:只有未开启 “Persistent Data” 的应用才能跨节点扩缩容。启用了 “Persistent Data” 的应用只会运行在 1 个节点上。

默认推送 Registry(Default Push Registry):

Default Push Docker Registry 是一个 Docker Registry,你的应用一旦部署到服务器,就会被推送并存储到这里。

在集群模式(多台服务器)下,你需要配置一个 default push Docker Registry。

设置 Docker Registry:

Docker Registry 本质上就是一个仓库,集群里的不同节点可以访问它来下载你的应用并运行。如果你只有一台服务器(没有集群),基本没有必要特意搭建 Docker Registry。

但在集群场景下,Docker Registry 必须提前搭建并可用。要设置 Registry,打开 Captain Web 控制台,从菜单进入 Cluster 并按指引操作。你会看到两个选项:

  • 由 Captain 管理的 Docker Registry。
  • 由第三方提供商管理的 Docker Registry。

大多数情况下,让 Captain 托管 Registry 就足够了。注意:当你从单节点切换到集群时,如果已经有正在运行的应用,你需要先设置 Registry,然后重新部署所有现有应用,确保它们被推送到 registry 并能被所有节点拉取,而不是只存在于主 Leader 节点上。

多个 Registry:

你可以同时连接多个 registry。比如,你可能同时连接 AWS 上的私有 Docker Registry 和 DockerHub 上的私有 Docker Registry,因为部分应用镜像存放在 AWS 私有 registry 中,另一部分存放在 DockerHub。

不过,你只能有一个 default push registry。服务器上构建完成的镜像会被推送到这个 registry。

禁用 Registry:

在任何时候,你都可以选择:

  • 禁用 Registry
  • 删除 Registry 认证信息

但请注意:如果你启用了集群(多台服务器),移除 docker registry 可能会导致应用运行异常。

添加私有 Docker Registry:

如果你需要从私有 docker registry(例如 ghcr.io、dockerhub 等)拉取镜像,你需要把凭据提供给 CapRover,让它能成功拉取镜像。以 ghcr.io 为例,你需要提供:

  • Username: <your github username>
  • Password: 你创建的 personal token - 至少要有读取 packages 的权限。
  • Domain: ghcr.io
  • Image Prefix: <your github username> (MUST BE lowercase)

如果镜像以 your-username/your-image 的形式存储,就把你的 github 用户名作为 image prefix。否则,如果你在 GitHub 有一个组织,镜像以 my-org/my-image 的形式存储,就使用 my-org 作为 image prefix。

你可以在 Cluster 菜单下配置这些凭据。如果你只打算拉取镜像,请务必关闭 Pushing New Images