You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL中Docker部署SQL Server:localhost无法连接但127.0.0.1可行

问题描述

通过以下docker-compose.yaml部署SQL Server 2017镜像:

version: "3.7"
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2017-latest
    container_name: sqlserver
    user: root
    ports:
      - "1433:1433"
    environment:
      SA_USERNAME: sa
      SA_PASSWORD: Dev1234!
      ACCEPT_EULA: Y
      MSSQL_AGENT_ENABLED: 'true'
    volumes:
      - ./volumes/data2:/var/opt/mssql/data
      - ./volumes/backup:/var/opt/mssql/Backup

容器启动成功后,使用以下PowerShell脚本连接:

$connectionString = "Data Source=localhost,1433;User ID=sa;Password=Dev1234!;"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.Open();

出现错误:

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - The remote computer refused the network connection.)"

现象:使用localhost连接失败,改用127.0.0.1可成功,SQL Server Management Studio连接也存在同样问题。Docker引擎运行在Ubuntu版WSL中,其他服务(如MySQL)可通过localhost正常访问。询问是否需要在docker-compose中配置特定参数解决。

解决方案

1. 移除user: root配置

SQL Server官方Docker镜像默认使用mssql用户运行,强制指定root用户会破坏镜像内置的权限配置与服务启动逻辑,可能导致SQL Server未正确监听所有网络地址。

修改后的docker-compose.yaml关键片段:

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2017-latest
    container_name: sqlserver
    # 移除 user: root 行
    ports:
      - "1433:1433"
    ...

2. 强制SQL Server监听所有IPv4地址

在环境变量中添加MSSQL_IP_ADDRESS: 0.0.0.0,确保SQL Server容器内的服务绑定到所有可用的IPv4接口,而非仅本地回环地址:

environment:
  SA_USERNAME: sa
  SA_PASSWORD: Dev1234!
  ACCEPT_EULA: Y
  MSSQL_AGENT_ENABLED: 'true'
  MSSQL_IP_ADDRESS: 0.0.0.0  # 新增该行

3. 重启容器生效

执行以下命令重启容器:

docker-compose down
docker-compose up -d

原因说明

WSL2的localhost转发机制在处理IPv6解析时存在兼容性差异:Windows端localhost默认优先解析为IPv6地址::1,而未正确配置的SQL Server容器仅监听IPv4地址,导致连接失败。127.0.0.1直接指定IPv4回环地址,因此可以正常连接。MySQL等服务能正常使用localhost,是因为其默认监听所有网络接口(包括IPv6),而SQL Server需要显式配置。

内容的提问来源于stack exchange,提问作者VISHNU PRASAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:45:28