отказано в соединении при попытке подключить Golang к серверу mssql с помощью докера - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь подключить мою программу golang к серверу mssql, который я запускаю в контейнере с помощью Docker.Голанг также работает на док-контейнере.Кажется, что скрипт 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")

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

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

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Возможно, вам следует 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() не означает, что база данных подключена правильно.

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

0 голосов
/ 26 октября 2018

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

#bind-address                   = 127.0.0.1
0 голосов
/ 26 октября 2018

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

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

...