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

MacOS Ventura 13.1下Docker Compose连接远程SQL Server超时求助

M1 Mac Docker容器连接远程SQL Server超时问题排查与解决

问题场景

  • 应用在自建Ubuntu服务器上通过Docker Compose运行正常
  • 搭载M1芯片的MacBook Pro(MacOS Ventura 13.1)本地运行时,Node.js容器连接远程SQL Server(172.17.221.183:1433)出现超时错误

应用规格

  • Node.js alpine镜像
  • Docker Compose版本3.8
  • 使用sequelize 6.8.0 + tedious 14.0.0连接MSSQL
  • Docker Desktop 4.18.0

Docker Compose配置

version: "3.8"
services:
  api:
    container_name: mobile-apps-api-dev
    image: ${CONTAINER_RELEASE_IMAGE}
    restart: always
    volumes:
      - /Users/fhi-it-dev/Documents/server-mobile-apps-v2/uploads:/mobile-apps-api-dev/uploads
      - /Users/fhi-it-dev/Documents/server-mobile-apps-v2/share:/mobile-apps-api-dev/share
    ports:
      - "4002:4002"
    cpus: 0.7
    command: npm run start:dev
    networks:
      - "mynetwork"

  redis:
    image: redis:7.0.4
    restart: always
    volumes:
      - /Users/fhi-it-dev/Documents/server-mobile-apps-v2/data:/mobile-apps-api-dev/data
    ports:
      - "6379:6379"
    command: redis-server --save 20 1 --loglevel warning --port 6379
    networks:
      - "mynetwork"

  redisFcm:
    image: redis:7.0.4
    restart: always
    volumes:
      - /Users/fhi-it-dev/Documents/server-mobile-apps-v2/dataFcm:/mobile-apps-api-dev/dataFcm
    ports:
      - "6381:6381"
    command: redis-server --save 20 1 --loglevel warning --port 6381
    networks:
      - "mynetwork"

networks:
  mynetwork:
    external: true
    driver: "bridge"

报错信息

2023-05-03 08:51:45   original: ConnectionError: Failed to connect to 172.17.221.183:1433 in 15000ms
2023-05-03 08:51:45       at Connection.connectTimeout (/mobile-apps-api-dev/node_modules/tedious/lib/connection.js:1232:26)
2023-05-03 08:51:45       at Timeout._onTimeout (/mobile-apps-api-dev/node_modules/tedious/lib/connection.js:1177:12)
2023-05-03 08:51:45       at listOnTimeout (node:internal/timers:573:17)
2023-05-03 08:51:45       at process.processTimers (node:internal/timers:514:7) {
2023-05-03 08:51:45     code: 'ETIMEOUT',
2023-05-03 08:51:45     isTransient: undefined
2023-05-03 08:51:45   }
2023-05-03 08:51:45 }

原因分析

  1. M1 Mac Docker网络栈差异:Ubuntu上Docker容器直接复用宿主机网络栈或bridge网络与宿主机同网段;而M1 Mac的Docker基于HyperKit虚拟机运行,容器处于独立虚拟子网,访问外部资源的网络路径不同。
  2. 远程SQL Server防火墙限制:172.17.221.183为内部局域网地址,Ubuntu服务器处于同一局域网,防火墙允许其访问;Mac所在网络可能不在SQL Server放行的网段内,导致连接被拦截。
  3. 自定义Docker网络异常:使用的外部bridge网络mynetwork可能存在网关或路由配置问题,导致容器无法正确路由到远程SQL Server。

排查与解决方案

1. 验证宿主机(Mac)连通性

在Mac终端执行以下命令,测试宿主机能否访问SQL Server:

# 用telnet测试
telnet 172.17.221.183 1433
# 或用nc测试
nc -zv 172.17.221.183 1433
  • 如果宿主机无法访问:
    • 检查Mac是否与SQL Server处于同一局域网,或是否需要通过VPN连接到目标网络
    • 联系管理员修改SQL Server所在服务器的防火墙/安全组规则,放行Mac的IP地址或所在网段

2. 验证容器内部连通性

进入Node.js容器内部,测试连通性:

# 进入容器
docker exec -it mobile-apps-api-dev sh
# alpine镜像需先安装telnet
apk add busybox-extras
# 测试SQL Server连接
telnet 172.17.221.183 1433
  • 如果容器内无法访问但宿主机可以:
    • 尝试移除自定义网络配置,使用Docker默认bridge网络测试,修改docker-compose.yml删除networks相关配置后重启容器
    • 重建自定义bridge网络:
      docker network rm mynetwork
      docker network create --driver bridge mynetwork
      
      重建后重新启动容器

3. 调整Docker Desktop网络设置

打开Docker Desktop -> Settings -> Resources -> Network:

  • 尝试切换网络模式(从Automatic改为Manual),设置与SQL Server同网段的子网
  • 启用Use the Docker network stack for DNS resolution选项,确保容器能正确解析和路由

4. 检查tedious连接配置

确认sequelize连接配置是否适配SQL Server要求,比如加密设置、超时时间:

const sequelize = new Sequelize('database', 'user', 'password', {
  host: '172.17.221.183',
  port: 1433,
  dialect: 'mssql',
  dialectOptions: {
    options: {
      encrypt: false, // 根据SQL Server实际配置调整,部分MSSQL实例默认要求加密
      connectTimeout: 30000 // 延长超时时间测试
    }
  }
});

注:tedious 14.0.0已支持arm64架构,若仍有兼容性问题可尝试升级到最新版本。

内容的提问来源于stack exchange,提问作者rusli Abdul gani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:25:40