Не удалось пропинговать докер mysql db в golang

Я новичок в golang, docker и mysql. Я пытаюсь подключиться к mysql, работающему в докере локально на моем macos, используя golang.

Вот код:

`package main

import (
    "context"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "log"
    "time"
)

func dbConn() *sql.DB {
    db, err := sql.Open("mysql", "root:Abc123$#@tcp(172.17.0.2:3306)/test")
    if err != nil {
        log.Printf("Error %s when opening DB connection\n", err)
        return nil
    }
    db.SetMaxOpenConns(10)
    db.SetMaxIdleConns(10)
    db.SetConnMaxLifetime(time.Minute * 2)

    ctx, cancelfunc := context.WithTimeout(context.Background(), time.Second)
    defer cancelfunc()
    err = db.PingContext(ctx)
    if err != nil {
        log.Printf("Error %s pinging DB", err)
        return db
    }
    log.Print("Connected to the DB successfully\n")

    defer func() {
        err := db.Close()
        if err != nil {
            log.Print(err)
        }
    }()
    return db
}

func main() {
    db := dbConn()
    defer db.Close()
}`

Я запускаю докер со следующей командой:

docker run --name mysql -e MYSQL_ROOT_PASSWORD=abcd1234 -p 3306:3306 -d mysql:8.0.30

Я получаю следующую ошибку:

Error dial tcp 172.17.0.2:3306: i/o timeout pinging DB

докер работает локально. Я создал тестовую БД с командной строкой:

`mysql> create database test_db;`

а потом сделал


mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+
6 rows in set (0.00 sec)

Пожалуйста, помогите мне понять мою ошибку здесь? Или что мне не хватает?

Откуда взялся IP-адрес 172.17.0.2? Из описания это звучит как Из контейнера Docker, как мне подключиться к локальному хосту машины? может решить ваш вопрос (на хосте MacOS используйте host.docker.internal для доступа к экземпляру MySQL или чему-либо еще, работающему вне контейнера).

David Maze 10.10.2022 04:08

Я пробовал с 127.0.0.1 в golang и использовал --bind-address = 127.0.0.1 для запуска докера. Я вижу следующую ошибку: Ошибка набора tcp 127.0.0.1:3306: соединение: соединение отказано в пинге БД

HSAR 10.10.2022 08:18

Спасибо за предложение @DavidMaze. Я получил указанный выше IP-адрес из NetworkSettings.IPAddress из проверки докеров.

HSAR 10.10.2022 08:28

Я также попытался добавить host.docker.internal с docker-compose.yml, как показано ниже: version: '3' services: mysql-development: image: mysql:8.0.30 environment: MYSQL_ROOT_PASSWORD: abc123 MYSQL_DATABASE: tophits ports: - "3306:3306" extra_hosts: - "host.docker.internal:host-gateway" Это тоже не помогло. Я вижу, что тайм-аут ввода-вывода пингует ошибку БД.

HSAR 10.10.2022 08:54

Я не уверен, что это работает, я думаю, вы должны войти в докер и войти в MySQL: 1. используйте MySQL; 2. проверить хост и пользователя: 'выбрать хост, пользователя из пользователя'; 3. если для пользователя «root» нет хоста, вы можете создать, обновить и предоставить привилегию.

Guolei 10.10.2022 10:34

IP-адрес docker inspect бесполезен, особенно в MacOS; никогда не смотрите это. Вы Подключаетесь к Postgresql в контейнере докеров извне (механика не зависит от базы данных)?

David Maze 10.10.2022 11:41

host.docker.internal помог. Спасибо @DavidMaze, я создал отдельного пользователя и предоставил ему привилегии. Это помогло. Спасибо за помощь. СОЗДАЙТЕ пользователя «user2» @ «172.19.0.1», ИДЕНТИФИЦИРОВАННОГО «xyz1234»; ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА . TO 'user2'@'172.19.0.1' С ПРЕДОСТАВЛЕНИЕМ ОПЦИИ;

HSAR 10.10.2022 23:29
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
7
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я использовал host.docker.internal в этом файле docker-compose.yml для создания сервера mysql в докере.

version: '3'

services:

  mysql-development:
    image: mysql:8.0.30
    environment:
  MYSQL_ROOT_PASSWORD: xyz1234
  MYSQL_DATABASE: test
  ports:
    - "3306:3306"
  extra_hosts:
    - "host.docker.internal:host-gateway"

Использовал это для запуска образа докера:

docker-compose -f docker-compose.yml up

Затем подключился к экземпляру docker mysql, используя:

docker exec -it 24f058c73227 mysql -P 3306 --protocol=tcp -u root -p

Затем создал отдельного пользователя и предоставил все привилегии новому пользователю.

mysql> CREATE user ‘user2’@‘172.19.0.1' IDENTIFIED BY ‘xyz1234’;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'user2'@'172.19.0.1' WITH GRANT 
OPTION;

Это помогло мне подключиться к серверу mysql, работающему на докере локально на macos.

Другие вопросы по теме