You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:33:25