如何修复Docker Compose连接CockroachDB的端口转发及连接失败问题
问题修复方案
问题根源分析
- 网络配置冲突:node_2同时设置了
network_mode: 'host'和自定义bridge网络network_cockroachdb,导致Docker网络规则混乱,端口转发逻辑冲突,出现端口串用问题。 - SSL配置不匹配:CockroachDB集群以
--insecure启动(无SSL加密),但Go代码中SSLMode设置为verify-full,强制要求SSL验证,直接导致连接失败。 - 端口映射错误: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;"
验证步骤
- 重启Docker Compose集群:
docker-compose down && docker-compose up -d - 访问
http://localhost:8080(node_2控制台),确认两个节点已成功加入集群。 - 启动Go应用,检查日志是否输出
database connected successfully。
内容的提问来源于stack exchange,提问作者vovanchello
相关产品推荐
相关产品推荐

