.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,如果显示无法连接,说明端口未开放
- 安装telnet:
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
相关产品推荐
相关产品推荐

