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

Docker中多端口数据库连接失败求助(ClickHouse+MySQL)

Docker中Laravel连接ClickHouse的正确配置方案

问题概述

运行在Docker中的Laravel任务程序已成功连接MySQL,但配置ClickHouse时持续出现「不支持的驱动」或「连接拒绝」错误,现有配置如下:

现有配置

docker-compose.yml

version: '3.7'

services:
    app:
        build:
            context: .
            dockerfile: .docker/Dockerfile
        image: 'shouts.dev/laravel'
        container_name: shouts-laravel-app
        ports:
            - "80:80"
        volumes:
            - ./:/var/www/html
        networks:
            - laravel-shouts
        depends_on:
            - mysql
    mysql:
        image: 'mariadb:latest'
        container_name: shouts-laravel-db
        restart: unless-stopped
        ports:
            - "3306:3306"
        environment:
            MYSQL_DATABASE: ${DB_DATABASE}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
            MYSQL_PASSWORD: ${DB_PASSWORD}
            MYSQL_USER: ${DB_USERNAME}
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - ./database/dbdata:/var/lib/mysql
        networks:
            - laravel-shouts
    clickhouse:
        networks:
            - laravel-shouts
        container_name: clickhouse
        image: clickhouse/clickhouse-server
        ports:
            - 127.0.0.1:8123:8123
            - 127.0.0.1:9000:9000
            - 127.0.0.1:9009:9009
networks:
    laravel-shouts:
        driver: bridge

ClickHouse现有配置

.env

DB_CONNECTION_SECOND=clickhouse
DB_HOST_SECOND=clickhouse
DB_PORT_SECOND=8123
DB_DATABASE_SECOND=jaya
DB_USERNAME_SECOND=default
DB_PASSWORD_SECOND=

database.php

'clickhouse' => [
            'driver'   => 'clickhouse',
            'host'     => 'clickhouse',
            'port'     => '8123',
            'database' => 'jaya',
            'username' => 'default',
            'password' => '',
            'options'  => [
                'timeout'  => 1000,
                'protocol' => 'http'
            ]
        ],

分步解决错误

1. 解决「不支持的驱动」错误

Laravel原生不支持ClickHouse驱动,需安装第三方适配包:

  • 安装依赖包:
composer require smi2/phpclickhouse
  • (Laravel 5.5+可自动发现服务,无需手动注册)若版本较低,在config/app.php的providers数组中添加服务提供者:
Smi2\ClickHouse\ClickHouseServiceProvider::class,
  • 更新database.php中的ClickHouse配置,确保驱动关联正确:
'clickhouse' => [
    'driver' => 'clickhouse',
    'host' => env('DB_HOST_SECOND', 'clickhouse'),
    'port' => env('DB_PORT_SECOND', 8123),
    'database' => env('DB_DATABASE_SECOND', 'jaya'),
    'username' => env('DB_USERNAME_SECOND', 'default'),
    'password' => env('DB_PASSWORD_SECOND', ''),
    'options' => [
        'timeout' => 10,
        'protocol' => 'http'
    ],
    'driverOptions' => [
        'headers' => [
            'X-ClickHouse-Format' => 'JSON'
        ]
    ]
],

2. 解决「连接拒绝」错误

调整Docker网络配置

  • 移除ClickHouse端口映射的127.0.0.1绑定:原配置限制仅宿主机本地可访问,容器间通信无需该绑定,修改为:
ports:
    - "8123:8123"
    - "9000:9000"
    - "9009:9009"

(若不需要宿主机访问ClickHouse,可直接删除端口映射,容器间仍能通过服务名通信)

验证容器间连通性

  • 进入app容器内部,测试与ClickHouse的连通:
docker exec -it shouts-laravel-app bash
curl http://clickhouse:8123/ping

返回Ok则说明网络连通正常。

确认目标数据库存在

  • 进入ClickHouse容器,创建目标数据库(若不存在):
docker exec -it clickhouse clickhouse-client
CREATE DATABASE IF NOT EXISTS jaya;

3. 测试连接

在Laravel中添加测试代码验证连接,比如在Artisan命令或控制器中:

use Illuminate\Support\Facades\DB;

try {
    $connection = DB::connection('clickhouse');
    $result = $connection->select('SELECT 1');
    dd($result); // 输出结果则连接成功
} catch (\Exception $e) {
    dd($e->getMessage());
}

内容的提问来源于stack exchange,提问作者Bedman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:27:35