docker部署asp.net core webapi项目连接本地sql server服务器问题

项目情况:

  1. asp.net core webapi项目需要部署至docker上(因为即将部署上去的服务器系统为Windows Server 2008,无法直接部署.net core项目,就想着部署到docker上)
  2. 数据库在宿主机上(即安装docker的机器上)
  3. 现在需要配置asp.net core webapi项目连接上本地数据库

项目部署网络使用的是docker默认的docker0 bridge(网桥),网关为172.17.0.1,项目的ip为172.17.0.2
网桥IP配置.png

然后我按照网上搜索到的办法先对sql server数据库先做一些设置

  1. 打开Microsoft SQL Server Management Studio(即sql数据库安装完成之后进入的数据库管理软件),登录上去之后右键服务器点击属性,唤出服务器属性界面
    服务器属性界面.png
  2. 点击安全性选项卡,选择混合身份验证模式
    服务器安全性.png
  3. 点击连接,勾选允许远程连接至此服务器
    服务器连接.png
  4. 打开Sql Server Configuration Manager,我电脑装的是SQL Server 2012,唤出这个软件需要在命令行输入SQLServerManager11.msc即可,点击网络配置启用TCP/IP和Named Pipes
    不同版本的命令.png

网络配置.png

  1. 配置防火墙,我自己是关闭了所有的防火墙,如果不关的话需要自行配置1433的入站策略

数据库方面配置完成,接下来配置项目部署至docker,在vs中右击项目添加docker支持,项目会多一个Dockerfile的文件,其中写好了生成和部署至容器的代码,可以根据自己的实际业务进行更改和修正(补充一句,docker-compose是对多个Dockerfile的编排、添加依赖和添加一些其他额外参数,例如自己使用这个Dockerfile需要自行到项目文件夹下在命令行敲docker build -t 镜像名 . 构建镜像,之后再进行docker run -d -P 本机端口:容器端口 --name 镜像名 生成容器,反观docker-compose配置完成之后直接越过这两步,并且可以进行多个容器的构建)
配置项目的数据库连接Data Source=host.docker.internal,1433;Initial Catalog=admindb;User Id=sa;Password=;Pooling=true;Min Pool Size=1 可以看到我这里使用的是host.docker.internal,这个可以指代宿主机的ip,我实测发现这ip不是172.17.0.1,而是192.169.65.2,这之中的关系就如下图

docker-bridge.png

我准备完上面两步之后,出现了一个问题,我在命令行中输入netstat -a并没有看到0.0.0.0:1433,说明sqlserver并没有在监听
,我是这么解决这个问题的,在上面第4步时双击TCP/IP进入

TCPIP.png

TCP/IP属性的IP地址,拉到最后会有个IPALL,我之前因为其他帖子更改了这里的1433,变成了49172(有个猜想,我如果在.net core项目中使用host.docker.internal,49172会不会也可以连接上,不过这是后话,有空我会去做个试验,我觉得大概率是可以的),更改回1433之后,需要重启sql server服务,右击重启即可生效

sql server服务.png
看到监听之后,即可成功部署服务并连接上本地sql server数据库。


然后数据库是连接上了,但是出现了新的问题provider: TCP Provider, error: 35 - An internal exception was caught
查询原因之后一篇帖子解决了我的问题
出现问题的 asp.net core 程序是跑在容器中的,容器镜像用的是 mcr.microsoft.com/dotnet/core/aspnet:3.0

运行容器内的 openssl 命令发现 openssl 的版本比较高

# docker exec -t $(docker ps --filter name=blog_api -q) openssl version
OpenSSL 1.1.1b  26 Feb 2019

查看 openssl.cnf 配置文件

# docker exec -t $(docker ps --filter name=blog_api -q) cat /etc/ssl/openssl.cnf
[system_default_sect]
MinProtocol = TLSv1.1
CipherString = DEFAULT@SECLEVEL=2

发现允许的 ssl 最低版本是 TLSv1.2 ,而程序所使用的 SQL Server 数据库版本比较低不支持 TLSv1.2 ,修改为 TLSv1.0 后问题解决

修改方法:在 Dockerfile 中添加下面的指令

RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf

这些都是摘抄自解决方案,非常感谢他的解决方案,解决了我的问题。
我在自己的Dockerfile中的这个位置放置这句代码
代码.png

.net coredockersql server