Docker化Linux版SQL Server的MSDTC配置问题求助
问题:SQL Server容器中MSDTC服务无法启动
配置背景
尝试为SQL Server容器配置MSDTC,参照官方文档编写Docker Compose文件,同时也尝试过在Dockerfile中直接设置DTC端口,但均未成功。
Docker Compose配置
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
尝试过的Dockerfile配置
RUN /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 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)
- 直接使用官方镜像通过命令行启动容器,同样出现该问题。
排查与解决建议
- 验证DTC核心配置:进入容器执行
/opt/mssql/bin/mssql-conf get distributedtransaction.servertcpport确认端口是否正确设置为51000,同时检查distributedtransaction.enabled是否为yes,若未开启需执行/opt/mssql/bin/mssql-conf set distributedtransaction.enabled yes并重启容器。 - 调整容器网络模式:默认bridge网络可能存在端口转发限制,可尝试使用host网络(需注意宿主机端口冲突),或创建自定义bridge网络;在Compose中添加
network_mode: host(移除ports映射),或定义自定义网络:
并为服务指定该网络。networks: mssql-net: driver: bridge - 添加容器权限:MSDTC启动可能需要额外系统权限,在Compose中添加以下配置:
cap_add: - SYS_PTRACE security_opt: - seccomp:unconfined - 查看详细错误日志:检查容器内
/var/opt/mssql/log/errorlog文件,查找DTC启动相关的具体错误信息,比如依赖服务未启动、权限不足等。 - 更新镜像版本:尝试使用最新的SQL Server 2019镜像,确保镜像包含最新的MSDTC修复补丁。
- 检查宿主机防火墙:确认宿主机防火墙允许51000、135端口的入站和出站流量,避免端口被拦截。
内容的提问来源于stack exchange,提问作者Greg Brown
相关产品推荐
相关产品推荐

