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 }
原因分析
- M1 Mac Docker网络栈差异:Ubuntu上Docker容器直接复用宿主机网络栈或bridge网络与宿主机同网段;而M1 Mac的Docker基于HyperKit虚拟机运行,容器处于独立虚拟子网,访问外部资源的网络路径不同。
- 远程SQL Server防火墙限制:
172.17.221.183为内部局域网地址,Ubuntu服务器处于同一局域网,防火墙允许其访问;Mac所在网络可能不在SQL Server放行的网段内,导致连接被拦截。 - 自定义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
- 尝试移除自定义网络配置,使用Docker默认bridge网络测试,修改docker-compose.yml删除
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
相关产品推荐
相关产品推荐

