容器内FastAPI可正常访问,主机curl遇连接重置问题求助
解决容器内FastAPI主机无法访问的问题
问题描述
我在容器中运行了一个FastAPI实例,遇到以下访问异常:
- 容器内部访问正常:进入容器执行
podman exec -it ${LOCAL_NAME} bash后,执行curl http://localhost:9090能返回正常响应:
root@974b874a42eb:/code# curl http://localhost:9090 {"id":"e80c3468-d6c7-442c-9de4-cc74d4ea1c1f","ts":"2024-07-10T23:44:52.608550+00:00"}
- 主机端访问失败:执行相同的
curl命令出现连接重置错误:
j@fedora:~/Projects$ curl http://localhost:9090 curl: (56) Recv failure: Connection reset by peer
容器启动命令:
podman run -d -p 9090:9090 -v ./app:/code/app:rw -v ./tests:/code/tests:rw --cap-add=ALL --rm --name ${LOCAL_NAME} ${LOCAL_NAME}
FastAPI启动命令(Dockerfile配置):
CMD ["fastapi", "dev", "/code/app/main.py", "--port", "9090", "--host", "0.0.0.0", "--reload"]
已知信息:FastAPI已绑定到0.0.0.0,使用非特权端口9090,旧版本Podman可正常运行。
排查与解决步骤
1. 确认端口映射有效性
先检查容器的端口映射是否正确创建:
podman inspect ${LOCAL_NAME} | grep -A 10 "PortBindings"
正常输出应包含"9090/tcp": [{"HostPort": "9090"}]。若没有,说明端口映射未生效,重启容器时检查命令是否存在拼写错误。
2. 排查主机防火墙与SELinux限制
Fedora默认启用firewalld和SELinux,可能拦截了端口访问:
- 临时关闭firewalld测试:
若测试可访问,添加永久防火墙规则:sudo systemctl stop firewalldsudo firewall-cmd --add-port=9090/tcp --permanent sudo firewall-cmd --reload - SELinux权限检查:
临时设置宽容模式验证:
若恢复正常,添加SELinux端口规则:sudo setenforce 0sudo semanage port -a -t http_port_t -p tcp 9090
3. 验证Podman网络配置
Podman默认使用bridge网络,确认容器是否加入该网络:
podman network inspect bridge | grep -A 5 "Containers"
若容器不在bridge网络,启动时显式指定网络:
podman run -d --network bridge -p 9090:9090 -v ./app:/code/app:rw -v ./tests:/code/tests:rw --cap-add=ALL --rm --name ${LOCAL_NAME} ${LOCAL_NAME}
4. 检查FastAPI实际监听地址
进入容器,确认FastAPI是否真的绑定到0.0.0.0:
ss -tulpn | grep 9090
正常输出应显示0.0.0.0:9090,若为127.0.0.1:9090,说明启动命令未生效,检查Dockerfile是否正确构建,或启动时是否有命令覆盖了CMD配置。
5. 降级Podman版本(临时兼容方案)
如果确认是新版本Podman的兼容性问题,可降级到之前能正常运行的版本:
sudo dnf downgrade podman
后续关注Podman官方更新,等待兼容性修复。
内容的提问来源于stack exchange,提问作者Pompey Magnus
相关产品推荐
相关产品推荐

