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

pkbketx9  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(511)

我正在尝试连接我的golang程序到一个mssql服务器,我使用docker在一个容器上运行。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")

这会打印出“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
igsr9ssn

igsr9ssn1#

从docker容器到本地mysql服务器都有同样的问题,诀窍是评论 bind-addressmy.cnf . 通常它只绑定到环回地址,拒绝外部包括docker网络的连接。你可以尝试创建一个 my.cnf 如下图所示,通过 volume(-v) .


# bind-address                   = 127.0.0.1
h9vpoimq

h9vpoimq2#

也许你应该 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()` 并不意味着数据库连接正确。
否则,就像达玛说的,你的数据库主机是错误的。希望这能对你有所帮助。
jmp7cifd

jmp7cifd3#

首先,您应该了解docker中的网络是如何工作的。每个正在运行的容器都将被视为单个虚拟节点。他们有自己的ip来互相连接。在您的例子中,将有2个运行容器,1个用于go,1个用于sqlserver。所以有一个go容器想要连接到sqlserver容器。地址 127.0.0.1 或者 localhost 意思是它自己(一个环回地址)。要连接它,可以使用容器名称作为地址(因为ip是随机分配的)。实际上它转换成ip,docker为你做这个。根据你的 Docker 跑上面,它应该是 sql1 .
希望有帮助。

相关问题