【问题标题】:Unable to connect to mysql server with go and docker - dial tcp 127.0.0.1:3306: connect: connection refused无法使用 go 和 docker 连接到 mysql 服务器 - 拨号 tcp 127.0.0.1:3306:连接:连接被拒绝
【发布时间】:2019-03-01 10:33:50
【问题描述】:

我在我的 Mac 上安装了 Mysql 社区服务器,它已设置并正在运行,我可以使用 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"

任何帮助将不胜感激,谢谢。

【问题讨论】:

标签: mysql database docker go docker-compose


【解决方案1】:

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

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

(有关此解决方法的更多详细信息,请参阅Docker docs。)

【讨论】:

  • 这行得通,谢谢 :) 谢谢你的解释。我猜是因为这是一种我不应该这样做的解决方法,使用 docker-compose 使用 MySQL 开发的正确方法是什么? (我对 docker 很陌生)
  • 这种方法本身并没有错。它的好处是您的数据库数据可以持久保存——即,如果您意外破坏了 MySQL 容器,数据不会消失,您也不必担心将主机卷映射到这样的容器,这更复杂。另一种方法是在 Docker 中托管一个 MySQL 实例,并以相同的方式使用 Docker Compose 进行设置。此时,您将获得 Docker 的内部容器到容器网络功能。 docker.for.mac.localhost 的主要好处是 Docker 守护进程会自动将该名称映射到主机 IP。
  • 谢谢你,我真的很感激 :)
【解决方案2】:

你应该这样打开:

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

mysql 是 docker-compose 服务名称。

【讨论】:

    【解决方案3】:

    我的解决方案最终是这个页面上答案的组合。我收到了错误:

    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")
    

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

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 2019-12-25
      • 2020-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2018-12-26
      相关资源
      最近更新 更多