Не удается подключиться к MySQL - PullRequest
0 голосов
/ 29 августа 2018

Я только что заменил свой старый компьютер компании на новый (MACOS), загрузил проекты, и теперь я пытаюсь подключиться к образу MySQL Docker, но я всегда получаю

dial 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, все работает, вы можете проверить следующее изображение, которое Администратор работает с данными: enter image description here

enter image description here enter image description here

Это мой код Golang для подключения к mysql:

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

Вы знаете, что я делаю неправильно?

Спасибо

1 Ответ

0 голосов
/ 29 августа 2018

Проблема в том, что ваш код go не может разрешить адрес mysql, так как он не развернут в файле compose.

Чтобы исправить это, у вас есть два решения:

  1. Добавьте ваше приложение в файл 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()
}

Второе решение, если вы не хотите докеризировать свое приложение, это просто изменить код на:

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