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

unftdfkk  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(479)

我刚刚更换了一台新的公司电脑(macos),下载了项目,现在我试图连接到mysql docker映像,但我总是得到
拨打tcp 127.0.0.1:3306:连接:连接被拒绝
在我的旧电脑里一切正常,但现在我有这个问题。
我的docker撰写(不显示所有内容):

  1. version: "3"
  2. services:
  3. mysql:
  4. image: mysql:5.6
  5. ports:
  6. - "3306:3306"
  7. volumes:
  8. - mysql-data:/var/lib/mysql
  9. - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
  10. environment:
  11. MYSQL_ROOT_PASSWORD: a
  12. LANG: C.UTF-8
  13. adminer:
  14. image: adminer
  15. ports:
  16. - 8082:8080
  17. nginx:
  18. build: ../docker-shared/nginx
  19. ports:
  20. - 443:443
  21. volumes:
  22. - "./nginx_proxy_settings.conf:/etc/nginx/conf.d/nginx_proxy_settings.conf"
  23. volumes:
  24. mysql-data:

所以如果我做一个 docker-compose up 一切正常,您可以签入管理员正在处理数据的下一个图像:



这是我连接mysql的golang代码:

  1. func main() {
  2. dbConfig := mysql.NewConfig()
  3. dbConfig.User = "root"
  4. dbConfig.Passwd = "a"
  5. dbConfig.Addr = "mysql"
  6. dbConfig.DBName = "company_prod"
  7. db, err := sql.Open("mysql", dbConfig.FormatDSN())
  8. if err != nil {
  9. panic(err)
  10. }
  11. defer db.Close()
  12. }

你知道我做错了什么吗??
谢谢您

hmtdttj4

hmtdttj41#

问题是您的go代码无法解决 mysql 地址,因为它没有部署在compose文件中。
要解决这个问题,有两种解决方案:
将你的应用程序添加到docker compose文件中,如果你的代码还没有完成,那么它应该能够连接到你的mysql容器。
公开mysql容器的端口并更改go代码中使用的地址 mysqllocalhost:3306 (我看到您编辑了compose,端口也暴露了,所以您只需要更改代码中的地址)
对于第一个解决方案,您可以将一个简单的go应用程序构建到docker映像中,如下所示:

  1. # Build stage
  2. FROM golang:alpine AS build-env
  3. COPY . /go/src/your/project/path
  4. WORKDIR /go/src/your/project/path
  5. RUN apk update && \
  6. apk upgrade && \
  7. <install your deps here if needed>
  8. # Install dep if needed
  9. ENV DEP_VERSION="0.4.1"
  10. RUN curl -L -s https://github.com/golang/dep/releases/download/v${DEP_VERSION}/dep-linux-amd64 -o $GOPATH/bin/dep
  11. RUN chmod +x $GOPATH/bin/dep
  12. RUN dep ensure
  13. # Build your app
  14. RUN go build -o myapp
  15. # Final stage
  16. FROM alpine
  17. WORKDIR /app/myapp
  18. COPY --from=build-env /go/src/your/project/path /app/myapp
  19. ENTRYPOINT ["/app/myapp/myapp"]

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

  1. version: "3"
  2. services:
  3. mysql:
  4. image: mysql:5.6
  5. ports:
  6. - "3306:3306"
  7. volumes:
  8. - mysql-data:/var/lib/mysql
  9. - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
  10. environment:
  11. MYSQL_ROOT_PASSWORD: a
  12. LANG: C.UTF-8
  13. adminer:
  14. image: adminer
  15. ports:
  16. - 8082:8080
  17. myapp:
  18. build: .
  19. depends_on:
  20. - mysql
  21. nginx:
  22. build: ../docker-shared/nginx
  23. ports:
  24. - 443:443
  25. volumes:
  26. - "./nginx_proxy_settings.conf:/etc/nginx/conf.d/nginx_proxy_settings.conf"
  27. volumes:
  28. mysql-data:

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

  1. func main() {
  2. dbConfig := mysql.NewConfig()
  3. dbConfig.User = "root"
  4. dbConfig.Passwd = "a"
  5. dbConfig.Addr = "mysql:3306"
  6. dbConfig.DBName = "websays_prod"
  7. dbConfig.Net = "tcp"
  8. db, err := sql.Open("mysql", dbConfig.FormatDSN())
  9. if err != nil {
  10. panic(err)
  11. }
  12. defer db.Close()
  13. }

第二个解决方案是,如果您不想将应用程序停靠,只需将代码更改为:

  1. func main() {
  2. dbConfig := mysql.NewConfig()
  3. dbConfig.User = "root"
  4. dbConfig.Passwd = "a"
  5. dbConfig.Addr = "localhost:3306"
  6. dbConfig.DBName = "websays_prod"
  7. dbConfig.Net = "tcp"
  8. db, err := sql.Open("mysql", dbConfig.FormatDSN())
  9. if err != nil {
  10. panic(err)
  11. }
  12. defer db.Close()
  13. }
展开查看全部

相关问题