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

AWS Elastic Beanstalk Docker环境多容器部署失败ELB进程不健康求助

多容器Elastic Beanstalk部署ELB健康检查失败排查方案

核心问题排查方向

  • ELB健康检查配置不匹配
    EB默认ELB健康检查端口为80,你当前配置中业务端口为8080(前端)、8081(后端),未修改健康检查配置的情况下,ELB无法访问到可用服务,直接判定实例不健康。同时你使用docker-compose部署时,第一个服务是postgres,EB默认取第一个服务的端口5434作为健康检查端口,数据库端口无法响应HTTP健康检查请求,必然失败。
  • 端口映射逻辑冲突
    你的Dockerrun.aws.json和docker-compose.yml的端口映射完全反向:
    • Dockerrun配置:前端映射宿主机8080→容器5000,后端映射宿主机8081→容器8081
    • docker-compose配置:后端映射宿主机8080→容器5000,前端映射宿主机8081→容器8081
      需先确认两个业务镜像的实际服务监听端口,修正映射规则,避免端口不通。
  • 容器启动时序错误
    Dockerrun.aws.json中未配置数据库健康检查,postgres启动速度慢于后端服务,后端启动时无法连接数据库直接崩溃,且三个容器均标记为essential: true,任意容器崩溃会导致整个任务重启,ELB始终无可用实例。
  • 资源不足导致容器崩溃
    你给postgres分配的内存仅128M,刚好触达postgres 12的最低运行阈值,极易出现OOM被系统kill的情况。如果使用t2.micro等小规格实例,总内存不足以支撑三个容器运行,也会导致服务启动失败。
  • 安全组规则未放行
    EB实例安全组未放行ELB安全组对8080、8081端口的入站请求,ELB的健康检查请求被拦截,也会判定实例不健康。

整改步骤

  1. 修正配置文件
    首先确认业务镜像的实际监听端口,统一Dockerrun.aws.json和docker-compose.yml的端口映射规则,以Dockerrun为例做如下修改:
    {
        "AWSEBDockerrunVersion": 2,
        "containerDefinitions": [
          {
          "name": "db",
          "image": "library/postgres:12.3-alpine",
          "essential": true,
          "memory": 256,
          "environment": [
            {
              "name": "POSTGRES_USER",
              "value": "username"
            },
            {
              "name": "POSTGRES_PASSWORD",
              "value": "password"
            },
            {
              "name": "POSTGRES_DB",
              "value": "plot-booking-system"
            }
          ],
          "healthCheck": {
            "command": ["CMD-SHELL", "pg_isready -U username"],
            "interval": 10,
            "timeout": 5,
            "retries": 5
          }
        },
          {
            "name": "client",
            "image": "sawansamal/plot-booking-ui:version5.0",
            "hostname": "client",
            "essential": true,
            "memory": 300,
            "portMappings": [
            {
              "hostPort": 8080,
              "containerPort": 5000
            }
          ]
          },
          {
            "name": "backend",
            "image": "sawansamal/plot-booking-app:version12.0",
            "hostname": "backend",
            "essential": true,
            "memory": 500,
            "links": ["db"],
            "dependsOn": ["db"],
            "portMappings": [
            {
              "hostPort": 8081,
              "containerPort": 8081
            }
          ],
          "healthCheck": {
            "command": ["CMD-SHELL", "curl -f http://localhost:8081/health || exit 1"],
            "interval": 10,
            "timeout": 5,
            "retries": 3
          }
          }
        ]
    }
    
  2. 修改EB负载均衡配置
    进入EB控制台→对应环境→配置→负载均衡,将健康检查端口改为你对外提供服务的端口(如前端的8080),健康检查路径改为服务实际可访问的路径(如前端的/或者后端的健康检查接口/health),可将健康检查超时时间调整为10秒,失败阈值调整为3,适配服务启动速度。
  3. 调整安全组规则
    确认EB实例的安全组入站规则中,允许ELB的安全组访问8080、8081端口。
  4. 日志排查
    若整改后仍失败,可在EB控制台下载完整日志,查看/var/log/ecs/ecs-agent.log和容器的标准输出日志,确认是否存在镜像拉取失败、数据库连接报错、端口占用等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:39:00