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