Docker Compose启动的Flask应用无法调用本地另一Flask服务问题求助
问题原因
该问题和Redis无关,本质是Docker容器的网络隔离机制导致:
- 应用A通过docker-compose启动时,运行在独立的Docker容器网络栈内,代码中请求的
0.0.0.0或者localhost指向的是容器自身,而非运行应用B的宿主机,自然无法建立连接。 - 你本地直接运行A、或者终端执行curl请求时,都是在宿主机网络环境下执行,所以可以正常访问同样跑在宿主机5002端口的B。
解决方法
根据你的运行环境选择对应方案即可:
方案1:适配Windows/macOS Docker Desktop环境
Docker Desktop内置了指向宿主机的专用域名host.docker.internal,你只需要修改应用A中的请求地址:
# 把原来的http://0.0.0.0:5002/parse/改成下面的地址 response = requests.post('http://host.docker.internal:5002/parse/', headers=headers, data=data)
修改后重新构建启动A的容器即可正常访问。
方案2:适配Linux Docker环境
Linux Docker默认没有内置上述域名,需要先修改应用A的docker-compose.yaml,给app服务添加宿主机映射:
version: '3' services: app: build: context: . dockerfile: Dockerfile ports: - "5000:5000" # 新增下面两行配置 extra_hosts: - "host.docker.internal:host-gateway" redis: image: "redis:alpine"
再和方案1一样,把A的请求地址改成http://host.docker.internal:5002/parse/,重新启动容器即可。
额外验证项
确认应用B启动时绑定的是0.0.0.0(你当前代码已经配置了app.run(debug=True, host='0.0.0.0', port=5002),符合要求),如果B只绑定127.0.0.1,即使改了地址也会被宿主机规则拦截,无法从容器访问。
内容的提问来源于stack exchange,提问作者user3831011
相关产品推荐
相关产品推荐

