Я пытаюсь подключить свою программу 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
Первым делом вы должны понять, как работает сеть в докере. Каждый запущенный контейнер будет рассматриваться как один виртуальный узел. У них есть собственный IP-адрес для подключения друг к другу. В вашем случае будет 2 запущенных контейнера, 1 для Go и 1 для SQLServer. Итак, есть контейнер Go, который нужно подключить к контейнеру SQLServer. Адрес 127.0.0.1
или localhost
означает, что он сам по себе (адрес обратной связи). Для его подключения вы можете использовать имя контейнера в качестве адреса (потому что IP назначается случайным образом). Фактически он преобразован в IP, докер делает это за вас. Судя по вашему запуску докера выше, это должен быть sql1
.
Надеюсь, это поможет.
Привет, спасибо, что ответили на мой вопрос. Однако у меня все еще возникают трудности, поскольку это не работает. Я использовал "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) /")
Может быть вам стоит 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
Вам также необходимо подключить
docker network create
к сети (подойдут параметры по умолчанию) иdocker run --net
для обоих контейнеров в этой сети.