如何在 Docker 中从 Docker 连接到 SQL Server 服务?

Posted

技术标签:

【中文标题】如何在 Docker 中从 Docker 连接到 SQL Server 服务?【英文标题】:How to connect to SQL Server service from Docker in Docker? 【发布时间】:2022-01-07 15:48:14 【问题描述】:

我正在尝试构建和运行一个 ASP.NET Core 应用程序并使用 newman 对其进行测试。 这是我的管道:

services:
  - mcr.microsoft.com/mssql/server:2019-CU14-ubuntu-20.04
  - docker:19.03.12-dind

variables:
  VERSION: "0.0.0"
  ACCEPT_EULA: Y
  MSSQL_SA_PASSWORD: *******
  DOCKER_TLS_CERTDIR: "/certs"
        
stages:
  - test
 
postman_tests:
  stage: test
  tags:
    - docker
  script:
    - docker run -p 5555:80 -v $(pwd)/CatalogService/:/app/ -w /app -e ASPNETCORE_URLS=http://+:80 -e ASPNETCORE_ENVIRONMENT=Development -t mcr.microsoft.com/dotnet/sdk:6.0.100-alpine3.14-amd64 dotnet run --project ./CatalogService.csproj
    - sleep 120s
    - docker run -v $(pwd)/test:/etc/newman -t postman/newman:alpine run "CatalogService.postman_collection.json" --reporters="cli"

我今天刚开始学习 Docker 以及如何将它与 Gitlab 的管道一起使用,如果您有更好的方法,请告诉我。

为什么应用无法访问 mssql 服务? 这是我得到的错误:

[...]
Status: Downloaded newer image for mcr.microsoft.com/dotnet/sdk:6.0.100-alpine3.14-amd64
=Building...
=info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 6.0.0 initialized 'CatalogDb' using provider 'Microsoft.EntityFrameworkCore.SqlServer:6.0.0' with options: None
Unhandled exception. Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 35 - An internal exception was caught)
[...]

这是我在appsettings.json 文件中使用的连接字符串:

"ConnectionStrings": 
  "CatalogDb": "Password=****;Persist Security Info=True;User ID=SA;Database=CatalogDb;Server=mcr.microsoft.com__mssql__server"
,

如果我使用 .net sdk 映像运行以下管道,则应用程序将启动并可以连接到数据库。 但是这样我就不能用newman来测试了。或者我可以吗?

build:
  stage: build
  tags:
    - docker
  image: 
    name: mcr.microsoft.com/dotnet/sdk:6.0
    entrypoint: [""]
  script:
    - dotnet build ./CatalogService.csproj --configuration Release --no-self-contained
    - dotnet run --project ./CatalogService.csproj
  variables: 
    ErrorActionPreference: stop

更新

我添加了一个别名并更新了服务的连接字符串,但它仍然没有连接。

services:
  - name: mcr.microsoft.com/mssql/server:2019-CU14-ubuntu-20.04
    alias: mssql
  - docker:19.03.12-dind

Password=*****;Persist Security Info=True;User ID=SA;Database=CatalogDb;Server=mssql

我还按照指定的here 添加了变量FF_NETWORK_PER_BUILD,但应用仍未连接到数据库

postman_tests:
  stage: test
  tags:
    - docker
  variables:
    FF_NETWORK_PER_BUILD: "true"
  script:
    - docker run -p 5555:80 -v $(pwd)/CatalogService/:/app/ -w /app -e ASPNETCORE_URLS=http://+:80 -e ASPNETCORE_ENVIRONMENT=Development -t mcr.microsoft.com/dotnet/sdk:6.0.100-alpine3.14-amd64 dotnet run --project ./CatalogService.csproj
    - sleep 120s
    - docker run -v $(pwd)/test:/etc/newman -t postman/newman:alpine run "CatalogService.postman_collection.json" --reporters="cli"

【问题讨论】:

您通常会在 docker-compose.yml 文件名中提供服务。然后,您可以将它们用作主机名,可在组合的桥(或其他)网络、连接字符串等中解析。 一旦您解决了连接问题,您很可能会遇到登录问题。您似乎没有任何配置/脚本来创建 CatalogDb,因此您与 CatalogService 的连接将无法完成登录。 您好,该应用程序使用实体框架,它自己创建所有内容。我也尝试使用服务名称,但它仍然无法正常工作(即将用这个更新问题) 在这里查看我如何从 Docker 容器设置 SQL,抱歉没有时间提供帮助:github.com/MeaningOfLights/containers_artifacts/blob/main/… 您好,我看到您正在设置一些变量,但是您在哪里启动 mssql 容器? 【参考方案1】:

我在docker run commands 上缺少--network=host 参数。 现在应用程序与数据库成功连接。

【讨论】:

以上是关于如何在 Docker 中从 Docker 连接到 SQL Server 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Docker.DotNet 库连接到远程 Linux docker

如何将 Grafana 的 Docker 容器连接到 MySql 的 Docker 容器?

如何从 Windows 10 上的容器连接到 docker 主机(Docker for Windows)

如何在 Docker 中将 Debezium 连接到 MongoDB?

如何连接到在 docker 中运行的 samba 服务器

如何从 Docker 容器连接到本地 Redis 服务器?