无法访问Docker Compose中运行的FastAPI服务,请求协助排查
核心问题分析
你的配置中使用了network_mode: "host",此时Docker容器会直接复用主机的网络栈,docker-compose里的expose配置完全无效,同时需要从以下几个关键方向排查:
1. 确认Gunicorn绑定地址有效性
你的Gunicorn启动参数-b :8000等价于绑定0.0.0.0:8000,这个配置是正确的(允许所有网络接口访问)。如果误写为127.0.0.1:8000,会导致仅容器内部可访问,即使host网络模式也无法从主机访问,先确认这一点。
2. 检查主机8000端口占用情况
在主机终端执行命令,查看8000端口是否被其他进程占用:
sudo lsof -i :8000 # 或者用netstat sudo netstat -tulpn | grep 8000
如果有其他进程占用,要么终止该进程,要么修改API服务的监听端口。
3. 验证容器内服务是否正常运行
进入容器内部,直接测试服务可用性:
docker exec -it fprint-api-v2 bash # 在容器内访问健康端点 curl http://localhost:8000/health
如果容器内访问正常,说明服务本身没问题,问题出在主机到容器的网络通路(虽然host模式下应该直通,但仍需确认)。
4. 排查主机防火墙规则
主机防火墙可能拦截了8000端口的外部访问,临时关闭防火墙测试:
# Ubuntu/Debian 系统 sudo ufw disable # CentOS/RHEL 系统 sudo systemctl stop firewalld
如果关闭后能正常访问,需要添加防火墙规则允许8000端口:
# Ubuntu/Debian sudo ufw allow 8000/tcp # CentOS/RHEL sudo firewall-cmd --add-port=8000/tcp --permanent sudo firewall-cmd --reload
5. 替换host网络为端口映射(推荐方案)
如果host网络不是必须的,建议移除network_mode: "host",改用标准端口映射,更符合Docker网络隔离规范:
修改docker-compose.yaml:
services: fprint-api: # 移除 network_mode: "host" 配置 ports: - "8000:8000" # 格式:主机端口:容器内部端口 # 保留其他原有配置...
重新构建并启动服务:
docker-compose down && docker-compose up --build
此时通过http://主机IP:8000/health即可访问端点。
6. 确认依赖服务就绪状态
depends_on仅保证容器启动顺序,不确保依赖的数据库、其他服务完全就绪。如果API启动时依赖服务未准备好,会导致服务启动失败。查看容器日志排查:
docker logs fprint-api-v2
如果存在数据库连接失败日志,需要添加服务就绪等待逻辑,比如在启动命令前加入等待脚本,或者配置Docker的healthcheck机制。
内容的提问来源于stack exchange,提问作者Stefan Falk

