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

.NET容器化Selenium项目连接远程MySQL服务器超时问题求助

容器化Selenium项目无法连接远程MySQL的解决方案

问题背景

拥有一台未容器化的远程MySQL服务器(IP: 172.17.56.104),Selenium项目原本可正常将测试结果插入该数据库;将项目容器化并通过docker-compose运行后,出现数据库连接超时异常,错误信息如下:

DBConnect:System.TimeoutException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
test-1      |    at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings, MyNetworkStream& networkStream)
test-1      |    at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings, MyNetworkStream& networkStream)
test-1      |    at MySql.Data.MySqlClient.NativeDriver.Open()
test-1      |    at MySql.Data.MySqlClient.Driver.Open()
test-1      |    at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
test-1      |    at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
test-1      |    at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
test-1      |    at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
test-1      |    at MySql.Data.MySqlClient.MySqlPool.GetConnection()
test-1      |    at MySql.Data.MySqlClient.MySqlConnection.Open()

关键误解说明

test服务的4445:4444端口映射是将容器内4444端口暴露到宿主机4445端口,用于外部访问容器服务,和数据库连接完全无关。容器连接远程MySQL是直接向172.17.56.104的3306端口发起请求,不需要通过该映射转发。

解决方案

1. 验证容器网络连通性

进入test容器,测试能否访问远程MySQL服务器:

  • 进入容器:docker exec -it test-1 /bin/bash(替换test-1为实际容器名称)
  • 测试ICMP连通性:ping 172.17.56.104,如果不通,说明容器到远程服务器的网络链路存在问题
  • 测试3306端口可用性:
    • 安装telnet:apt update && apt install telnet
    • 执行:telnet 172.17.56.104 3306,如果显示无法连接,说明端口未开放

2. 调整MySQL用户访问权限

MySQL默认限制用户仅本地访问,需授权数据库用户允许从容器所在网络访问:

  • 登录远程MySQL服务器:mysql -u root -p
  • 授权用户(替换占位符为实际信息):
    GRANT ALL ON dbname.* TO 'dbusername'@'%' IDENTIFIED BY 'dbpassword';
    
    (如果要更安全,可将%替换为容器所在的子网,比如docker bridge网络默认子网为172.18.0.0/16,则授权'dbusername'@'172.18.%')
  • 刷新权限:FLUSH PRIVILEGES;

3. 检查远程服务器防火墙/安全组

确保远程服务器(172.17.56.104)的防火墙或安全组允许3306端口的入站请求:

  • 若使用iptables:
    # 允许宿主机IP访问3306(替换宿主机IP为实际值)
    iptables -A INPUT -p tcp --dport 3306 -s 宿主机IP -j ACCEPT
    # 保存规则
    iptables-save > /etc/iptables/rules.v4
    
  • 若为云服务器,需在安全组规则中添加:允许TCP 3306端口,来源为宿主机IP或docker子网

4. 优化数据库连接字符串

在连接字符串中增加超时参数,避免因默认超时过短导致失败:
修改Dockerfile中的环境变量:

ENV CONNECTION_STRING "server=172.17.56.104;Database=dbname;user id=dbusername;password=dbpassword;port=3306;Connection Timeout=30;"

同时确认所有参数(IP、端口、用户名、密码)与非容器化运行时完全一致。

5. 清理无效端口映射

test服务的4445:4444端口映射与数据库连接无关,若测试项目无需外部访问该端口,可从docker-compose.yml中移除该配置,减少不必要的网络配置:

test:
  image: mytest
  depends_on:
    - selenium
    - chrome
  volumes:
    - ./Result:/src/Result
  networks:
    - docker_network

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:05:23