我正在尝试从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我可以从pgadmin docker容器:docker run --rm -p 5050:5050 thajeztah/pgadmin4连接到此数据库,使用docker inspect my-postgres命令返回的IP地址作为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)
}我怎样才能让这段代码工作呢?谢谢
发布于 2021-04-20 21:30:51
一旦您使用docker run -p选项启动了一个容器,对于非容器进程,它看起来就像侦听该端口的任何其他服务器进程一样。
如果:
-p HOST:CONTAINER端口映射启动了容器;中运行Docker
然后,主机进程可以使用localhost作为主机名和第一个-p端口号来访问容器进程。
切勿使用docker inspect或其他方式查找容器内网IP地址。它在大多数常见设置中都是无法访问的(仅当您在同一本机Linux主机上时才有效;不能从其他主机、虚拟机或MacOS或Windows上访问),并且从不需要。类似地,您通常不需要使用docker exec或其他调试工具来访问数据库,因为您可以使用像psql这样的普通客户机与发布的端口通信。
https://stackoverflow.com/questions/67179620
复制相似问题