首页 新闻 会员 周边 捐助

.net core 3.1 程序发布到Centos7+Docker连接数据库超时

0
悬赏园豆:20 [待解决问题]

大家有没有遇到过这样的问题,怎么解决的
一个.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"]
tian_z的主页 tian_z | 初学一级 | 园豆:158
提问于:2020-04-26 18:50
< >
分享
所有回答(5)
0

127.0.0.1 指向的是docker实例本身。你可以替换为 192.168这也的ip

jzblive | 园豆:428 (菜鸟二级) | 2020-04-26 19:01

换为连接单独的一台sqlserver服务器也是不行

支持(0) 反对(0) tian_z | 园豆:158 (初学一级) | 2020-04-26 19:13

还试过了改为.netcore 2.2 就可以正常运行 不知道3.1到底是哪里出了问题

支持(0) 反对(0) tian_z | 园豆:158 (初学一级) | 2020-04-26 19:14
0

docker 环境下 ping 一下你数据库的IP,如果不通,建议你看一下 docker 网络配置

顽皮大叔 | 园豆:318 (菜鸟二级) | 2020-04-26 19:16

ping 过了.netcore 2.2 的容器和.netcore3.1的容器都是可以ping通数据库的地址,但是2.2的是ok的 3.1的不行

支持(0) 反对(0) tian_z | 园豆:158 (初学一级) | 2020-04-26 19:36
0

终端输入 ifconfig 命令,看下 docker0 里面的IP,用这个试下

tenghao510 | 园豆:179 (初学一级) | 2020-04-27 08:37
0

基础镜像换成 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1试试,slim或者alpine等被裁减过的镜像有时候会有奇葩的问题。

Timetombs | 园豆:3959 (老鸟四级) | 2020-04-27 10:09


基础镜像改了之后还是一样

支持(0) 反对(0) tian_z | 园豆:158 (初学一级) | 2020-04-27 10:22

@tian_z: 那就在容器里安装一个tcpdump,抓包:

tcpdump port 你的mysql服务的端口号 -w sql.pcap

支持(0) 反对(0) Timetombs | 园豆:3959 (老鸟四级) | 2020-04-27 10:28
0

感谢各位大佬
最后
base库改为
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
解决问题
slim版本确实是有问题

tian_z | 园豆:158 (初学一级) | 2020-04-27 14:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册