将.net framework 4 部署在docker中的全过程(支持4.0 到 4.8,3.5应该也可以)
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将.net framework 4 部署在docker中的全过程(支持4.0 到 4.8,3.5应该也可以)相关的知识,希望对你有一定的参考价值。
前言:
docker自从诞生之初,就是运行在linux系统中,后来windows上也可以运行docker了,但是微软是通过自身的hyper-v技术,在你的windows系统中虚拟出来了一个小的linux虚拟主机,在它上面跑了个docker环境让你用,从而使你感觉到像是在windows上运行docker一样,但是其镜像还是运行在linux container中。
后来微软也出了自己的windows container来运行windows平台下的代码,例如支持.net framework,且.net framework 只能运行在windows container下,不能运行在linux container下。若强行在linux container下拉去windows container的镜像会报错:no matching manifest for linux/amd64 in the manifest list entries.
我们可以使用docker exec 进入容器内部看看
windows 容器:
这些目录是不是很熟悉~~~~ 一个小的windows系统,对于不跨平台的.net framework是无法跑在其中的。
正文
1、在windows上部署docker环境
下载安装这个小鲸鱼,直接可以部署docker环境的可视化工具。desktop docker 仅仅支持win10 pro 或 win10 专业版,并不支持其他windows版本,我使用win10家庭版安装后,发现只能使用linux container,无法切换windows container。这是一个大坑
下载地址: docker-desktop
安装完成后,用powshell。输入命令 docker --version
证明以安装成功
因为我们要使用windows container,所以记得右键托盘中的小鲸鱼切换。
成功后,可以先尝试跑一个官方的demo
docker run -it --rm -p 8000:80 --name aspnet_sample mcr.microsoft.com/dotnet/framework/samples:aspnetapp
微软官方操作文档 https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc
但是我在操作过程中,还是遇到了一些坑。
2、创建一个.net framework4.0 项目,并为其添加dockerfile
简简单单写个demo,只添加了一个WebForm1.aspx页面。然后对着项目右键=>添加=>docker支持 生成Dockerfile(若没有docke支持,只需要自己手动建一个同名文件即可),将其资源类型设为始终复制。右键发布!
来到发布后的文件夹中
此处有个关于dockerfile位置的大坑,一定要注意文件夹的位置,在.netcore中Dockfile和****.csproj在同一目录下是没问题的,但是.net framework又写奇怪,一定要改为如下的目录结构
也就是说将Dockerfile提到上一层中,不然COPY命令无法找到本地资源。(我也不知道为啥)
ps:Dockerfile中的COPY命令: COPY [本地host文件地址] [镜像内的要存放的文件地址] 也就是说将本地的发布文件复制到镜像内去。
打开这里的Dockerfile进行编写
内容如下:
FROM microsoft/aspnet (运行.net framework的基础镜像,其中包括sdk 和 iis,以为.net framework不像.netcore有kerstrel支持其自己跑起来,所以必须要有个iis来辅助,这个镜像中的iis仅支持64的发布程序,不支持32位)
WORKDIR /inetpub/wwwroot (镜像中发布文件的存放地址,这个地址不能变。)
COPY net40 . (传输文件到镜像中,我的这个"net40"对应Dockerfile同级的发布文件的文件夹。 文件目录一定不能错)
若目录层级不对,会报错 COPY failed: file not found in build context or excluded by .dockerignore
3、创建镜像
打开powshell,进入Dockerfile所在目录,输入命令创建镜像
docker build . -t net40
如果你第一次拉去这个aspnet的镜像会非常慢,建议更换镜像源。 https://mirror.baidubce.com 这个是百度的镜像源
等待完成后,使用命令将镜像运行起来
docker run -it -d -p 8040:80 net40
-d 后台运行
-p 暴漏出的端口 8040:40 将镜像中的80端口映射到本地的8040端口,framework默认运行在镜像中的iis上的就是80端口,无需代码中修改
net40 是上述image镜像的名字
4、浏览器预览
打开本地浏览器,localhost:8040/WebForm1.aspx
成功
如果报错404 或者 403 , 那一定是copy命令或目录层级的问题,使用docker exec进入到容器/inetpub/wwwroot中,多半是空的
5、log日志写在本地,需要持久化问题
对于.net framework项目,多半是老项目,日志文件一般都会写在本地,但如果镜像重启或删除,日志文件也随之消失。
解决此问题可以使用docker volume挂载卷,将/inetpub/wwwroot下的代码都挂载在一个本机的文件夹下,这样就不会丢失了,具体命令
docker run -it -d -p 8040:80 -v D:\\share\\Net40\\net40:C:\\inetpub\\wwwroot test40
D:\\share\\Net40\\net40 本机地址,持久化的地址
C:\\inetpub\\wwwroot docker镜像中的地址 '\\inetpub\\wwwroot' 与上述WORKDIR地址对应
以上是关于将.net framework 4 部署在docker中的全过程(支持4.0 到 4.8,3.5应该也可以)的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)
我可以在一个 IIS 站点中部署 .Net Framework 4.8.2 和 .Net 5 应用程序吗?
ASP.NET MVC 4 + Entity Framework 6 + SQL Compact Edition 4.0 部署无需安装