Как установить связь между двумя Docker-контейнерами (mssql и .net core app). Соединение отказано 127.0.0.1:1433 - PullRequest
0 голосов
/ 12 июня 2018

У меня есть .net core 2.0 проект, который использует mssql server .Я создал docker image и контейнер для моего .net core 2.0 и работаю на 9090:9090.Я создал его, как показано ниже.

docker container run --name mytestapp --publish 9090:9090 --detach my_.netapp_image_name

и ниже - строка подключения в приложении .net core 2.0.

"DefaultConnection": "Server=127.0.0.1;Database=mydatabase;UserId=SA;Password=mydbpassword"

до , я создал контейнердля mssql server со значением ниже

docker container run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -d microsoft/mssql-server-linux:2017-latest
  • мое основное приложение .net имеет начальные значения для базы данных.каждый раз, когда выдается сообщение об ошибке:

Необработанное исключение: System.Data.SqlClient.SqlException: ошибка, связанная с сетью или экземпляром, возникающая при установлении соединения с SQL Server.Сервер не найден или не был доступен.Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений.(поставщик: поставщик TCP, ошибка: 35 - обнаружена внутренняя исключительная ситуация) ---> System.AggregateException: произошла одна или несколько ошибок.(Соединение отклонено 127.0.0.1:1433) ---> System.Net.Internals.SocketExceptionFactory + ExtendedSocketException: Соединение отклонено 127.0.0.1:1433

NOTE : это работает нормальнокогда я запускаю свое приложение .net через IDE (visual studio) и использую db в качестве контейнера docker mssql.Я запускал эти два контейнера отдельно.затем я попытался запустить с помощью docker-compose, но не сработало.

Что я здесь не так делаю.надеюсь, что ваша помощь с этим.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Каждый контейнер имеет свое собственное пространство имен сети по умолчанию.Compose поместит все контейнеры в общую сеть и установит псевдоним в DNS для имени службы.Поэтому для соединения между контейнерами все, что вам нужно сделать, это указать имя вашей службы вместо 127.0.0.1 (при условии, что mysql - это имя вашей службы):

"DefaultConnection": "Server=mysql;Database=mydatabase;UserId=SA;Password=mydbpassword"

Это более переносимо и обрабатывает масштабирование контейнеров /обновление лучше, чем присоединение контейнеров к одному и тому же сетевому пространству имен.

0 голосов
/ 12 июня 2018

Так что проблема здесь в песочнице докера.Для каждого контейнера, который вы запускаете, вы можете представить себе отдельную виртуальную среду, которая имеет свое имя хоста, IP-адрес и сеть.При использовании -p только перенаправляет порт из этой внутренней сети на хост.Поэтому, когда вы работаете с VS, вы можете указать на свою базу данных, используя localhost (127.0.0.1:1433) только потому, что вы выставили этот порт хосту, и ваше приложение запускается на хосте напрямую.Когда он работает внутри собственного контейнера, localhost больше не ссылается на хост, а скорее на среду докера.Чтобы это исправить, вы можете запустить оба контейнера в одной сети (аргумент --network при запуске) и ссылаться друг на друга по имени хоста (аргумент --name при запуске).

docker container run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-d microsoft/mssql-server-linux:2017-latest \
--name sql_server

docker container run \
--name mytestapp 
--publish 9090:9090 
--detach my_.netapp_image_name 
--network container:sql_server

и в вашемнастройки относятся к вашей базе данных как sql_server.Чтобы сделать этот процесс менее болезненным, вы можете исследовать docker-compose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...