【问题标题】:Connecting to SQL Sever docker container from another container without IP从另一个没有 IP 的容器连接到 SQL Server docker 容器
【发布时间】:2018-01-17 15:44:56
【问题描述】:

我正在使用以下命令在 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

还有我的 docker 文件

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"]

【问题讨论】:

    标签: docker .net-core sql-server-linux


    【解决方案1】:

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

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

    【讨论】:

    • 我已经在 docker-compose.yml 环境中设置了我的连接字符串。我认为您可以使用docker run --hostname=alias 设置容器主机名,对吗?我试过了,还是不行,我给docker-compose试试
    • 我添加了我的 docker-compose 文件
    【解决方案2】:

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

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

    【讨论】:

    • 这种方法的问题是数据库在docker-compose build期间不可用,由于我首先使用EF核心代码,我需要在构建过程中运行迁移脚本
    • 为什么数据库不可用? docker-compose 将处理这个问题。或尝试使用“--link”选项。
    猜你喜欢
    • 2019-03-26
    • 2022-01-04
    • 2019-02-24
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2022-08-16
    相关资源
    最近更新 更多