Docker环境下Laravel Dusk调用Selenium出现连接拒绝错误
Laravel Dusk + Selenium Docker环境下
net::ERR_CONNECTION_REFUSED问题解决 问题重现
执行php artisan dusk时抛出错误:
Facebook\WebDriver\Exception\UnknownErrorException: unknown error: net::ERR_CONNECTION_REFUSED
(Session info: chrome=113.0.5672.63)
环境说明:
- 系统:Ubuntu
- Laravel Dusk与Selenium通过Docker Compose部署,Selenium Grid可正常访问
http://127.0.0.1:4444/ - 本地Laravel服务运行在8990端口
相关配置:
docker-compose.yml
chrome: image: selenium/node-chrome:4.9.1-20230508 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 edge: image: selenium/node-edge:4.9.1-20230508 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 firefox: image: selenium/node-firefox:4.9.1-20230508 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 selenium-hub: image: selenium/hub:4.9.1-20230508 container_name: selenium-hub ports: - "4442:4442" - "4443:4443" - "4444:4444"
DuskTestCase.php
$options = (new ChromeOptions)->addArguments(collect([ $this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080', ])->unless($this->hasHeadlessDisabled(), function (Collection $items) { return $items->merge([ '--disable-gpu', '--headless=new', '--whitelisted-ips=""', '--disable-dev-shm-usage' ]); })->all()); return RemoteWebDriver::create( 'http://selenium-hub:4444/wd/hub', DesiredCapabilities::chrome()->setCapability( ChromeOptions::CAPABILITY, $options ) );
核心原因
错误本质是Selenium节点容器无法访问Laravel服务:
- 若Laravel运行在宿主机,容器内的
127.0.0.1指向容器自身,而非宿主机,导致无法连接宿主机的8990端口服务 - 若Laravel也在Docker中,但未与Selenium服务处于同一网络,服务名无法解析
解决方案
1. 调整Laravel访问地址(宿主机运行场景)
将APP_URL和Dusk的baseUrl改为宿主机的局域网IP(而非127.0.0.1):
在
.env中设置:APP_URL=http://192.168.1.100:8990 # 替换为你的Ubuntu宿主机局域网IP在
DuskTestCase.php中覆盖baseUrl方法:protected function baseUrl() { return env('APP_URL'); }或者,给Selenium节点添加
extra_hosts映射宿主机地址(Docker 20.10+支持host.docker.internal在Linux上使用):
在docker-compose.yml的chrome/edge/firefox服务中添加:extra_hosts: - "host.docker.internal:host-gateway"之后APP_URL可设为
http://host.docker.internal:8990
2. 统一Docker网络(Laravel也在Docker场景)
将Laravel服务与Selenium服务加入同一自定义网络,确保服务间可通过服务名访问:
- 修改docker-compose.yml,添加自定义网络并关联所有服务:
version: '3.8' networks: dusk-network: driver: bridge services: # 你的Laravel服务示例 app: build: ./ ports: - "8990:80" networks: - dusk-network # 其他配置... selenium-hub: image: selenium/hub:4.9.1-20230508 container_name: selenium-hub ports: - "4442:4442" - "4443:4443" - "4444:4444" networks: - dusk-network chrome: image: selenium/node-chrome:4.9.1-20230508 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 networks: - dusk-network # edge、firefox服务同理添加networks配置 - 调整APP_URL为Laravel服务的容器地址:
APP_URL=http://app:80 # app为docker-compose中Laravel服务的名称
3. 验证连通性并开放端口
- 进入Chrome节点容器,测试能否访问Laravel服务:
docker exec -it <chrome-container-id> curl http://your-host-ip:8990 - 若不通,开放Ubuntu宿主机的8990端口:
sudo ufw allow 8990/tcp
4. 优化ChromeOptions配置(可选)
当前配置中的--whitelisted-ips=""和--disable-dev-shm-usage是合理的,可保留;确保没有添加限制网络访问的额外参数。
内容的提问来源于stack exchange,提问作者Matthew Bradley
相关产品推荐
相关产品推荐

