西西有點東西

我只是想找個地方記錄

docker 內資料庫建立及連線說明

本文章生命週期剩餘 208 天,結束後可能出現圖片丟失及檔案連結錯誤。

自架服務使用 Docker-Compose 很正常,一直一來都是半路出家的使用,都沒什麼問題,直到整合 blinko、linkwarden 及 ollama 之後,才發現原來之前的使用方式有點問題。

這陣子每次只要更新 blinko 就很容易出現資料庫連線錯誤的訊息,看了 log 並且詢問 AI 之後總算是弄懂為什麼及怎麼避免。我把全部的服務都放在同一個內網,名稱是ollama-network,想要將有支援 AI 的統統以http:ollama:11434連結執行,這個想法沒有錯也很好,但是因為我的資料庫是以服務來區分,意思就是blinko裡面有個POSTGRES名稱的資料庫,而linkwarden裡面也有個相同名稱的資料庫,這要是放在不同網路下是沒有問題的,但是放在一起之後很容易一更新就會連到錯誤的資料庫,造成連接出錯。而修正方式就是把Docker-Compose的名稱更改就好,以下就是資料庫名稱的修正說明

1. Docker 內資料庫連線說明

當你在 .envdocker-compose.yml 中看到這樣的連線字串:

DATABASE_URL=postgresql://blinko:Ui4VTuXgi0@blinko-postgres:5432/blinko

這是一種標準的 PostgreSQL 連線 URL 格式,用來讓應用程式知道要怎麼連接資料庫。


1.1. 格式結構說明

postgresql://<使用者名稱>:<密碼>@<主機名稱>:<埠號>/<資料庫名稱>

1.2. 詳解這一行

postgresql://blinko:Ui4VTuXgi0@blinko-postgres:5432/blinko
區塊 說明
postgresql:// 這是協定(protocol),表示使用 PostgreSQL 資料庫。
blinko 資料庫使用者帳號,對應 POSTGRES_USER=blinko
Ui4VTuXgi0 使用者密碼,對應 POSTGRES_PASSWORD=Ui4VTuXgi0
(實務中應避免硬編碼,改用 .env 變數較安全)
blinko-postgres 資料庫主機位址,這裡是 Docker Compose 內部的服務名稱,不是 IP。其他容器會透過這個名稱連線。
5432 資料庫的 port,PostgreSQL 預設就是 5432
/blinko 資料庫名稱,對應 POSTGRES_DB=blinko

1.3. 實務補充

  1. 容器之間使用服務名稱當作 DNS 名稱是 Docker 的特性

    • 所以 @blinko-postgres 不需要換成 IP,只要確定在同一 network 中就會通。
  2. 若用在本機測試(非 Docker),你可能需要改成:

    postgresql://blinko:Ui4VTuXgi0@localhost:5432/blinko

1.4. Docker-Compose 範例內容

#服務名稱就是連線的名稱,各個服務更換不同名稱即可定義為不同的資料庫
  blinko-postgres:
    image: postgres:14
    #容器的名稱可以自行設定,不設定的話也沒關係,docker 會隨機定義,如 blinko-postgres-app 這樣
    container_name: blinko-postgres
    restart: always
    environment:
      POSTGRES_DB: blinko
      POSTGRES_USER: blinko
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: Asia/Taipei

歡迎留言分享指教