大家有没有遇到过这样的问题,怎么解决的
一个.net core 3.1 的webapi应用,里面有连接sqlserver数据库的操作
在window平台运行正常
发布到centos7直接运行也正常
发布到centos7的docker容器之后就连接超时:
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
centos版本:centos-release-7-7.1908.0.el7.centos.x86_64
Docker版本:Docker version 19.03.8, build afacb8b
以下是测试的Controller
namespace WebApplication3.Controllers
{
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
[HttpGet]
public string Get()
{
String connsql = "server=127.0.0.1,1433;database=test;uid=sa;password=123456;";
try
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = connsql;
conn.Open();
String sql = "select * from test";
SqlDataAdapter myda = new SqlDataAdapter(sql, conn);
DataTable dt = new DataTable();
myda.Fill(dt);
conn.Close();
return dt.Rows[0][1].ToString();
}
}
catch (Exception ex)
{
return "错误信息:" + ex.Message;
}
}
}
}
以下是Dockerfile文件
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]
127.0.0.1 指向的是docker实例本身。你可以替换为 192.168这也的ip
换为连接单独的一台sqlserver服务器也是不行
还试过了改为.netcore 2.2 就可以正常运行 不知道3.1到底是哪里出了问题
docker 环境下 ping 一下你数据库的IP,如果不通,建议你看一下 docker 网络配置
ping 过了.netcore 2.2 的容器和.netcore3.1的容器都是可以ping通数据库的地址,但是2.2的是ok的 3.1的不行
终端输入 ifconfig 命令,看下 docker0 里面的IP,用这个试下
基础镜像换成 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
试试,slim或者alpine等被裁减过的镜像有时候会有奇葩的问题。
基础镜像改了之后还是一样
@tian_z: 那就在容器里安装一个tcpdump,抓包:
tcpdump port 你的mysql服务的端口号 -w sql.pcap
感谢各位大佬
最后
base库改为
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
解决问题
slim版本确实是有问题