我正在尝试使用 Docker Compose 在 SQL Server 容器中设置 MSDTC,如下所述:
我的撰写文件如下所示,反映了上述文档中引用的命令行参数:
services:
pte_mssql:
build:
context: ./mssql/docker
environment:
ACCEPT_EULA: 'Y'
MSSQL_SA_PASSWORD: '${startupSaPassword}'
MSSQL_RPC_PORT: 135
MSSQL_DTC_TCP_PORT: 51000
ports:
- 1433:1433
- 135:135
- 51000:51000
但是DTC服务好像没有启动。我在输出中看到这个重复(其他端口似乎没问题):
Waiting for TCP socket on 172.24.0.1:51000 of 'pte_mssql_1' (Connection refused (Connection refused))
Will use 172.24.0.1 (network vestmarkone_default) as host of pte_mssql
More forwarded TCP ports for service 'pte_mssql:135 [[HostIp:0.0.0.0, HostPort:135], [HostIp:::, HostPort:135]]'. Will use the first one.
More forwarded TCP ports for service 'pte_mssql:1433 [[HostIp:0.0.0.0, HostPort:1433], [HostIp:::, HostPort:1433]]'. Will use the first one.
More forwarded TCP ports for service 'pte_mssql:51000 [[HostIp:0.0.0.0, HostPort:51000], [HostIp:::, HostPort:51000]]'. Will use the first one.
我使用以下命令来确认端口 51000 上没有任何东西在运行:
root@906e7184f6bc:/var/opt/mssql/log# lsof -i -P -n | grep LISTEN
sqlservr 9 root 49u IPv4 1613252 0t0 TCP *:135 (LISTEN)
sqlservr 9 root 51u IPv6 1613254 0t0 TCP *:135 (LISTEN)
sqlservr 9 root 64u IPv6 1617097 0t0 TCP *:1433 (LISTEN)
sqlservr 9 root 100u IPv4 1617098 0t0 TCP *:1433 (LISTEN)
sqlservr 9 root 106u IPv4 1629465 0t0 TCP 127.0.0.1:1434 (LISTEN)
sqlservr 9 root 110u IPv4 1617101 0t0 TCP 127.0.0.1:1431 (LISTEN)
我还尝试将以下内容添加到我的
Dockerfile
而不是设置 MSSQL_DTC_TCP_PORT
环境变量:
RUN /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51000
这并没有解决问题。
FWIW,从命令行(如文章中所示)而不是通过 Docker Compose 创建容器会产生相同的结果。请注意,我以 root 身份启动了容器,因此我可以运行
lsof
进行故障排除。我还使用了“2019-latest”而不是“2019-GA-ubuntu-20.04”,因为后者似乎不再存在:
docker run \
-u root \
-e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=pass@1234' \
-e 'MSSQL_RPC_PORT=135' -e 'MSSQL_DTC_TCP_PORT=51000' \
-p 1433:1433 -p 135:135 -p 51000:51000 \
-d mcr.microsoft.com/mssql/server:2019-latest
有没有人对如何启用 DTC 服务或如何进一步排除故障有任何建议?
根据Microsoft 的文档,DTC 服务器在分布式事务开始之前不会开始侦听。一旦发生这种情况,您应该会看到它在端口 51000 上侦听。