簡體   English   中英

無法連接到mysql docker鏡像連接被拒絕

[英]Can not connect to mysql docker image connection refused

我剛剛將我的舊公司計算機更換為新計算機(MACOS),下載項目,現在我嘗試連接到 mysql docker 映像,但我總是得到

撥 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一切正常,您可以查看 Adminer 正在處理數據的下一張圖像: 在此處輸入圖片說明

在此處輸入圖片說明 在此處輸入圖片說明

這是我連接到 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 文件中。

要解決這個問題,您有兩種解決方案:

  1. 如果尚未完成,則通過對代碼進行 Docker 化將您的應用程序添加到您的 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()
}

如果您不想 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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM