Docker Compose部署Flask与PostgreSQL容器后浏览器无法访问Flask应用
遗漏的常见配置排查
- 数据库连接地址配置错误:必须使用docker-compose中定义的PostgreSQL服务名作为数据库主机地址,不能写127.0.0.1或localhost,容器内部的localhost指向容器自身,无法连通其他容器。例如你的PostgreSQL服务命名为
db,则配置中的DB_HOST参数填db,端口填容器内部的5432,而非宿主机映射的端口。 - 服务启动时序问题:
depends_on仅保证PostgreSQL容器先启动,不会等待数据库进程完全初始化就绪,Flask启动时如果DB还未完成启动就会连接失败,导致服务直接崩溃,可在Flask代码中增加数据库连接重试逻辑,或使用wait-for-it类工具控制启动时机。 - 端口占用问题:先执行
lsof -i:5000或netstat -tulpn | grep 5000检查宿主机5000端口是否被其他服务占用,若被占用可修改docker-compose的端口映射规则,例如改为5001:5000,访问时使用5001端口即可。 - 网络配置冲突:如果手动指定了
network_mode: host会覆盖端口映射配置,非特殊需求不要添加该参数;docker-compose默认会为项目创建统一的内部网络,无需额外配置就能实现服务间连通,若手动指定了不同网络要确保两个服务在同一个网络下。 - 容器运行状态异常:先执行
docker ps -a查看两个容器是否正常运行,若Flask容器已退出,执行docker logs <Flask容器名>查看具体报错信息定位问题。
可用配置示例
app.py核心配置
from flask import Flask import psycopg2 # 若使用SQLAlchemy等ORM同理修改连接地址即可 app = Flask(__name__) # 数据库配置 重点是host为postgres的服务名 DB_CONFIG = { "host": "db", "port": 5432, "user": "postgres", "password": "自定义密码", "database": "自定义库名" } @app.route('/') def hello(): try: conn = psycopg2.connect(**DB_CONFIG) conn.close() return "Flask服务正常,数据库连接成功" except Exception as e: return f"Flask服务正常,数据库连接失败: {str(e)}" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) # 生产环境关闭debug参数
Flask应用Dockerfile
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"]
docker-compose.yml配置
version: '3.8' services: web: build: . ports: - "127.0.0.1:5000:5000" # 如需公网访问可去掉127.0.0.1 depends_on: - db environment: - DB_HOST=db - DB_PORT=5432 - DB_USER=postgres - DB_PASSWORD=自定义密码 - DB_NAME=自定义库名 db: image: postgres:14-alpine ports: - "5432:5432" # 不需要本地工具连数据库可删除该行 environment: - POSTGRES_PASSWORD=自定义密码 - POSTGRES_DB=自定义库名 volumes: - postgres_data:/var/lib/postgresql/data # 数据持久化,重启容器不丢失数据 volumes: postgres_data:
验证步骤
- 执行
docker-compose down -v清理之前的残留容器和匿名卷 - 执行
docker-compose up --build重新构建启动服务 - 浏览器访问
http://127.0.0.1:5000即可正常访问
内容的提问来源于stack exchange,提问作者user3549147
相关产品推荐
相关产品推荐

