Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Docker(Linux)和Windows主机中SQL Server的MSDTC配置问题_Sql Server_Docker_Docker Compose_Msdtc_Sql Server Linux - Fatal编程技术网

Sql server Docker(Linux)和Windows主机中SQL Server的MSDTC配置问题

Sql server Docker(Linux)和Windows主机中SQL Server的MSDTC配置问题,sql-server,docker,docker-compose,msdtc,sql-server-linux,Sql Server,Docker,Docker Compose,Msdtc,Sql Server Linux,我正在迁移一个本地SQL Server开发数据库,以便在Linux docker容器中运行(在同一台开发机器上)。在Windows上的Visual Studio 2019中运行集成测试时,我收到MSDTC错误: 引发异常: 中的“System.Transactions.TransactionManagerCommunicationException” System.Data.dll类型的异常 'System.Transactions.TransactionManagerCommunication

我正在迁移一个本地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端口以使其正常工作。我尝试了端口
135:135
,但它给出了相同的错误。文章底部的注释似乎与我的问题有关

对于容器外部的SQL Server或非根容器 集装箱中必须使用不同的临时港口,如13500 然后,到端口135的流量必须路由到该端口。你会的 还需要从配置容器内的端口路由规则 集装箱港口135至临时港口

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

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


感谢您提供有关
msdtc
config的提示,我的作品是这样写的:

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测试仪控制台应用程序。它尝试对容器中的两个独立数据库执行两个TransactionScope包装的更新命令。这会导致升级到分布式事务,并失败,出现一个异常,表示无法将事务升级到分布式事务。