Docker-Compose端口未暴露:Lambda外部访问连接重置问题求助
解决Docker部署的SAM本地API无法从外部访问的问题
问题背景
我最近在Docker里部署AWS SAM本地API时遇到了个棘手的问题:从宿主机或外部机器访问127.0.0.1:3000/create-loan端点时,执行命令curl -XPOST 127.0.0.1:3000/create-loan会返回Recv failure: Connection reset by peer,但进入容器内部测试同一个端点却完全正常。
查看Docker容器状态,billing_lambda_1显示运行正常,端口配置是0.0.0.0:3000->3000/tcp,数据库容器billing_db_1的5432端口映射也能正常访问,排除了端口映射本身的问题。
我的环境配置
docker-compose.yml
version: '3' services: lambda: build: . volumes: - ./:/app - /var/run/docker.sock:/var/run/docker.sock depends_on: - db environment: - PYTHONPATH=${PWD}/billing ports: - "3001:3000" db: image: postgres volumes: - db-data:/var/lib/postgresql/data ports: - "5432:5432" environment: - POSTGRES_USER=${BILLING_USER} - POSTGRES_PASSWORD=${BILLING_PASSWORD} - POSTGRES_DB=${BILLING_DB} - POSTGRES_HOST=${BILLING_HOST} volumes: db-data: driver: local
Dockerfile
FROM python:3.7 RUN pip3 install aws-sam-cli EXPOSE 3000 ENTRYPOINT ["/usr/local/bin/sam"] RUN apt-get install curl RUN pip3 install pipenv WORKDIR /app RUN pipenv install --dev CMD ["local", "start-api"]
排查与解决过程
一开始我反复检查端口映射配置,确认0.0.0.0:3000->3000/tcp的映射是正确的,但外部还是无法连接。后来突然反应过来:SAM本地的start-api命令默认绑定的是127.0.0.1,也就是服务只监听容器内部的localhost接口,即使Docker把端口映射到了宿主机,外部请求也无法穿透到容器内的服务。
找到问题根源后,我修改了Dockerfile中的CMD命令,添加--host 0.0.0.0参数,让SAM本地API监听容器的所有网络接口:
CMD ["local","start-api","--host","0.0.0.0"]
重新构建并启动容器后,外部再访问127.0.0.1:3000/create-loan就完全正常了!
内容的提问来源于stack exchange,提问作者JoeLoco




