【问题标题】:MSDTC configuration issues with SQL Server in Docker (Linux) and Windows HostDocker (Linux) 和 Windows 主机中的 SQL Server 的 MSDTC 配置问题
【发布时间】:2020-11-09 04:11:09
【问题描述】:

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

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

这是我在 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 端口以使其正常工作。 This is the main MS article。我试过端口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 选项,使其尽可能打开,但没有任何效果。不知道秘方是什么。希望其他人也有类似的设置。

【问题讨论】:

    标签: sql-server docker docker-compose msdtc sql-server-linux


    【解决方案1】:

    感谢msdtc config 的提示,我已经开始使用这个 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
    

    【讨论】:

    • 您确定 DTC 在这里工作吗?主机是否也绑定到端口 135(它是 RPC 端点管理器),因此无法与容器共享它?我们也在努力让 DTC 在这里工作。我们编写了一个在主机上运行的简单 DTC 测试器控制台应用程序。它尝试对容器中的 2 个独立数据库执行两个 TransactionScope 包装的更新命令。这会导致升级到分布式事务,并且失败并出现异常,指出无法将事务提升到分布式事务。
    猜你喜欢
    • 2022-10-06
    • 2022-01-27
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2021-03-29
    • 2019-04-22
    相关资源
    最近更新 更多