尝试使用docker将Golang连接到mssql服务器时拒绝连接

时间:2018-10-26 00:47:22

标签: mysql docker go connection-refused

我正在尝试将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

3 个答案:

答案 0 :(得分:0)

首先,您应该了解docker中的网络如何工作。每个正在运行的容器将被视为单个虚拟节点。它们具有自己的IP,可以相互连接。在您的情况下,将有2个正在运行的容器,1个用于Go,1个用于SQLServer。因此,有Go容器想要连接到SQLServer容器。地址127.0.0.1localhost表示它是自己的(回送地址)。要连接它,您可以使用容器名称作为地址(因为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