首頁  >  文章  >  後端開發  >  如何使用 docker-compose 連接到 CockroachDB?

如何使用 docker-compose 連接到 CockroachDB?

王林
王林轉載
2024-02-15 12:03:091022瀏覽

如何使用 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 上公開。

最後,您可能想要建立磁碟區來保存資料庫資料。請參閱例如此文件安裝磁碟區。

以上是如何使用 docker-compose 連接到 CockroachDB?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除