簡體   English   中英

從 golang 應用程序連接到 docker postgres

[英]Connect to docker postgres from golang application

我正在嘗試從 golang 代碼連接到 docker postgres 數據庫。 用於創建 postgres 容器的命令: docker run -d -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password --name my-postgres -p 5432:5432 postgres創建數據庫我運行:

PS C:\Users\Aylin\Desktop\farmers> docker exec -it my-postgres bash
root@8969058907f8:/# psql -U postgres
psql (13.2 (Debian 13.2-1.pgdg100+1))
Type "help" for help.

postgres=# CREATE DATABASE test_db;
CREATE DATABASE
postgres=# \q

I can connect to this database from pgadmin docker container: docker run --rm -p 5050:5050 thajeztah/pgadmin4 using the IP address returned by docker inspect my-postgres command as Host name/address for a new server in pgAdmin 4

"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2", -> host address

但是,當我嘗試使用相同的參數從應用程序連接到數據庫時,出現以下錯誤:

[2021-04-20 17:04:43]  sql: database is closed 
dial tcp 172.17.0.2:5432: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

Go 代碼:

const (
    host     = "172.17.0.2"
    user     = "postgres"
    password = "password"
    dbname   = "test_db"
    port     = 5432
)

func FetchConnection() *gorm.DB {

    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)

    db, err := gorm.Open("postgres", psqlInfo)
}

我怎樣才能使這段代碼工作? 謝謝

一旦你啟動了一個帶有docker run -p選項的容器,對於非容器進程,它看起來就像在該端口上偵聽的任何其他服務器進程一樣。

如果:

  • 宿主進程和 Docker 容器運行在同一個宿主(或同一個虛擬機)上;
  • 您已經使用正確的-p HOST:CONTAINER端口映射啟動了容器;
  • 您沒有在 VM 中運行 Docker Toolbox 或 Docker

然后宿主進程可以使用localhost作為主機名和第一個-p端口號來訪問容器進程。

切勿使用docker inspect或其他方式查找容器私有 IP 地址。 它在大多數常見設置中是無法訪問的(它僅在您位於同一本機 Linux 主機上時才有效;而不是來自其他主機、VM 或 MacOS 或 Windows 上)並且從不需要。 同樣,您通常不需要使用docker exec或其他調試工具來訪問您的數據庫,因為您可以使用像psql這樣的普通客戶端與已發布的端口通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM