Search code examples
dockerdocker-composeclickhouse

Can't connect to Clickhouse using docker compose


I can't connect to Clickhouse using Docker compose.

I have the following docker compose file:

services:    
  my-clickhouse-db:
    image: clickhouse/clickhouse-server:23.9.1.1854-alpine
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    ports:
      - 18123:8123
      - 9000:9000

  my-service:
    build:
      context: .
      target: myService
    ports:
      - 8082:8082
    depends_on:
      - my-clickhouse-db

And I use Clickhouse Java Client https://clickhouse.com/docs/en/integrations/java#java-client

Then I try to connecto to Clickhouse the following way from my-service:

val clickHouseNode = ClickHouseNode.of("http://my-clickhouse-db:18123")
val clickhouseClient = ClickHouseClient.newInstance(clickHouseNode.protocol)
clickHouseClient.read(clickHouseNode)
    .format(ClickHouseFormat.JSONEachRow)
    .query("select * from my_tabke")
    .executeAndWait()
    .records()

But I get an error:

com.clickhouse.client.ClickHouseException: Connection refused, server ClickHouseNode [uri=http://my-clickhouse-db:18123/default]@-218511710

What do I do wrong? And how to fix the error?


Solution

  • Thanks you David! His comment answered my question. It turns out I misunderstood how port mapping works in Docker Compose, which caused me to use the wrong port to connect to Clickhouse. I should have used port 8123 from my-service to connect to Clickhouse.

    The followin code works now.

    val clickHouseNode = ClickHouseNode.of("http://my-clickhouse-db:8123")
    val clickhouseClient = ClickHouseClient.newInstance(clickHouseNode.protocol)
    clickHouseClient.read(clickHouseNode)
        .format(ClickHouseFormat.JSONEachRow)
        .query("select * from my_tabke")
        .executeAndWait()
        .records()