Docker绑定TCP 1433端口遇权限禁止错误的原因与解决问询
问题场景
通过Docker Compose部署三个服务:
- 开发用Microsoft SQL Server容器(映射主机1433端口)
- 存储Hasura元数据的PostgreSQL容器
- Hasura GraphQL实例容器
执行docker-compose -f ms_sqlserverdocker-compose.yml up时偶发报错:
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:1433 -> 0.0.0.0:0: listen tcp 0.0.0.0:1433: bind: An attempt was made to access a socket in a way forbidden by its access permissions
用netstat -ano | find "1433"检测无结果,但仅能通过重启电脑解决,需排查原因并找到优雅的释放方法。
偶发端口不可用的原因
- Windows动态端口范围重叠:Windows默认动态端口范围可能包含1433,即便无进程显式占用,系统也会将该端口标记为预留状态,导致Docker无法绑定。
- HTTP.sys端口预留:部分系统服务或应用可能通过HTTP.sys预留了1433端口,这类预留不会被
netstat检测到,但会阻止其他进程绑定。 - Docker网络栈残留:之前容器异常退出时,Docker内部可能残留端口绑定的缓存记录,导致新容器无法重新绑定。
- SQL Server残留服务干扰:本地曾安装过SQL Server的情况下,SQL Browser等服务可能在后台隐式占用端口,或驱动程序保留了端口的使用权限。
优雅的端口释放/解决方法
1. 调整Windows动态端口范围,避开1433
在管理员权限PowerShell中执行:
# 设置动态端口从49152开始,共16384个端口(确保1433不在范围内) netsh int ipv4 set dynamicport tcp start=49152 num=16384 netsh int ipv6 set dynamicport tcp start=49152 num=16384
执行后无需重启电脑,直接尝试启动容器即可。
2. 检查并清理HTTP.sys的端口预留
管理员权限PowerShell中执行:
# 查看所有HTTP.sys预留的端口 netsh http show urlacl
如果输出中包含http://+:1433/或https://+:1433/相关记录,执行以下命令删除:
netsh http delete urlacl url=http://+:1433/ # 如果有HTTPS的预留,执行对应的删除命令 netsh http delete urlacl url=https://+:1433/
3. 重置Docker网络栈并重启Docker服务
管理员权限PowerShell中执行:
# 清理未使用的Docker网络 docker network prune -f # 重启Docker服务 Restart-Service Docker
此方法可清除Docker内部的端口绑定缓存,无需重启电脑。
4. 禁用SQL Server残留服务
打开「服务」管理器(services.msc),找到SQL Server Browser服务,将其启动类型改为「禁用」并停止该服务,避免它抢占1433端口。
5. 修改Docker Compose端口映射(规避方案)
如果上述方法仍偶发问题,可以修改docker-compose.yml中MS SQL的端口映射,将主机端口从1433改为其他未被占用的端口,例如:
services: sql-server-db: image: mcr.microsoft.com/mssql/server:latest ports: - "1434:1433" # 将主机端口改为1434,容器内部仍用1433 # 其他配置...
内容的提问来源于stack exchange,提问作者crazyTech

