Подключение к док-контейнеру 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
Надеюсь, это поможет вам, дайте мне знать, если возникнут какие-либо проблемы с этим?