请求无法接入Docker容器中的Flask应用问题排查
解决Docker部署Flask+Gunicorn时的连接重置问题
我来帮你搞定这个问题!你遇到的curl: (56) Recv failure: Connection reset by peer错误,核心原因是Gunicorn默认只监听容器内部的127.0.0.1回环地址,宿主机通过端口映射发过来的请求根本无法被容器内的服务接收。
快速修复方案
只需要修改Gunicorn的启动参数,让它监听容器的所有网卡(0.0.0.0),有两种简单的修改方式:
方式1:修改Dockerfile的CMD指令
直接把Dockerfile里的CMD行改成下面这样,明确指定绑定地址为0.0.0.0:8000:
CMD ["gunicorn", "hello:app", "--bind", "0.0.0.0:8000", "--log-file=-"]
方式2:兼容本地与容器的启动方式
如果你想让本地和容器运行的逻辑更统一,也可以保留原有Dockerfile,在启动容器时通过命令行覆盖默认CMD:
docker run -it --rm --name flaskdemoapp -p 8000:8000 flaskdemo gunicorn hello:app --bind 0.0.0.0:8000 --log-file=-
不过更推荐第一种方式,因为Dockerfile里明确配置绑定地址,能避免后续启动时遗漏参数。
验证修复效果
- 重新执行你的shell脚本构建并运行容器:
./run.sh
- 这次容器启动日志会显示Gunicorn监听
http://0.0.0.0:8000,此时再执行curl localhost:8000,就能正常收到Hello, World!的响应了。
为什么本地运行没问题?
本地执行gunicorn hello:app时,Gunicorn监听的127.0.0.1是宿主机的回环地址,所以你在宿主机上访问localhost:8000能正常连接。但在Docker容器里,127.0.0.1是容器自己的内部回环,宿主机无法直接访问这个地址——只有当服务监听0.0.0.0(容器的所有网卡)时,宿主机的端口映射请求才能被正确转发到服务上。
内容的提问来源于stack exchange,提问作者Patrick Bucher
相关产品推荐
相关产品推荐

