如何使用 dockercompose 连接到 CockroachDB?

2024年 2月 15日 92.7k 0

如何使用 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。如何解决这个问题?

解决方法

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

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

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

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

  • 您的撰写文件将无法启动 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"

    登录后复制

  • 您的 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 上公开。

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

    以上就是如何使用 docker-compose 连接到 CockroachDB?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论