Подключение к док-контейнеру SQL Sever из другого контейнера без IP

Я запускаю контейнер SQL-сервера в Ubuntu, используя следующую команду

sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyPassword' \
  -p 1433:1433 --name db \
  -d microsoft/mssql-server-linux:2017-latest`

У меня есть другой контейнер на той же машине, на котором выполняется приложение WebAPI Core, все работает найти, если я указал ip сервера в строке подключения, но если я заменил его на "localhost" или "." не удается подключиться.

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

Редактирование 1: мне нужно, чтобы моя база данных была запущена и работала во время процесса сборки, чтобы применить первые миграции кода EntityFramework, поэтому я не могу просто добавить SQL Server в качестве зависимости в docker-compose.yml

Редактировать 2 Вот мой докер-compose.yml

version: '3'

services:
  webapi:
    image: webapi
    build:
      context: ./
      dockerfile: ./WebAPI/Dockerfile
      args:
        - connString=Server=db;Database...;
   environment:
     - ASPNETCORE_ENVIRONMENT=Development
     - ASPNETCORE_URLS=http://+:80
     - conneString="Server=db;Database..."
   ports:
     - 50695:80
   depends_on:
     - db

  db:
    image: "microsoft/mssql-server-linux:2017-latest"
    container_name: db

networks:
  default:
    external:
      name: nat

И мой докер

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
ARG connString
ENV connString "$connString"
WORKDIR /src
COPY *.sln ./
COPY WebAPI/WebAPI.csproj WebAPI/
RUN dotnet restore
COPY . .
WORKDIR /src/Repository
RUN dotnet restore
RUN dotnet ef database update


WORKDIR /src/WebAPI
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebAPI.dll"]

2 ответа

Во-первых, вы, как правило, хотите, чтобы строка подключения была легко конфигурируемой (например, переменная среды), поскольку было бы разумно, чтобы приложение, работающее на разных компьютерах, могло также подключаться к другому серверу базы данных.

Что касается вашего вопроса о докере, вы можете захотеть использовать docker compose, а не просто raw docker. Compose устанавливает псевдонимы имен хостов для всех контейнеров в вашем кластере, так что вы можете просто использовать имя хоста, например db,

Да, вы можете использовать localhost для подключения к базе данных, что лучше, чем IP-адрес.

Вам необходимо связать контейнер с контейнером базы данных.

Если вы используете docker-compose, следуйте примеру

 container1:
     build: image_name
     links:
      - mysql:mysql

container2:
     build: image_name
     links:
      - mysql:mysql

mysql:  
 build: mysql

В приведенном выше примере вы увидите, у меня есть связь контейнера MySQL с каждым другим контейнером, поэтому вам не нужно указывать IP-адрес.

если вы не используете docker-compose, то в вашей команде docker run, пожалуйста, используйте

--link sql_container_name:sql_container_name 

Надеюсь, это поможет вам, дайте мне знать, если возникнут какие-либо проблемы с этим?

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