Flask应用Docker容器内可访问,外部调用遇连接重置问题求助
问题排查与解决:本地访问Docker内Flask应用出现连接重置
现象总结
- 本地主机执行
curl localhost:1111返回错误:curl: (56) Recv failure: Connection reset by peer - 通过
docker exec进入容器后,执行curl localhost:1111完全正常 - Flask核心配置:
app.run(host='0.0.0.0', port=1111) - Dockerfile及运行命令如下:
我的Dockerfile
FROM python:latest WORKDIR /home/administrator/DirectoyHidden COPY ./requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 1111 CMD ["python", "main.py"]
运行命令
docker run -d -v volumehidden:/home/administrator/directoryhidden -p 1111:1111 imagehidden
排查与解决步骤
1. 检查本地端口占用情况
本地1111端口可能被其他进程占用,导致Docker端口映射失效:
- Linux/macOS执行:
lsof -i :1111 - Windows执行:
netstat -ano | findstr :1111
如果查到占用进程,可终止该进程,或更换端口映射:
docker run -d -v volumehidden:/home/administrator/directoryhidden -p 1112:1111 imagehidden
之后本地访问 localhost:1112 测试。
2. 修正路径大小写不一致问题
注意到Dockerfile中WORKDIR是/home/administrator/DirectoyHidden(存在拼写错误且首字母大写),而挂载卷路径是/home/administrator/directoryhidden。Linux系统路径区分大小写,会导致容器工作目录与挂载卷不匹配,运行的代码可能不是本地挂载的版本。
解决:统一路径大小写,修改Dockerfile的WORKDIR为:
WORKDIR /home/administrator/directoryhidden
重新构建镜像并运行。
3. 检查本地防火墙设置
本地防火墙可能拦截了1111端口的入站请求:
- Linux:检查
ufw或firewalld规则,添加允许1111端口入站的规则 - Windows:在防火墙高级设置中添加允许1111端口的入站规则
4. 验证容器内应用监听状态
进入容器,确认Flask应用确实在监听0.0.0.0:1111:
docker exec -it <容器ID> bash netstat -tulpn | grep 1111
如果没有python进程监听0.0.0.0:1111,查看容器日志排查启动异常:
docker logs <容器ID>
5. 修复Docker网络异常
Docker的bridge网络组件偶尔会出现异常,导致端口映射失效:
- 停止容器:
docker stop <容器ID> - 重启Docker服务:
# Linux sudo systemctl restart docker # Windows 重启Docker Desktop - 重新启动容器测试
内容的提问来源于stack exchange,提问作者Ryan Shamu
相关产品推荐
相关产品推荐

