使用Docker Compose ECS插件部署AWS ECS遇网络与容器不稳定问题
问题:Docker Compose ECS插件部署后FastAPI无法连接GROBID且容器频繁重启
我正按照AWS相关教程,使用Docker Compose的ECS插件将以下服务部署至AWS:
- 运行在Uvicorn服务器上的FastAPI服务
- GROBID服务器
唯一的特殊配置是共享EFS文件系统,GROBID将PDF转换为XML后存储到该系统,FastAPI通过HTTP调用时需要访问这些文件。
我的docker-compose配置如下:
version: "3" services: fastapi: image: <account>.dkr.ecr.eu-central-1.amazonaws.com/repo:latest # fastapi+uvicorn image ports: - "8000:8000" volumes: - efs:/root networks: - backend grobid: image: grobid/grobid:0.6.2 ports: - "8070:8070" networks: - backend networks: backend: driver: bridge volumes: efs: driver_opts: # Filesystem configuration backup_policy: ENABLED lifecycle_policy: AFTER_14_DAYS throughput_mode: bursting
当前问题
- FastAPI无法连接GROBID,报错信息:
HTTPConnectionPool(host='127.0.0.1', port=8070): Max retries exceeded with url: /api/processFulltextDocument (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f11e1a777c0>: Failed to establish a new connection: [Errno 111] Connection refused'))
但该端点可通过浏览器正常访问。
2. 两个容器频繁重启,怀疑容器不稳定或ECS插件配置有问题。
排查思路
- 修正容器间访问地址:报错显示FastAPI用
127.0.0.1访问GROBID,但在ECS的Docker Compose网络中,容器间需通过服务名通信,应将请求地址改为http://grobid:8070/api/processFulltextDocument,而非本地回环地址。 - 调整容器启动顺序与健康检查:FastAPI可能在GROBID完全就绪前发起请求,导致连接失败。可给
fastapi服务添加depends_on依赖,并为GROBID配置健康检查,确保服务就绪后再启动FastAPI:grobid: image: grobid/grobid:0.6.2 ports: - "8070:8070" networks: - backend healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8070/api/isalive"] interval: 30s timeout: 10s retries: 3 fastapi: # ... 其他配置 depends_on: grobid: condition: service_healthy - 检查EFS挂载状态:查看容器日志中是否有EFS挂载失败、权限不足的报错。确认EFS挂载目标已在对应可用区创建,且容器对挂载路径有读写权限。
- 升级ECS资源配额:默认CPU/内存可能不足以支撑服务运行,导致容器被OOM Killer终止重启。可添加资源限制配置:
services: fastapi: # ... 其他配置 deploy: resources: limits: cpus: '1.0' memory: 1024M reservations: cpus: '0.5' memory: 512M grobid: # ... 其他配置 deploy: resources: limits: cpus: '2.0' memory: 2048M reservations: cpus: '1.0' memory: 1024M - 排查GROBID版本稳定性:尝试升级GROBID至较新版本(如0.7.3),查看是否存在旧版本的已知启动或运行问题。
百万级用户无停机共享存储部署建议
- ECS服务高可用配置:将FastAPI和GROBID均配置为ECS服务,每个服务至少部署2个任务实例,启用基于CPU/内存或请求数的自动扩缩容,应对流量波动。
- 负载均衡架构:FastAPI服务前端配置Application Load Balancer(ALB),对外提供统一访问入口,配置健康检查自动剔除不健康实例;GROBID服务使用内部ALB或ECS服务发现,让FastAPI通过内部负载均衡访问,避免单点故障。
- EFS性能与可用性优化:根据业务场景选择EFS性能模式(高并发场景选“最大IO”模式),若吞吐量需求稳定,切换为“预置吞吐量”模式;在多个可用区创建EFS挂载目标,确保存储服务跨可用区高可用。
- 无停机部署策略:采用ECS滚动更新或蓝绿部署策略,配置合理的最小健康百分比(如100%)和最大百分比(如200%),逐步替换旧实例,实现零停机发布。
- 监控与告警:通过CloudWatch监控容器CPU、内存、网络指标及EFS吞吐量、延迟,设置告警规则,当容器重启次数异常、资源使用率过高时及时预警。
内容的提问来源于stack exchange,提问作者Alex Ramalho
相关产品推荐
相关产品推荐

