Соединение отклонено при попытке подключить Golang к серверу mssql с помощью докера

Я пытаюсь подключить свою программу golang к серверу mssql, который я запускаю в контейнере с помощью докера. golang также работает в докер-контейнере. похоже, что сценарий go может успешно подключиться к базе данных, но не может выполнять с ней никаких операций. Так,

db, err := sql.Open("mysql","SA:YourStrong!Passw0rd@tcp(127.0.0.1:1433)/")

if err != nil {
    panic(err)
}

defer db.Close()
fmt.Println("Success open database")

Это распечатывает «успешно открытую базу данных», однако следующая часть кода вызывает панику,

_,err = db.Exec("CREATE DATABASE currency1")
if err != nil {
    panic(err)
}

fmt.Println("Success CREATE database")

После того, как я использовал докер для его сборки и запуска, вот что я получил

GO MYSQL START
Success open database
panic: dial tcp 127.0.0.1:1433: getsockopt: connection refused

Это команда, которую я использовал для запуска базы данных mssql:

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=YourStrong!Passw0rd' -e 'MSSQL_PID=Express' -p 1433:1433 --name sql1 -d microsoft/mssql-server-linux:latest
Освоение архитектуры микросервисов с 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
0
2 877
3

Ответы 3

Первым делом вы должны понять, как работает сеть в докере. Каждый запущенный контейнер будет рассматриваться как один виртуальный узел. У них есть собственный IP-адрес для подключения друг к другу. В вашем случае будет 2 запущенных контейнера, 1 для Go и 1 для SQLServer. Итак, есть контейнер Go, который нужно подключить к контейнеру SQLServer. Адрес 127.0.0.1 или localhost означает, что он сам по себе (адрес обратной связи). Для его подключения вы можете использовать имя контейнера в качестве адреса (потому что IP назначается случайным образом). Фактически он преобразован в IP, докер делает это за вас. Судя по вашему запуску докера выше, это должен быть sql1.

Надеюсь, это поможет.

Вам также необходимо подключить docker network create к сети (подойдут параметры по умолчанию) и docker run --net для обоих контейнеров в этой сети.

David Maze 26.10.2018 03:43

Привет, спасибо, что ответили на мой вопрос. Однако у меня все еще возникают трудности, поскольку это не работает. Я использовал "docker create network my-net". затем, конечно, добавьте строку --network = my-net в обе мои команды запуска докеров. Docker обнаружил оба контейнера, поскольку команда «docker inspect my-net» показывает оба контейнера. однако, когда я использовал docker для запуска сценариев sql и go, паники не возникло. это просто «GO MYSQL START Успешная открытая база данных». P.S. Я также изменил свой сценарий go на ==> db, err: = sql.Open ("mysql", "SA: YourStrong! Passw0rd @ tcp (sql1.my-net: 143‌ 3) /")

user10560513 26.10.2018 13:02

Может быть вам стоит Ping() базу данных, когда вы ее подключили.

db, err := sql.Open("mysql","SA:YourStrong!Passw0rd@tcp(127.0.0.1:1433)/")
if err != nil {
    panic(err)
}
if err := db.Ping();err!=nil{
    panic(err)
}

defer db.Close()
fmt.Println("Success open database")

Open() не означает, что база данных подключена правильно.

В противном случае, как сказал Дхама, ваш хост базы данных неправильный. Надеюсь, это поможет тебе.

Если бы та же проблема была в другом месте от контейнера докеров до локального сервера mysql, трюк заключался в том, чтобы прокомментировать bind-address в my.cnf. Обычно его связывают только с адресом обратной связи и отказывают в подключении извне, включая сеть докеров. Вы можете попробовать создать my.cnf, как показано ниже, и смонтировать его в конфигурацию mysql через volume(-v).

#bind-address                   = 127.0.0.1

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