首页 > 解决方案 > Docker (Linux) 和 Windows 主机中的 SQL Server 的 MSDTC 配置问题

问题描述

我正在迁移本地 SQL Server 开发数据库以在 Linux docker 容器中运行(在同一台开发机器上)。在 Windows 上的 Visual Studio 2019 中运行我的集成测试时,我收到 MSDTC 错误:

抛出异常:System.Data.dll 中的“System.Transactions.TransactionManagerCommunicationException” System.Data.dll 中发生“System.Transactions.TransactionManagerCommunicationException”类型的异常,但未在用户代码中处理 与底层事务管理器的通信失败。

这是我在 docker-compose 中最新的 SQL Server 迭代:

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-latest
    container_name: SqlServer
    restart: always
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=verySecretPassword
      - MSSQL_RPC_PORT=13500
      - MSSQL_DTC_TCP_PORT=51000
    ports:
      - "1401:1433"
      - "135:13500"
      - "51000:51000"
    volumes:
      - sqldata:/var/opt/mssql

我已经尝试了各种方法来调整 RPC 端口以使其正常工作。这是主要的 MS 文章。我试过端口135:135,但它给出了同样的错误。底部文章中的注释似乎与我的问题有关。

对于容器外部的 SQL Server 或非根容器,必须在容器中使用不同的临时端口(例如 13500),然后必须将到端口 135 的流量路由到该端口。您还需要在容器内配置从容器端口 135 到临时端口的端口路由规则。

此外,如果您决定将容器的端口 135 映射到主机上的其他端口,例如 13500,那么您必须在主机上配置端口路由。这使 docker 容器能够参与与主机和其他外部服务器的分布式事务。

SQL Server 2019 容器以非 root 用户身份运行。我已经尝试在 Windows 中使用 netsh 进行端口路由......还有 MS 文章链接到如何在 Ubuntu 中执行端口转发......即使在 SQL Server 容器中以 root 身份登录我也无法做到...... . iptables 没有安装,它不让我安装apt-get install它??我还更新了 Windows 中的 DTC 选项,使其尽可能打开,但没有任何效果。不知道秘方是什么。希望其他人也有类似的设置。

MSDTC 选项

标签: sql-serverdockerdocker-composemsdtcsql-server-linux

解决方案


感谢您提供有关msdtc配置的提示,我让我使用这个 compose:

version: '3.4'

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    container_name: sqlserver
    user: root
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=[yourPwd]
      - MSSQL_RPC_PORT=135
      - MSSQL_DTC_TCP_PORT=51000
    ports:
      - "1433:1433"
      - "135:135"
      - "51000:51000"
    volumes:
      - D:\DockerVolumes\sqlserver:/var/opt/mssql/data

推荐阅读