【问题标题】:Can not connect to mysql docker image connection refused无法连接到 mysql docker 镜像连接被拒绝
【发布时间】:2019-02-04 03:24:37
【问题描述】:

我刚刚用新的(MACOS)替换了我的旧公司计算机,下载项目,现在我试图连接到 mysql docker 映像,但我总是得到 ​​p>

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

在我的旧电脑上一切正常,但现在我遇到了这个问题。

我的 docker compose(未显示所有内容):

version: "3"
services:
  mysql:
    image: mysql:5.6
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: a
      LANG: C.UTF-8
  adminer:
    image: adminer
    ports:
      - 8082:8080
  nginx:
    build: ../docker-shared/nginx
    ports:
      - 443:443
    volumes:
      - "./nginx_proxy_settings.conf:/etc/nginx/conf.d/nginx_proxy_settings.conf"
volumes:
  mysql-data:

因此,如果我执行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()
}

你知道我做错了什么吗?

谢谢

【问题讨论】:

  • 尝试添加dbConfig.Net = "tcp" ?
  • 地址也应该加上端口,所以应该是mysql:3306而不是mysql
  • 首先感谢您的回复,我尝试了 dbConfig.net = "tcp",现在我得到了这个错误: dial tcp: lookup mysql: no such host, 添加端口到 mysql 不起作用: S
  • 啊,刚刚意识到您的 go 应用不在您的撰写文件中。这意味着它将无法解析mysql。如果您不希望您的 go 应用程序出现在 compose 文件中,则必须公开 mysql 容器的端口(通过添加 ports: 3306:3306)并使用 localhost:3306 作为您的 go 应用程序中的地址。跨度>
  • 什么意思?你试过我的建议了吗?

标签: mysql docker go docker-compose


【解决方案1】:

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

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

  1. 通过 Dockerizing 将您的应用程序添加到您的 docker-compose 文件中(如果尚未完成),那么它应该能够连接到您的 mysql 容器。
  2. 暴露你的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"]

然后将其添加到您的撰写文件中:

version: "3"
services:
  mysql:
    image: mysql:5.6
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: a
      LANG: C.UTF-8
  adminer:
    image: adminer
    ports:
      - 8082:8080
  myapp:
    build: .
    depends_on:
      - mysql
  nginx:
    build: ../docker-shared/nginx
    ports:
      - 443:443
    volumes:
      - "./nginx_proxy_settings.conf:/etc/nginx/conf.d/nginx_proxy_settings.conf"
volumes:
  mysql-data:

并将端口和传输添加到您的应用代码中:

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()
}

如果您不想对应用进行 docker 化,第二个解决方案是将您的代码更改为:

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()
}

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-09-18
    • 2020-10-07
    • 2018-06-08
    • 2020-07-04
    相关资源
    最近更新 更多