0

我正在使用以下命令在 Ubuntu 上运行 SQL 服务器容器

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 这是我的 docker-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"]
4

2 回答 2

0

首先,您通常确实希望使您的连接字符串易于配置(例如可能是环境变量),因为在不同机器上运行的应用程序也可能连接到不同的数据库服务器是有意义的。

就您的 docker 问题而言,您可能想研究使用 docker compose 而不仅仅是原始 docker。Compose 为集群中的所有容器设置主机名别名,因此您可以使用类似db.

于 2018-01-17T15:48:26.810 回答
0

是的,你可以使用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 

希望这会对您有所帮助,如果有任何问题,请告诉我?

于 2018-01-17T16:16:23.850 回答