You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Azure DevOps中SQL Server与.NET应用容器的通信?

解决Azure DevOps托管Ubuntu代理上两个Docker容器的通信问题

我来帮你搞定这个容器协作的问题——在Azure DevOps的托管Ubuntu代理上,要让SQL Server容器(A)和.NET Core API容器(B)顺畅配合,核心要解决网络连通和服务就绪等待两个关键问题,下面一步步来操作:

1. 创建自定义Docker网络,实现容器间DNS解析

默认的Docker bridge网络虽然能连通,但自定义网络支持容器名直接作为主机名解析,比用容器IP更可靠(IP可能随重启变化)。

  • 先创建专属网络:
    docker network create sql-api-network
    
  • 启动SQL Server容器(A)时加入这个网络:
    docker run -d \
      --name sql-container \
      --network sql-api-network \
      -e "ACCEPT_EULA=Y" \
      -e "SA_PASSWORD=MyAwesomePassword" \
      mcr.microsoft.com/mssql/server
    
    (这里可以不用暴露1433到宿主机,因为容器B和A在同一个网络里直接通信即可)
  • 启动API容器(B)时也加入同一个网络:
    docker run -d \
      --name api-container \
      --network sql-api-network \
      -p 55111:55111 \
      your-api-image-name
    

2. 修改.NET项目的连接字符串

原来的Server=localhost,1433行不通——容器里的localhost指的是容器自身,不是宿主机或其他容器。你需要把服务器地址改成SQL Server容器的名称:

"ConnectionStrings": {
  "Database": "Server=sql-container,1433; Database=MyAwesomeDatabase; User=sa; Password=MyAwesomePassword; MultipleActiveResultSets=True;"
}

这样在自定义网络里,容器B会通过DNS直接找到名为sql-container的容器A。

3. 等待SQL Server完全就绪后再执行迁移

SQL Server启动很慢,直接跑迁移会因为连接失败报错。你需要在容器B的启动脚本里加一段等待逻辑,确保SQL Server能接受连接后再执行迁移。

方法1:把等待逻辑放到容器B的启动脚本里

如果容器B的入口点是自定义脚本,修改它:

#!/bin/bash

# 等待SQL Server就绪(需要容器B里安装sqlcmd工具)
until /opt/mssql-tools/bin/sqlcmd -S sql-container -U sa -P MyAwesomePassword -Q "SELECT 1" > /dev/null 2>&1; do
  echo "等待SQL Server启动中..."
  sleep 5
done

echo "SQL Server已就绪,开始执行数据库迁移..."
# 执行迁移命令(比如EF Core迁移)
dotnet ef database update

echo "迁移完成,启动API服务..."
# 启动API项目
dotnet YourBackendApi.dll

方法2:在Azure DevOps流水线中提前等待

如果不想修改容器镜像,也可以在流水线里先启动容器A,等它就绪后再启动容器B:

- script: |
    docker network create sql-api-network
    # 启动SQL Server容器
    docker run -d --name sql-container --network sql-api-network -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyAwesomePassword" mcr.microsoft.com/mssql/server
    
    # 等待SQL Server就绪(直接在宿主机通过容器exec测试)
    until docker exec sql-container /opt/mssql-tools/bin/sqlcmd -U sa -P MyAwesomePassword -Q "SELECT 1" > /dev/null 2>&1; do
      echo "等待SQL Server启动..."
      sleep 5
    done
  displayName: '启动SQL Server容器并等待就绪'

- script: |
    # 启动API容器
    docker run --name api-container --network sql-api-network -p 55111:55111 your-api-image-name
  displayName: '启动API容器'

4. 容器B的镜像准备(可选但重要)

如果你的.NET Core镜像里没有sqlcmd工具,需要在Dockerfile里添加安装步骤,不然等待脚本会报错:

# 基于官方.NET Core镜像构建
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 55111

# 安装sqlcmd工具
RUN apt-get update && apt-get install -y --no-install-recommends \
    mssql-tools \
    unixodbc-dev \
  && rm -rf /var/lib/apt/lists/*

# 将sqlcmd加入PATH
RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc

# 后续的构建步骤...

常见排查点

  • 检查两个容器是否在同一个网络:docker network inspect sql-api-network,查看Containers节点是否包含两个容器
  • 在容器B里手动测试连接:docker exec api-container /opt/mssql-tools/bin/sqlcmd -S sql-container -U sa -P MyAwesomePassword -Q "SELECT name FROM sys.databases"
  • 确认SQL Server的SA_PASSWORD和连接字符串里的密码完全一致(注意大小写和特殊字符)

内容的提问来源于stack exchange,提问作者NorthFred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:23:33