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配置:前端映射
- 容器启动时序错误
Dockerrun.aws.json中未配置数据库健康检查,postgres启动速度慢于后端服务,后端启动时无法连接数据库直接崩溃,且三个容器均标记为essential: true,任意容器崩溃会导致整个任务重启,ELB始终无可用实例。 - 资源不足导致容器崩溃
你给postgres分配的内存仅128M,刚好触达postgres 12的最低运行阈值,极易出现OOM被系统kill的情况。如果使用t2.micro等小规格实例,总内存不足以支撑三个容器运行,也会导致服务启动失败。 - 安全组规则未放行
EB实例安全组未放行ELB安全组对8080、8081端口的入站请求,ELB的健康检查请求被拦截,也会判定实例不健康。
整改步骤
- 修正配置文件
首先确认业务镜像的实际监听端口,统一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 } } ] } - 修改EB负载均衡配置
进入EB控制台→对应环境→配置→负载均衡,将健康检查端口改为你对外提供服务的端口(如前端的8080),健康检查路径改为服务实际可访问的路径(如前端的/或者后端的健康检查接口/health),可将健康检查超时时间调整为10秒,失败阈值调整为3,适配服务启动速度。 - 调整安全组规则
确认EB实例的安全组入站规则中,允许ELB的安全组访问8080、8081端口。 - 日志排查
若整改后仍失败,可在EB控制台下载完整日志,查看/var/log/ecs/ecs-agent.log和容器的标准输出日志,确认是否存在镜像拉取失败、数据库连接报错、端口占用等问题。
内容的提问来源于stack exchange,提问作者Saawan
相关产品推荐
相关产品推荐

