如何让docker-compose.yml中的API可访问?请求无响应问题求助
解决Docker Compose中Express后端无响应的问题
以下是针对你的compose.yml和无响应问题的排查与修复方案:
1. 修正expose配置错误
expose指令仅用于声明容器内部监听的端口,不是端口映射,你的写法完全错误。正确格式应为- "9042"或- 9042。另外,当你使用network_mode: "host"时,容器直接共享主机网络命名空间,expose和ports配置都是多余的——容器端口会直接暴露给主机。
2. 排查network_mode: host的兼容性问题
- 若你在Windows或macOS的Docker Desktop环境下使用
host模式,会存在兼容性限制,可能导致端口无法正常映射到主机。建议改用默认的bridge网络,通过ports配置映射端口。 - 即使保留
host模式,也要确保Express服务监听的是0.0.0.0而非127.0.0.1——后者只能在容器内部访问,主机无法请求到。
3. 检查Express服务的监听配置
你的请求地址是http://127.0.0.1/(默认80端口),但后端配置的是443端口(HTTPS),存在协议/端口不匹配问题:
- 如果服务未配置HTTPS,应修改Express监听80端口,同时请求
http://127.0.0.1/; - 如果服务确实用HTTPS,应请求
https://127.0.0.1/,并确保服务正确配置了SSL证书。
Express代码必须监听0.0.0.0才能让外部访问:
app.listen(80, '0.0.0.0', () => { console.log('Server running on port 80'); });
4. 补全必要的环境变量
ENDPOINT_URL和SCYLLADB_IPS仅声明但未赋值,如果后端依赖这些变量连接数据库或配置服务,会导致服务启动失败或无法正常工作。示例赋值如下:
environment: - ENDPOINT_URL=http://localhost:80 - SCYLLADB_IPS=127.0.0.1
5. 确保服务依赖与健康检查生效
如果后端需要等待数据库启动完成后再启动,需添加depends_on配合数据库的健康检查:
backend: # ...其他配置 depends_on: database: condition: service_healthy
修改后的compose.yml示例(推荐使用bridge网络)
services: database: image: 'database' build: context: ./database dockerfile: ./Dockerfile healthcheck: test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"] interval: 15s timeout: 10s retries: 10 ports: - "9042:9042" backend: image: 'backend' build: context: ./src/backend dockerfile: ./Dockerfile environment: - ENDPOINT_URL=http://localhost:80 - SCYLLADB_IPS=database:9042 ports: - "80:80" depends_on: database: condition: service_healthy
内容的提问来源于stack exchange,提问作者Struan Mclean
相关产品推荐
相关产品推荐

