背景

虽然现在.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项目没有办法使用此镜像生成的容器最终成功运行,通过多次尝试后放弃了。后面又搜索了一些现有的镜像(包含monojexus的),但是发现都无法正常运行Web Api项目。哎,真心累啊!

最终我做了最后的尝试,即在虚拟机上安装了Ubuntu,在此系统下安装部署mono和jexus,但是最终的效果还是令人失望的。所以在不升级.NET版本的情况下,我放弃了使用Linux容器的方案。(当然,也有可能是我没有找到正确的方法)

Window容器部署

微软为.NET程序的Window容器部署提供了专门的镜像文件,同时也可以根据官网提供的教程进行学习,网上类似的文章也很多,所以这个方案目前来说是可以的。有一个非常重要的点,就是使用Window容器的话你首先要保证docker处于此模式下。

在这里插入图片描述

通过脚本创建网站

既然要使用docker,那么网站的创建也是需要使用脚本来完成的。所以本节我们来看看如果使用脚本创建网站,应用池以及相关的配置等等。

要完成网站的创建等工作,最主要的是使用appcmd.exe来完成,而此程序位于“C:\Windows\System32\inetsrv”目录下。可以在【CMD命令提示符】中通过以下命令来查看如何使用。

%windir%\system32\inetsrv\Appcmd /?

在这里插入图片描述

具体的使用可参照以下两个网站的内容,这里不再详细介绍。

我创建网站,只是进行了简单的配置。

  • 禁用日志
  • 设置了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-ItemRemove-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 frameworkwebapi项目通过docker部署的详细介绍,这里是使用的dockerWindow容器模式,所以在使用的时候一定要保证docker运行在此模式下才可以使用。
这种方式其实不怎么建议在实际项目中使用,虽然从学习的角度来说,可以通过研究来学习很多知识,甚至编写这篇博客。我更建议将后端的webapi升级到.net core.net6或以上比较好。这样可以全部使用容器的linux模式来统一处理,甚至使用yaml文件统一创建最终的项目部署自动化脚步。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐