Подключение к базе данных SQL Server, запущенной в Docker-контейнере, из другого Docker-контейнера - PullRequest
1 голос
/ 03 октября 2019

Я создаю базу данных в контейнере Docker с помощью следующего

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong@Passw0rd" -p 1433:1433 --network MyAppNetwork --name MyAppDb -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

Затем я запускаю свое приложение ASP.NET Core 3.0

docker run -p 5000:80 -e "ASPNETCORE_ENVIRONMENT=Development" --network MyAppNetwork --name MyApp myimage

Внутри приложения естьстрока подключения

Data Source=MyAppDb;Initial Catalog=MyAppDb;User ID=sa;Password=YourStrong@Passw0rd

, и я постоянно получаю сообщение об ошибке

Произошла ошибка, связанная с сетью или экземпляром, при установлении соединения с SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик TCP, ошибка: 40 - не удалось открыть подключение к SQL Server)

Я пытался MyAppDb,1433 localhost localhost,1433 ... ничего не работает

* 1020Документация Docker гласит, что вы должны иметь возможность ссылаться на другие контейнеры Docker через их имена, если они находятся в одной сети, но они не ведут себя так, как ожидалось для меня. Я попытался не указывать сеть, поэтому контейнеры просто по умолчанию подключаются к мосту, но ничего не изменилось.

Примечание. Я могу без проблем подключаться к базе данных с хост-компьютера, но из другого контейнера-докера,ничего не работает.

Есть идеи?

- обновить -

docker network inspect MyAppNetwork

[
    {
        "Name": "MyAppNetwork",
        "Id": "2f334b2df38c199ef423fdbe65c15e33b43d983e91a3398d75f0d988d5588c13",
        "Created": "2019-10-03T10:40:40.3165785Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
"f3106bc710fe760e257dd05aace7e76827d953600e5520556b040706f10246fb": {
                "Name": "MyAppDb",
                "EndpointID": "c4c58df89b4117674a0db57dfe276086eb48dda36fcc6a0989425b65fc130c41",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
]

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Я потратил много часов на это, пытаясь сделать это «правильно», но в конце концов я просто сдался и вернулся к использованию устаревшего решения на основе возможностей Links в файле docker-compose

https://docs.docker.com/network/links/

Сработало сразу, без каких-либо проблем. Я вернусь к этому, когда выйдет следующее крупное обновление Docker, в котором будет удалена функция Link.

docker-compose.yml

version: "3.5"

networks:
  myappnetwork:
    name: myappnetwork

services:
  myapp:
    build: .
    restart: always
    container_name: myapp
    depends_on: [myappdb]
    environment:
      ASPNETCORE_ENVIRONMENT: Development
    networks:
      - myappnetwork
    ports:
      - 5000:80
    links:
      - myappdb
  myappdb:
    image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
    restart: always
    container_name: myappdb
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: YourStrong@Passw0rd
    networks:
      - myappnetwork
    ports:
      - 1433:1433

dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY MyApp/*.csproj ./MyApp/
RUN dotnet restore

# copy everything else and build app
COPY MyApp/. ./MyApp/
WORKDIR /app/MyApp
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/MyApp/out ./
ENTRYPOINT ["dotnet", "MyApp.dll"]

appsettings.json

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=myappdb,1433;Initial Catalog=myappdb;User ID=sa;Password=YourStrong@Passw0rd"
  }
}
0 голосов
/ 03 октября 2019

Вы можете попробовать следующее:

После запуска контейнера SQL получите IP-адрес контейнера:

docker inspect MyAppDb | grep IPAddress

Если это сервер LinuxВы должны иметь возможность подключить другой контейнер по IP-адресу. Или вы можете использовать IP-адрес хост-сервера, на котором работают контейнеры Docker.

Кроме того, вам может потребоваться добавить атрибут

Trusted_Connection=false; в строку подключения.

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