无法连接到mysql docker映像连接被拒绝

无法连接到mysql docker映像连接被拒绝,mysql,docker,go,docker-compose,Mysql,Docker,Go,Docker Compose,我刚刚更换了一台新的公司电脑(MACOS),下载了这些项目,现在我正试图连接到mysql docker映像,但我总是能找到它 拨打tcp 127.0.0.1:3306:连接:连接被拒绝 在我的旧电脑里,一切正常,但现在我解决了这个问题 My docker compose(不显示所有内容): 因此,如果我做了一个docker compose up一切正常,您可以在管理员处理数据的下一个图像中进行检查: 这是我连接mysql的Golang代码: func main() { dbCon

我刚刚更换了一台新的公司电脑(MACOS),下载了这些项目,现在我正试图连接到mysql docker映像,但我总是能找到它

拨打tcp 127.0.0.1:3306:连接:连接被拒绝

在我的旧电脑里,一切正常,但现在我解决了这个问题

My docker compose(不显示所有内容):

因此,如果我做了一个
docker compose up
一切正常,您可以在管理员处理数据的下一个图像中进行检查:

这是我连接mysql的Golang代码:

func main() {

    dbConfig := mysql.NewConfig()
    dbConfig.User = "root"
    dbConfig.Passwd = "a"
    dbConfig.Addr = "mysql"
    dbConfig.DBName = "company_prod"

    db, err := sql.Open("mysql", dbConfig.FormatDSN())
    if err != nil {
        panic(err)
    }
    defer db.Close()
}
你知道我做错了什么吗


谢谢

问题是您的go代码无法解析
mysql
地址,因为它没有部署在compose文件中

要解决这一问题,您有两种解决方案:

  • 将你的应用程序添加到docker compose文件中,如果你的代码还没有完成,那么它应该能够连接到你的mysql容器
  • 公开mysql容器的端口,并将go代码中使用的地址从
    mysql
    更改为
    localhost:3306
    (我看到您编辑了compose,端口也公开了,所以您只需要更改代码中的地址)
  • 对于第一个解决方案,您可以将一个简单的Go应用程序构建到Docker映像中,如下所示:

    # Build stage
    FROM golang:alpine AS build-env
    
    COPY . /go/src/your/project/path
    WORKDIR /go/src/your/project/path
    
    RUN apk update && \
        apk upgrade && \
        <install your deps here if needed>
    
    # Install dep if needed
    ENV DEP_VERSION="0.4.1"
    RUN curl -L -s https://github.com/golang/dep/releases/download/v${DEP_VERSION}/dep-linux-amd64 -o $GOPATH/bin/dep
    RUN chmod +x $GOPATH/bin/dep
    RUN dep ensure
    
    # Build your app
    RUN go build -o myapp
    
    # Final stage
    FROM alpine
    
    WORKDIR /app/myapp
    COPY --from=build-env /go/src/your/project/path /app/myapp
    ENTRYPOINT ["/app/myapp/myapp"]
    
    并将端口和传输添加到应用程序的代码中:

    func main() {
    
        dbConfig := mysql.NewConfig()
        dbConfig.User = "root"
        dbConfig.Passwd = "a"
        dbConfig.Addr = "mysql:3306"
        dbConfig.DBName = "websays_prod"
        dbConfig.Net = "tcp"
    
        db, err := sql.Open("mysql", dbConfig.FormatDSN())
        if err != nil {
            panic(err)
        }
        defer db.Close()
    }
    
    第二个解决方案是,如果您不想将应用程序dockerize,只需将代码更改为:

    func main() {
    
        dbConfig := mysql.NewConfig()
        dbConfig.User = "root"
        dbConfig.Passwd = "a"
        dbConfig.Addr = "localhost:3306"
        dbConfig.DBName = "websays_prod"
        dbConfig.Net = "tcp"
    
        db, err := sql.Open("mysql", dbConfig.FormatDSN())
        if err != nil {
            panic(err)
        }
        defer db.Close()
    }
    

    尝试添加
    dbConfig.Net=“tcp”
    ?端口也应该添加到地址中,因此它应该是
    mysql:3306
    而不仅仅是
    mysql
    首先感谢您的响应,我尝试了dbConfig.Net=“tcp”,现在我遇到了以下错误:拨打tcp:lookup mysql:没有这样的主机,向mysql添加端口不起作用:SAh,刚刚意识到你的go应用程序不在你的撰写文件中。这意味着它将无法解析
    mysql
    。如果您不希望go应用程序位于compose文件中,则必须公开mysql容器的端口(通过添加
    端口:3306:3306
    ),并使用
    localhost:3306
    作为go应用程序中的地址。这是什么意思?你试过我的建议了吗?
    func main() {
    
        dbConfig := mysql.NewConfig()
        dbConfig.User = "root"
        dbConfig.Passwd = "a"
        dbConfig.Addr = "mysql:3306"
        dbConfig.DBName = "websays_prod"
        dbConfig.Net = "tcp"
    
        db, err := sql.Open("mysql", dbConfig.FormatDSN())
        if err != nil {
            panic(err)
        }
        defer db.Close()
    }
    
    func main() {
    
        dbConfig := mysql.NewConfig()
        dbConfig.User = "root"
        dbConfig.Passwd = "a"
        dbConfig.Addr = "localhost:3306"
        dbConfig.DBName = "websays_prod"
        dbConfig.Net = "tcp"
    
        db, err := sql.Open("mysql", dbConfig.FormatDSN())
        if err != nil {
            panic(err)
        }
        defer db.Close()
    }