You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将React、Golang、Postgres容器分别部署到不同VPS?

不同VPS部署多容器服务的可行方案

当然有可行且简便的方法,以下是几种实用思路:

1. 拆分Compose配置+远程Docker上下文

把原单份docker-compose.yml拆成三个独立配置文件,分别对应前端、后端、数据库服务,再通过Docker上下文远程操作不同VPS的Docker守护进程:

  • 拆分配置:创建docker-compose.frontend.yml仅包含React前端服务,docker-compose.backend.yml包含Golang后端,docker-compose.db.yml包含Postgres。每个配置里直接填写对应依赖的公网IP(比如后端配置写数据库VPS的IP,而非容器名)。
  • 配置远程上下文:在本地给每个VPS创建Docker上下文,示例:
    docker context create vps-frontend --docker host=ssh://你的用户名@前端VPS_IP
    docker context create vps-backend --docker host=ssh://你的用户名@后端VPS_IP
    docker context create vps-db --docker host=ssh://你的用户名@数据库VPS_IP
    
  • 部署服务:切换到对应上下文启动服务:
    docker context use vps-frontend
    docker-compose -f docker-compose.frontend.yml up -d
    
    docker context use vps-backend
    docker-compose -f docker-compose.backend.yml up -d
    
    docker context use vps-db
    docker-compose -f docker-compose.db.yml up -d
    
  • 关键:确保VPS间网络可达,比如数据库VPS的5432端口仅开放给后端VPS的IP,后端API端口开放给前端VPS或公网,同时配置好各服务的环境变量(比如后端的数据库连接地址)。

2. 使用Docker Swarm轻量编排

将三个VPS加入同一个Swarm集群,通过标签约束让服务调度到指定节点,无需拆分配置:

  • 初始化Swarm集群:选任意VPS作为管理节点,执行:
    docker swarm init --advertise-addr 管理节点IP
    
    按输出命令让另外两个VPS加入集群(作为工作节点)。
  • 给节点打标签:为每个VPS标记服务角色,示例:
    docker node update --label-add role=frontend 前端节点名称
    docker node update --label-add role=backend 后端节点名称
    docker node update --label-add role=db 数据库节点名称
    
  • 修改原docker-compose.yml:给每个服务添加部署约束,指定运行节点:
    services:
      frontend:
        # 原前端配置
        deploy:
          placement:
            constraints: [node.labels.role == frontend]
      backend:
        # 原后端配置
        deploy:
          placement:
            constraints: [node.labels.role == backend]
      db:
        # 原数据库配置
        deploy:
          placement:
            constraints: [node.labels.role == db]
    
  • 部署集群:在管理节点执行:
    docker stack deploy -c docker-compose.yml 你的集群名称
    
  • 优势:统一管理所有服务,Swarm自带服务发现和故障恢复,跨节点服务通信更便捷。

3. 手动单独部署(最直接)

每个VPS单独处理对应服务的镜像拉取和容器启动,适合快速验证:

  • 镜像准备:本地构建各服务镜像,推送到Docker Hub或私有镜像仓库(比如docker build -t my-react-frontend ./frontend,再docker push my-react-frontend)。
  • 前端VPS:拉取镜像并启动容器,开放80/443端口:
    docker pull my-react-frontend
    docker run -d -p 80:80 --name frontend my-react-frontend
    
  • 后端VPS:拉取后端镜像,配置数据库连接环境变量:
    docker pull my-golang-backend
    docker run -d -p 8080:8080 --name backend \
      -e DB_HOST=数据库VPS_IP \
      -e DB_USER=postgres \
      -e DB_PASSWORD=你的密码 \
      my-golang-backend
    
  • 数据库VPS:启动Postgres容器,挂载本地卷持久化数据,限制端口访问:
    docker run -d -p 5432:5432 --name db \
      -e POSTGRES_USER=postgres \
      -e POSTGRES_PASSWORD=你的密码 \
      -v /var/lib/postgresql/data:/var/lib/postgresql/data \
      postgres:latest
    
  • 关键:配置VPS防火墙,仅允许后端VPS访问数据库的5432端口,避免公网暴露风险。

通用注意事项

  • 安全配置:数据库不要直接暴露公网,通过防火墙/安全组限制IP访问;后端API和前端建议配置HTTPS(用Nginx容器或Let's Encrypt证书)。
  • 数据持久化:Postgres必须挂载本地或云存储卷,防止容器销毁后数据丢失;前端静态文件一般已打包进镜像,无需额外挂载。
  • 敏感信息:用环境变量或Docker Secrets(Swarm模式)管理数据库密码、API密钥等敏感数据,不要硬编码到配置文件中。

内容的提问来源于stack exchange,提问作者Henrique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:17:44