如何使用 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 将在主机端口 8080
和 8081
上公开。
最后,您可能希望创建卷来保存数据库数据。参见例如此文档安装卷。
以上是如何使用 docker-compose 连接到 CockroachDB?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...

本文讨论了GO编程中的GO FMT命令,该命令将代码格式化以遵守官方样式准则。它突出了GO FMT在维持代码一致性,可读性和降低样式辩论方面的重要性。 FO的最佳实践

本文介绍在Debian系统下监控PostgreSQL数据库的多种方法和工具,助您全面掌握数据库性能监控。一、利用PostgreSQL内置监控视图PostgreSQL自身提供多个视图用于监控数据库活动:pg_stat_activity:实时展现数据库活动,包括连接、查询和事务等信息。pg_stat_replication:监控复制状态,尤其适用于流复制集群。pg_stat_database:提供数据库统计信息,例如数据库大小、事务提交/回滚次数等关键指标。二、借助日志分析工具pgBadg
