Win10中使用docker部署.net webapi随笔
虽然现在`.NET`的发展已经到了开源、免费、跨平台的阶段,而且`.NET 8`应该也要发布了,但是在国内,很多的项目还是使用的`.NET Framework`版本。由于种种大家都能明白的原因,短期也没有升级版本的打算,然而有时候也想用`docker`来加快最终的项目部署,从而缩短部署时间等。
背景
虽然现在.NET
的发展已经到了开源、免费、跨平台的阶段,而且.NET 8
应该也要发布了,但是在国内,很多的项目还是使用的.NET Framework
版本。由于种种大家都能明白的原因,短期也没有升级版本的打算,然而有时候也想用docker
来加快最终的项目部署,从而缩短部署时间等。
介绍
.NET Framework
完成的Web Api
想要部署到docker
中,有两种选择:一种是像.NET Core
那样,部署到Linux
容器中;另一种就是部署到Window
容器中。下面我们来分别说说。
Linux容器部署
对于非.net core
的应用程序来说,要想在Linux
平台运行需要安装mono
框架,这是在Linux
平台运行.NET
程序的唯一方法,那么如果想把.NET
程序部署到Linux
容器里,也是一样的方法过程,你需要构建一个安装有mono
环境的镜像。
网上搜到比较多的是使用azraelrabbit/monupw
镜像。因为我们的web
项目要想运行,需要有一个像IIS
一种的服务器组件,在Linux
里我们一般使用jexus来实现这个功能,也就是说,我们的docker
镜像应该即有mono
还要有jexus
的集成,而此镜像就包含了两者。但是通过测试,目前开发的Web Api
项目没有办法使用此镜像生成的容器最终成功运行,通过多次尝试后放弃了。后面又搜索了一些现有的镜像(包含mono
和jexus
的),但是发现都无法正常运行Web Api
项目。哎,真心累啊!
最终我做了最后的尝试,即在虚拟机上安装了Ubuntu
,在此系统下安装部署mono和jexus,但是最终的效果还是令人失望的。所以在不升级.NET
版本的情况下,我放弃了使用Linux
容器的方案。(当然,也有可能是我没有找到正确的方法)
Window容器部署
微软为.NET
程序的Window
容器部署提供了专门的镜像文件,同时也可以根据官网提供的教程进行学习,网上类似的文章也很多,所以这个方案目前来说是可以的。有一个非常重要的点,就是使用Window
容器的话你首先要保证docker处于此模式下。
通过脚本创建网站
既然要使用docker
,那么网站的创建也是需要使用脚本来完成的。所以本节我们来看看如果使用脚本创建网站,应用池以及相关的配置等等。
要完成网站的创建等工作,最主要的是使用appcmd.exe
来完成,而此程序位于“C:\Windows\System32\inetsrv
”目录下。可以在【CMD命令提示符】中通过以下命令来查看如何使用。
%windir%\system32\inetsrv\Appcmd /?
具体的使用可参照以下两个网站的内容,这里不再详细介绍。
- https://www.cnblogs.com/94YY/p/4542711.html
- https://blog.csdn.net/weixin_33949359/article/details/92560251
我创建网站,只是进行了简单的配置。
- 禁用日志
- 设置了IIS_USER的全部权限
- 设置应用池回收时间
注意:如果需要更多的设置可参考上面两篇文章根据自己的实际情况进行配置。
实现网站及相关配置的完整代码如下。
@echo off
:: 定义变量
set Sitename=MBM-Web
set SitePath=C:\Publish
set BackPort=7032
set netversion=v4.0
:: 执行网站的创建
%windir%\system32\inetsrv\Appcmd add apppool /name:%Sitename% /managedRuntimeVersion:%netversion% /managedPipelineMode:"Integrated" /enable32BitAppOnWin64:False
%windir%\system32\inetsrv\Appcmd add site /name:"%Sitename%" /id:10 /bindings:http/*:%BackPort%: /physicalpath:%SitePath%
%windir%\system32\inetsrv\Appcmd set site /site.name:"%Sitename%" /[path='/'].applicationPool:%Sitename%
:: 配置网站
%windir%\system32\inetsrv\Appcmd set site "%Sitename%" /logFile.enabled:false
%windir%\system32\inetsrv\Appcmd set apppool /apppool.name: %Sitename% /-recycling.periodicRestart.schedule
%windir%\system32\inetsrv\Appcmd set apppool /apppool.name: %Sitename% /+recycling.periodicRestart.schedule.[value='03:00:00']
%windir%\system32\inetsrv\Appcmd set apppool /apppool.name: %Sitename% /recycling.periodicRestart.time:00:00:00
:: 权限设置
icacls %SitePath% /grant IIS_IUSRS:F /C
echo %Sitename% Site Create Success
创建Dockerfile文件
要在Window容器中创建网站,最好的办法就是使用Dockerfile文件进行创建。这里我们使用的基础镜像库是mcr.microsoft.com/dotnet/framework/samples:aspnetapp
。想了解更多,可以查看此文章进行学习。
关于Dockerfile
中关键字的具体使用可参考此文章,这里不详细介绍了。
此Dockerfile
文件主要需要完成任务就是创建一个IIS
的网站站点。所以我们需要创建相关目录,将我们在上一个小节中创建的脚本文件复制到docker
内容并执行,最后我们需要清理相关无用的文件、目录等。
完成的Dockerfile
文件内容如下。
# define webapi windows docker images
FROM mcr.microsoft.com/dotnet/framework/samples:aspnetapp
LABEL VERSION="1.0"
# create new folder to publish website
RUN New-Item -Path C:\ -ItemType Directory -Name Publish; \
New-Item -Path C:\ -ItemType Directory -Name Script;
# create data volume
VOLUME "C:\Publish"
# copy create web site bat file
COPY ./CreateIISSite.bat ../../Script/
# run bat file
RUN C:\Script\CreateIISSite.bat; \
Remove-Item -Path C:\Script\CreateIISSite.bat -Force; \
RMDIR C:\Script
# expose port defined in the bat file
EXPOSE 7032
简单解释:New-Item
和Remove-Item
等命令都是powershell
的命令。
当我们完成Dockerfile
文件的创建后,就可以通过以下命令构建我们自己的镜像了。
docker build --no-cache -t mbmwebapi:v1 .
注意:执行以上命令,都需要容器是运行在Window容器模式下。
如何在容器内访问宿主机
关于此节内容,主要是因为Window
容器模式和Linux
容器模式的网络是不兼容的,所以如果你的数据库、缓存等使用的Linux
容器模式,WebApi
用的是Window
容器模式,那么就会造成WebApi
无法访问到数据库和缓存。但是在宿主机上,我们是可以轻松的访问到数据库和缓存的,所以也就有了这一小节的内容。
开始的时候我是考虑使用网络的,但是通过各种搜索后都无法实现从容器内容进行访问。最终只有通过从Window
容器模式容器内容访问宿主机这个方式来实现WebApi
对数据库和缓存等的访问了。
这个方式也是在搜索过程中无意间发现的,通过route
命令进行处理。
所以在容器中,最终的执行方式如下。
docker exec -it mbm-webapi cmd /c "route add 192.168.2.10 mask 255.255.255.0 192.168.2.1"
注意:命令的中的
IP
地址:192.168.2.10 即宿主机的IP
地址。后面的是相应的掩码和网关。
总结
以上就是将.net framework
的webapi
项目通过docker
部署的详细介绍,这里是使用的docker
的Window
容器模式,所以在使用的时候一定要保证docker
运行在此模式下才可以使用。
这种方式其实不怎么建议在实际项目中使用,虽然从学习的角度来说,可以通过研究来学习很多知识,甚至编写这篇博客。我更建议将后端的webapi
升级到.net core
或.net6
或以上比较好。这样可以全部使用容器的linux
模式来统一处理,甚至使用yaml
文件统一创建最终的项目部署自动化脚步。
更多推荐
所有评论(0)