Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyambung ke CockroachDB menggunakan docker-compose?

Bagaimana untuk menyambung ke CockroachDB menggunakan docker-compose?

王林
王林ke hadapan
2024-02-15 12:03:091017semak imbas

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

editor php Strawberry akan memperkenalkan kepada anda cara menggunakan docker-compose untuk menyambung ke CockroachDB. Docker-compose ialah alat untuk mentakrifkan dan menjalankan berbilang bekas Docker, dan CockroachDB ialah sistem pengurusan pangkalan data hubungan teragih. Dengan menggunakan docker-compose, kami boleh membuat dan mengurus bekas CockroachDB dengan mudah dan menyambungkannya dengan bekas lain. Dalam artikel ini, kami akan memperincikan cara mengkonfigurasi fail karang docker anda untuk menyambung ke CockroachDB dan memberikan beberapa petua dan pertimbangan praktikal. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberi anda panduan berguna untuk membantu anda mula dengan cepat menggunakan docker-compose untuk menyambung ke CockroachDB.

Kandungan soalan

Saya mempunyai fail karang docker di mana saya menggunakan pangkalan data dan menggunakan aplikasi secara setempat

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

Pergi ke fail:

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)
    }
}

Sambungan ke pangkalan data diwujudkan. Tetapi sambungan gagal, dan port yang salah telah dimajukan: bukannya 26257, ia adalah 26258. Bagaimana untuk menyelesaikan masalah ini?

Penyelesaian

  1. Jangan gunakan links; ciri ini telah ditamatkan selama bertahun-tahun dan dikekalkan hanya untuk keserasian ke belakang. Docker mengekalkan DNS untuk bekas, jadi anda hanya perlu menggunakan nama perkhidmatan sebagai nama hos apabila membuat sambungan.

  2. Anda tidak boleh memajukan port dengan network_mode 结合使用:host.

  3. Penggunaan depends_on anda secara berkesan adalah tanpa operasi; kemungkinan besar aplikasi anda akan cuba menyambung ke pangkalan data sebelum pangkalan data bersedia untuk mengendalikan sambungan.

    Malah, kluster pangkalan data anda tidak akan menerima sambungan sehingga anda menjalankan cockroach init jadi anda pasti menghadapi masalah ini.

  4. Fail karang anda akan gagal dilancarkan node_1 dengan ralat berikut:

    * 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. Pemajuan port node_1 anda tidak betul; Anda mungkin mahukan sesuatu seperti:

    ports:
      - 8081:8080

Akhir sekali, anda tidak menunjukkan dari mana storage modul dalam kod contoh anda berasal, jadi saya tidak boleh menggunakannya untuk ujian. Saya menulis program ujian ini yang termasuk gelung menunggu pangkalan data untuk menerima sambungan:

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")
}

Jika kami menyelesaikan semua masalah di atas dan membersihkan fail karang, kami akan mendapat:

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

Sila ambil perhatian bahawa konfigurasi ini sengaja tidak menerbitkan port pangkalan data pada hos, kerana ini tidak diperlukan untuk aplikasi mengakses pangkalan data.

Apabila kita docker 编写 konfigurasi ini, kita akan melihat perkara berikut daripada perkhidmatan pangkalan data:

* 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.

Dan yang berikut dalam aplikasi sampel (kami jangkakan):

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...

Kita perlu memulakan pangkalan data:

docker compose exec node_1 ./cockroach init --insecure --host=node_1

Selepas itu kita melihat perkara berikut dari perkhidmatan pangkalan data:

CockroachDB node starting at 2023-09-01 12:54:38.494304014 +0000 UTC m=+77.639236046 (took 77.4s)
[...]

Contoh aplikasi dapat menyambung dan melaksanakan pertanyaan:

2023/09/01 12:54:38 connected to database
All done.

UI web untuk nod ini akan didedahkan pada port hos 80808081.

Akhir sekali, anda mungkin mahu mencipta volum untuk menyimpan data pangkalan data anda. Lihat cth. dokumen ini volum pelekap.

Atas ialah kandungan terperinci Bagaimana untuk menyambung ke CockroachDB menggunakan docker-compose?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam