Sql server Docker(Linux)和Windows主机中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迭代: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
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包装的更新命令。这会导致升级到分布式事务,并失败,出现一个异常,表示无法将事务升级到分布式事务。