无法使用 go 和 docker 连接到 mysql 服务器 - dial tcp 127.0.0.1:3306: connect: connection denied

wil*_*205 6 mysql database go docker docker-compose

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

dial tcp 127.0.0.1:3306: connect: connection refused
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

// 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()
Run Code Online (Sandbox Code Playgroud)

我正在进口:

"database/sql"
_ "github.com/go-sql-driver/mysql"
Run Code Online (Sandbox Code Playgroud)

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

Cos*_*age 10

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

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

Docker 文档中提供了有关此解决方法的更多详细信息。)

  • 这种方法没有本质上的错误。它的好处是你的数据库数据是持久的——也就是说,如果你不小心破坏了一个 MySQL 容器,数据不会消失,你也不必担心将主机卷映射到这样一个更复杂的容器中。另一种方法是在 Docker 中托管一个 MySQL 实例,并以相同的方式使用 Docker Compose 进行设置。此时您将获得 Docker 的内部容器到容器网络功能。`docker.for.mac.localhost` 的主要好处是 Docker 守护进程会自动将该名称映射到主机 IP。 (2认同)

小智 6

你应该这样打开:

db, err := sql.Open("mysql", "root:root@tcp(mysql:3306)/GoLife")
Run Code Online (Sandbox Code Playgroud)

mysql 是 docker-compose 服务名称。