Docker中SQL Server 1434管理端口占用致启动延迟3分钟求排查方案
Docker部署SQL Server因1434端口等待3分钟的排查方案
启动基于Docker的SQL Server容器时,每次都会因SQL Server无法打开1434管理端口而等待3分钟,相关日志如下:
... 14:05:21.13 spid30s Starting up database 'msdb'. 14:05:21.13 spid14s Starting up database 'mssqlsystemresource'. 14:05:21.13 spid31s Starting up database 'mydb'. 14:05:21.14 spid14s The resource database build version is 15.00.4312. This is an informational message only. No user action is required. 14:05:21.14 spid26s Server is listening on [ 'any' <ipv6> 1433]. 14:05:21.15 spid14s [3]. Feature Status: PVS: 0. CTR: 0. ConcurrentPFSUpdate: 1. 14:05:21.15 spid14s Starting up database 'model'. 14:05:21.16 spid26s Server is listening on [ 'any' <ipv4> 1433]. 14:05:21.16 Server Server is listening on [ ::1 <ipv6> 1434]. 14:05:21.19 spid31s Parallel redo is started for database ' mydb' with worker pool size [10]. 14:05:21.23 Server Common language runtime (CLR) functionality initialized. 14:05:21.25 spid14s Clearing tempdb database. 14:05:21.32 spid30s Parallel redo is shutdown for database 'mydb' with worker pool size [10]. 14:05:21.35 spid14s [2]. Feature Status: PVS: 0. CTR: 0. ConcurrentPFSUpdate: 1. 14:05:21.35 spid14s Starting up database 'tempdb'. 14:05:21.71 spid14s The tempdb database has 8 data file(s). 14:05:21.72 spid30s The Service Broker endpoint is in disabled or stopped state. 14:05:21.72 spid30s The Database Mirroring endpoint is in disabled or stopped state. 14:05:21.73 spid30s Service Broker manager has started. 14:08:21.79 Server Error: 26024, Severity: 16, State: 1. 14:08:21.79 Server Server failed to listen on 127.0.0.1 <ipv4> 1434. Error: 0x2742. To proceed, notify your system administrator. 14:08:21.79 Server Dedicated admin connection support was not started because of error 0x2742, status code: 0x1. This error typically indicates a socket-based error, such as a port already in use. 14:08:21.79 spid26s Server is listening on [ ::1 <ipv6> 1431]. 14:08:21.79 spid26s Server is listening on [ 127.0.0.1 <ipv4> 1431]. 14:08:21.80 spid26s Recovery is complete. This is an informational message only. No user action is required. 14:08:21.80 spid26s SQL Server is now ready for client connections. This is an informational message; no user action is required.
使用的docker-compose文件如下(取消1434端口映射注释也无法解决):
version: '3.4' services: sql-data: image: "mcr.microsoft.com/mssql/server:2019-latest" environment: SA_PASSWORD: "MyDockerPwd!" ACCEPT_EULA: "Y" ports: - "5433:1433" # - "5434:1434/udp" volumes: - sql-data-system:/var/opt/mssql - sql-data-user:/var/opt/sqlserver volumes: sql-data-system: name: sql_data_system sql-data-user: name: sql_data_user
已尝试在主机上分配相关端口,执行netsh int ip show excludedportrange protocol=tcp的输出如下:
netsh int ip show excludedportrange protocol=tcp Protocol tcp Port Exclusion Ranges Start Port End Port ---------- -------- 5357 5357 5433 5433 * 5434 5434 * 8884 8884 49735 49834 49835 49934 50000 50059 * 50060 50159 50160 50259 50260 50359 50400 50499 * 50508 50607 51036 51135 51259 51358 61200 61299 * * - Administered port exclusions.
排查步骤
- 检查容器内1434端口占用
进入SQL Server容器,Linux容器执行netstat -tulpn | grep :1434,Windows容器执行netstat -ano | findstr :1434,确认容器内部是否有其他进程占用该端口。 - 禁用DAC端口监听
若不需要使用专用管理员连接(DAC),直接禁用该功能避免端口监听冲突:- 在docker-compose的
environment中添加MSSQL_DISABLE_DAC=true; - 或者进入容器修改
/var/opt/mssql/mssql.conf,添加以下配置:[network] disableDac = true
- 在docker-compose的
- 检查主机UDP 1434端口占用
1434是UDP端口,之前的netsh命令仅检查TCP端口,Windows主机执行netstat -ano -p udp | findstr :1434,Linux主机执行ss -ulpn | grep :1434,查看主机上是否有进程占用UDP 1434,如有则终止对应进程。 - 修改DAC监听端口
若必须使用DAC,可修改其监听端口避免冲突:
在mssql.conf中添加:
重启容器后,SQL Server会使用指定端口作为DAC端口,不会再尝试绑定1434。[network] dacPort = 1431 - 重置主机端口排除范围
若为Windows主机动态端口分配导致的冲突,可重启WinNAT服务重置端口范围:
执行后重新检查端口排除列表,确认5434是否已解除排除。net stop winnat net start winnat - 验证Docker网络配置
尝试切换容器网络模式为host(仅测试用),启动容器看是否还会出现等待问题,排除Docker端口映射的干扰;若问题消失,说明桥接网络存在端口冲突,可尝试重新创建Docker网络。
内容的提问来源于stack exchange,提问作者samneric
相关产品推荐
相关产品推荐

