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

如何修复Docker Compose连接CockroachDB的端口转发及连接失败问题

问题修复方案

问题根源分析

  1. 网络配置冲突:node_2同时设置了network_mode: 'host'和自定义bridge网络network_cockroachdb,导致Docker网络规则混乱,端口转发逻辑冲突,出现端口串用问题。
  2. SSL配置不匹配:CockroachDB集群以--insecure启动(无SSL加密),但Go代码中SSLMode设置为verify-full,强制要求SSL验证,直接导致连接失败。
  3. 端口映射错误:node_1的端口映射指向了非默认的26258端口,加剧了端口逻辑混乱。

具体修复步骤

1. 修正Docker Compose配置

移除node_2的network_mode: 'host'配置,统一使用自定义bridge网络;修正node_1的端口映射,匹配CockroachDB默认RPC端口26257;同时调整数据库密码配置(--insecure模式下root无密码):

services:
  node_1:
    container_name: node_1
    image: cockroachdb/cockroach:latest
    command: start --insecure
    ports:
      - "26258:26257"  # 宿主机26258映射容器默认RPC端口26257
      - "8081:8080"     # 宿主机8081映射容器默认控制台端口8080
    networks:
      - network_cockroachdb 
  node_2:
    container_name: node_2
    image: cockroachdb/cockroach:latest
    hostname: node_2
    ports:
      - "26257:26257"
      - "8080:8080"
    command: start --insecure --join=node_1
    networks:
      - network_cockroachdb 
  app:
    build: .
    ports:
      - "12121:12121"
    environment:
      app_port: '12121'
      db_host: "node_2"
      db_port: 26257
      db_user: root
      db_password: ""  # --insecure模式下root默认无密码
      db_database: mydb
    depends_on:
      - node_2
    networks:
      - network_cockroachdb 
networks:
  network_cockroachdb:
    driver: bridge 

2. 修正Go代码的SSL配置

将SSLMode改为disable,适配集群的无加密模式;同时添加参数校验和连接验证逻辑:

func main() {  
    port, err := strconv.Atoi(os.Getenv("db_port"))
    if err != nil {
        log.Fatal("invalid db_port environment variable")
    }

    dbConfig := storage.ConnectionConfig{
        Host:     os.Getenv("db_host"),
        Port:     port,
        User:     os.Getenv("db_user"),
        Password: os.Getenv("db_password"),
        DBName:   os.Getenv("db_database"),
        SSLMode:  "disable",  // 禁用SSL适配insecure集群
    }

    log.Println("url: ", dbConfig.String())

    db, err := storage.NewCockroachDB(context.Background(), dbConfig)
    if err != nil {
        log.Fatal(err)
    }

    // 验证数据库连接
    if err := db.Ping(); err != nil {
        log.Fatal("failed to ping database:", err)
    }
    log.Println("database connected successfully")
}

3. 提前创建目标数据库

进入node_1容器执行命令,创建应用需要的mydb数据库:

docker exec -it node_1 cockroach sql --insecure -e "CREATE DATABASE mydb;"

验证步骤

  1. 重启Docker Compose集群:docker-compose down && docker-compose up -d
  2. 访问http://localhost:8080(node_2控制台),确认两个节点已成功加入集群。
  3. 启动Go应用,检查日志是否输出database connected successfully。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:35:02