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中文網其他相關文章!

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...

golang ...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1
強大的PHP整合開發環境