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
相关产品推荐
相关产品推荐

