无法使用go和docker连接到mysql服务器-拨打TCP 127.0.0.1:3306:连接:连接被拒绝

时间:2018-09-25 18:06:22

标签: mysql database docker go docker-compose

我在Mac上安装了Mysql Community Server,它已设置并且正在运行,我可以使用Navicat for MySQL在localhost:3306上连接到它。但是,每当我尝试从使用docker-compose运行的go应用程序连接到数据库时,都会出现以下错误:

dial tcp 127.0.0.1:3306: connect: connection refused

这是我的转到代码:

// dbUser, dbPassword, & dbName are all variables that definitely contain the correct values
db, err = sql.Open("mysql", dbUser+":"+dbPassword+"@tcp(localhost:3306)/"+dbName)

if err != nil {
    panic(err.Error())
}

defer db.Close()

query, err := db.Query("INSERT INTO test_table(test_field) VALUES(This is a test)")

if err != nil {
    panic(err.Error())
}

defer query.Close()

我正在导入:

"database/sql"
_ "github.com/go-sql-driver/mysql"

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您无法从Docker连接到localhost(尤其是在Mac上,其中Docker在表面下的Linux VM中运行),并且无法访问主机提供的服务。

但是,具有使用特殊主机名docker.for.mac.localhost通过IP地址访问主机的功能。在没有其他Docker网络问题的情况下,修改您的连接字符串以使用docker.for.mac.localhost:3306应该可以解决此问题并允许访问主机上的服务。

(有关此替代方法的更多详细信息,请参见Docker docs。)

答案 1 :(得分:2)

您应该这样打开:

db, err := sql.Open("mysql", "root:root@tcp(mysql:3306)/GoLife")

mysql是docker-compose服务名称。

答案 2 :(得分:1)

我的解决方案最终成为了此页面上答案的组合。我收到错误:

dial tcp 127.0.0.1:3306: connect: connection refused

我的连接是这样构建的:

db, err := sql.Open("mysql",  "root:password@/mydbname?parseTime=true")

我阅读了@Cosmic Ossifrage 的内容,但不确定如何实现它,所以我应用了 Vitah 给出的答案。这不起作用,因为 mysql:3306 不是 docker 理解的位置,因此连接失败。然后,我将 @Cosmic Ossifrage 的解决方案与 Vitah 的解决方案一起应用,以获得工作设置。

db, err:= sql.Open("mysql", "root:password@tcp(docker.for.mac.localhost:3306)/mydbname?parseTime=true")

希望这可以帮助任何寻找答案的人!感谢其他贡献者帮助我拼凑起来