Docker Compose中Flask应用调用Selenium Remote WebDriver连接被拒问题
1. 修正API里的Selenium连接地址
本地能通过localhost:4444访问Selenium Grid是因为端口映射到了宿主机,但Docker容器之间通信得用服务名,不能用localhost。比如你的docker-compose.yml里Selenium服务叫selenium-hub,那API代码里的连接地址得改成http://selenium-hub:4444/wd/hub,而不是http://localhost:4444/wd/hub。
验证方法:进入API容器内部,跑curl http://selenium-hub:4444,看能不能拿到Selenium Grid的响应。
2. 确认服务在同一Docker网络
默认docker-compose会给所有服务创建一个共享网络,但如果手动给服务指定了不同的networks配置,就得确保API和Selenium用的是同一个网络。检查你的docker-compose.yml,两个服务的网络配置要一致。
3. 调整服务启动顺序
Selenium Grid启动需要点时间,API容器可能在Selenium完全就绪前就启动并发起连接,直接导致连接拒绝。解决办法是给API加启动依赖和健康检查,等Selenium就绪再启动API:
services: api: build: ./api depends_on: selenium-hub: condition: service_healthy selenium-hub: image: selenium/hub:latest healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4444/wd/hub/status"] interval: 10s timeout: 5s retries: 5
4. 检查Selenium的端口监听状态
确保Selenium容器的4444端口是监听在0.0.0.0,而不是127.0.0.1——如果只监听本地回环地址,同一网络的其他容器根本连不上。
进入Selenium容器,执行netstat -tulpn | grep 4444,看监听地址是不是0.0.0.0:4444。
5. 排查API容器的网络权限
别给API容器配置错误的网络模式,比如乱设network_mode: host,或者把它放进了internal: true的隔离网络里。另外如果API容器里有防火墙,得确认它允许访问4444端口。
6. 看日志找具体问题
- 查API容器日志:
docker-compose logs api,看错误信息里是DNS解析失败,还是端口不通。 - 查Selenium容器日志:
docker-compose logs selenium-hub,确认Selenium Grid是不是正常启动并在监听端口。
内容的提问来源于stack exchange,提问作者Andrew Mitchell

