最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 如何使用 docker-compose 连接到 CockroachDB?

    如何使用 docker-compose 连接到 cockroachdb?

    php小编草莓将为大家介绍如何使用docker-compose连接到CockroachDB。Docker-compose是一个用于定义和运行多个Docker容器的工具,而CockroachDB是一个分布式的关系型数据库管理系统。通过使用docker-compose,我们可以轻松地创建和管理CockroachDB容器,并将其与其他容器连接起来。在本文中,我们将详细介绍如何配置docker-compose文件以连接到CockroachDB,并提供一些实用的技巧和注意事项。无论您是初学者还是有经验的开发者,本文都将为您提供有用的指导,帮助您快速上手使用docker-compose连接到CockroachDB。

    问题内容

    我有一个 docker-compose 文件,我在其中本地部署数据库和 go 应用程序

    services:
          node_1:
              container_name: node_1
              image: cockroachdb/cockroach:latest
              command: start --insecure
              ports:
                  - "26258:26258"
                  - "8081:8081"
              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 
              network_mode: 'host'
          app:
              build: .
              ports:
                - "12121:12121"
              environment:
                app_port: '12121'
                db_host: "node_2"
                db_port: 26257
                db_user: root
                db_password: 123
                db_database: mydb
              depends_on:
                - node_2
              links:
                - node_2
              networks:
                - network_cockroachdb 
        networks:
            network_cockroachdb:
                driver: bridge

    转到文件:

    func main() {  
        port, _ := strconv.Atoi(os.Getenv("db_port"))
    
        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:  "verify-full",
        }
    
        log.Println("url: ", dbConfig.String())
    
        db, err := storage.NewCockroachDB(context.Background(), dbConfig)
    
        if err != nil {
            log.Fatal(err)
        }
    }

    其中建立了与数据库的连接。但连接失败,并且转发了错误的端口:转发的不是 26257,而是 26258。如何解决这个问题?

    解决方法

    1. 不要使用 links;此功能已被弃用多年,仅出于向后兼容性而保留。 Docker 为容器维护 DNS,因此您在建立连接时只需使用服务名称作为主机名即可。

    2. 您不能将端口转发与 network_mode 结合使用:host

    3. 您对 depends_on 的使用实际上是无操作;您的应用程序很可能在数据库准备好处理连接之前尝试连接到数据库。

      事实上,在您运行 cockroach init 之前,您的数据库集群不会接受连接,因此您肯定会遇到此问题。

    4. 您的撰写文件将无法启动 node_1,并出现以下错误:

      * ERROR: ERROR: no --join flags provided to 'cockroach start'
      * HINT: Consider using 'cockroach init' or 'cockroach start-single-node' instead
      *
      ERROR: no --join flags provided to 'cockroach start'
      HINT: Consider using 'cockroach init' or 'cockroach start-single-node' instead
      Failed running "start"
    5. 您的 node_1 端口转发不正确;容器中没有任何内容在侦听端口 8081。您可能需要类似以下内容:

      ports:
        - 8081:8080

    最后,您没有指出示例代码中的 storage 模块来自何处,因此我无法使用它来进行测试。我编写了这个测试程序,其中包括一个等待数据库接受连接的循环:

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "os"
        "time"
    
        pgx "github.com/jackc/pgx/v4"
    )
    
    func main() {
        connectionString := os.Getenv("db_uri")
    
        if connectionString == "" {
            connectionString = fmt.Sprintf("postgresql://%s@%s:%s/%s?sslmode=disable",
                os.Getenv("db_user"),
                os.Getenv("db_host"),
                os.Getenv("db_port"),
                os.Getenv("db_database"),
            )
        }
    
        var conn *pgx.Conn
        var err error
    
        for {
            conn, err = pgx.Connect(context.Background(), connectionString)
            if err == nil {
                break
            }
    
            log.Printf("connection failed (%v); will retry...", err)
            time.Sleep(1 * time.Second)
        }
        log.Printf("connected to database")
    
        var value int
        if err := conn.QueryRow(context.Background(), "select 1").Scan(&value); err != nil {
            panic(err)
        }
    
        fmt.Printf("All done.n")
    }

    如果我们解决上述所有问题并清理撰写文件,我们最终会得到:

    services:
      node_1:
        image: cockroachdb/cockroach:latest
        ports:
          - "8080:8080"
        command:
          - start
          - --insecure
          - --join=node_1,node_2
    
      node_2:
        image: cockroachdb/cockroach:latest
        ports:
          - "8081:8080"
        command:
          - start
          - --insecure
          - --join=node_1,node_2
    
      app:
        build: .
        environment:
          db_host: "node_2"
          db_port: 26257
          db_user: root
          db_password: 123
          db_database: mydb

    请注意,此配置有意不发布主机上的数据库端口,因为应用程序访问数据库不需要这样做。

    当我们 docker 编写 这个配置时,我们将从数据库服务中看到以下内容:

    * INFO: initial startup completed.
    * Node will now attempt to join a running cluster, or wait for `cockroach init`.
    * Client connections will be accepted after this completes successfully.
    * Check the log file(s) for progress.

    以及示例应用程序中的以下内容(我们期望):

    2023/09/01 12:53:20 connection failed (failed to connect to `host=node_2 user=root database=mydb`: dial error (dial tcp 10.89.1.46:26257: connect: connection refused)); will retry...

    我们需要初始化数据库:

    docker compose exec node_1 ./cockroach init --insecure --host=node_1

    之后我们从数据库服务中看到以下内容:

    CockroachDB node starting at 2023-09-01 12:54:38.494304014 +0000 UTC m=+77.639236046 (took 77.4s)
    [...]

    示例应用程序能够连接并执行查询:

    2023/09/01 12:54:38 connected to database
    All done.

    这些节点的 Web UI 将在主机端口 80808081 上公开。

    最后,您可能希望创建卷来保存数据库数据。参见例如此文档安装卷。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 如何使用 docker-compose 连接到 CockroachDB?
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情