Docker容器内PHP Curl无法连接服务的问题求助
解决Docker容器内PHP Curl访问其他容器的问题
问题原因分析
- 错误码7(连接被拒绝):容器内的
localhost指向容器自身,而非宿主机,所以无法通过localhost:8086访问宿主机映射的InfluxDB端口。 - 错误码6(无法解析主机):你的
app容器未加入influx容器所在的web外部网络,导致容器间无法通过服务名(influx)互相访问。
具体修复步骤
1. 修改Docker Compose配置,让app容器加入web网络
在docker-compose.yml的app服务下添加networks配置,确保和influx服务在同一网络:
services: app: # ... 保留原有所有配置 networks: - web
2. 修正PHP Curl代码
- 使用服务名
influx作为主机地址,而非localhost - 移除多余的
CURLOPT_PORT设置(URL中已包含端口) - 建议从环境变量读取Token,避免硬编码
修正后的代码示例:
$curl = curl_init(); $token = getenv('INFLUXDB_TOKEN'); // 从环境变量获取Token curl_setopt($curl, CURLOPT_URL, 'http://influx:8086/api/v2'); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_HTTPHEADER, [ "Authorization: Token {$token}" ]); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 可选:获取返回内容 $out = curl_exec($curl); $errorCode = curl_errno($curl); curl_close($curl); return $errorCode;
3. 可选:添加服务健康检查(避免启动顺序问题)
如果InfluxDB启动较慢,可能出现app容器启动后InfluxDB尚未就绪的情况,可给influx服务添加健康检查,确保app服务等待InfluxDB就绪后再启动:
services: influx: # ... 原有配置 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8086/health"] interval: 10s timeout: 5s retries: 5 app: # ... 原有配置 depends_on: database: condition: service_started influx: condition: service_healthy # 等待influx健康检查通过
内容的提问来源于stack exchange,提问作者vbulash
相关产品推荐
相关产品推荐

