DockerLinux和Windows Host中的SQL Server的MSDTC配置问题

问题描述

我正在迁移本地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中执行端口转发...即使以root用户身份登录sql Server容器也无法执行此操作。 .iptables未安装,它不会让我apt-get install吗?我还更新了Windows中的DTC选项,以使其尽可能打开,但没有任何效果。不知道秘密酱是什么。希望其他人也能使用类似的设置。

MSDTC Options

解决方法

感谢关于 msdtc 配置的提示,我已经开始使用这个组合:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...