我正在尝试连接我的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
3条答案
按热度按时间lf5gs5x21#
首先,您应该了解docker中的网络是如何工作的。每个正在运行的容器都将被视为单个虚拟节点。他们有自己的ip来互相连接。在您的例子中,将有2个运行容器,1个用于go,1个用于sqlserver。所以有一个go容器想要连接到sqlserver容器。地址
127.0.0.1
或者localhost
意思是它自己(一个环回地址)。要连接它,可以使用容器名称作为地址(因为ip是随机分配的)。实际上它转换成ip,docker为你做这个。根据你的 Docker 跑上面,它应该是sql1
.希望有帮助。
ig9co6j12#
也许你应该
Ping()
当你连接数据库的时候。dddzy1tm3#
从docker容器到本地mysql服务器都有同样的问题,诀窍是评论
bind-address
在my.cnf
. 通常它只绑定到环回地址,拒绝外部包括docker网络的连接。你可以尝试创建一个my.cnf
如下图所示,通过volume(-v)
.