我正在尝试将golang程序连接到使用docker在容器上运行的mssql服务器。 golang也正在docker容器上运行。 go脚本似乎能够成功连接到数据库,但是无法对其执行任何操作。因此,
db, err := sql.Open("mysql","SA:YourStrong!Passw0rd@tcp(127.0.0.1:1433)/")
if err != nil {
panic(err)
}
defer db.Close()
fmt.Println("Success open database")
这会打印出“成功打开数据库”,但是下一部分代码会出现紧急情况,
_,err = db.Exec("CREATE DATABASE currency1")
if err != nil {
panic(err)
}
fmt.Println("Success CREATE database")
使用docker构建并运行它之后,这就是我得到的
GO MYSQL START
Success open database
panic: dial tcp 127.0.0.1:1433: getsockopt: connection refused
这是我用来运行mssql
数据库的命令:
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=YourStrong!Passw0rd' -e 'MSSQL_PID=Express' -p 1433:1433 --name sql1 -d microsoft/mssql-server-linux:latest
答案 0 :(得分:0)
首先,您应该了解docker中的网络如何工作。每个正在运行的容器将被视为单个虚拟节点。它们具有自己的IP,可以相互连接。在您的情况下,将有2个正在运行的容器,1个用于Go,1个用于SQLServer。因此,有Go容器想要连接到SQLServer容器。地址127.0.0.1
或localhost
表示它是自己的(回送地址)。要连接它,您可以使用容器名称作为地址(因为IP是随机分配的)。实际上,它已转换为IP,docker会为您完成。根据您在上面运行的docker,它应该为sql1
。
希望有帮助。
答案 1 :(得分:0)
也许在连接数据库时应该Ping()
。
db, err := sql.Open("mysql","SA:YourStrong!Passw0rd@tcp(127.0.0.1:1433)/")
if err != nil {
panic(err)
}
if err := db.Ping();err!=nil{
panic(err)
}
defer db.Close()
fmt.Println("Success open database")
Open()
并不意味着正确连接数据库。
否则,就像Dhama所说的那样,您的数据库主机是错误的。 希望对您有所帮助。
答案 2 :(得分:0)
从docker容器到本地mysql服务器,同样存在同样的问题,诀窍是在bind-address
中注释my.cnf
。通常,它仅绑定到环回地址,并拒绝来自外部的连接,包括docker network。您可以尝试创建如下所示的my.cnf
并通过volume(-v)
将其安装到mysql配置。
#bind-address = 127.0.0.1