Py学习  »  docker

尝试使用Docker将Golang连接到MSSQL服务器时连接被拒绝

user10560513 • 4 年前 • 785 次点击  

我正在尝试将我的golang程序连接到使用docker在容器上运行的mssql服务器。戈朗号也在码头集装箱上运行。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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47174
 
785 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Ntwobike
Reply   •   1 楼
Ntwobike    5 年前

从Docker容器到本地MySQL服务器都有同样的问题,技巧是评论 bind-address 在里面 my.cnf 是的。通常它只绑定到环回地址,拒绝外部包括Docker网络的连接。您可以尝试创建 我的.cnf 如下所示,并通过 volume(-v) 是的。

#bind-address                   = 127.0.0.1
Laily
Reply   •   2 楼
Laily    5 年前

也许你应该 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() 并不意味着数据库连接正确。

否则,就像达摩所说,你的数据库主机是错误的。 希望这能帮助你。

Dharma Saputra
Reply   •   3 楼
Dharma Saputra    5 年前

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

希望有帮助。