将.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 容器:

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

 

这些目录是不是很熟悉~~~~   一个小的 windows 系统,对于不跨平台的.net framework 是无法跑在其中的。

 

 

正文

1、在 windows 上部署 docker 环境

下载安装这个小鲸鱼将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以),直接可以部署 docker 环境的可视化工具。desktop docker 仅仅支持 win10 pro 或 win10 专业版,并不支持其他 windows 版本,我使用 win10 家庭版安装后,发现只能使用 linux container,无法切换 windows container。这是一个大坑

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

下载地址:      docker-desktop

安装完成后,用 powshell。输入命令 docker –version

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

证明以安装成功

因为我们要使用 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 支持,只需要自己手动建一个同名文件即可),将其资源类型设为始终复制。右键发布!

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

 

来到发布后的文件夹中
将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

 

此处有个关于 dockerfile 位置的大坑,一定要注意文件夹的位置,在.netcore 中 Dockfile 和****.csproj 在同一目录下是没问题的,但是.net framework 又写奇怪,一定要改为如下的目录结构

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

也就是说将 Dockerfile 提到上一层中,不然 COPY 命令无法找到本地资源。(我也不知道为啥)

ps:Dockerfile 中的 COPY 命令:   COPY [本地 host 文件地址]  [镜像内的要存放的文件地址]     也就是说将本地的发布文件复制到镜像内去。

 

打开这里的 Dockerfile 进行编写

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

 

内容如下:

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

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

 

如果你第一次拉去这个 aspnet 的镜像会非常慢,建议更换镜像源。      https://mirror.baidubce.com  这个是百度的镜像源

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

 

 

等待完成后,使用命令将镜像运行起来

docker run -it -d -p 8040:80 net40

-d 后台运行

-p 暴漏出的端口     8040:40 将镜像中的 80 端口映射到本地的 8040 端口,framework 默认运行在镜像中的 iis 上的就是 80 端口,无需代码中修改

net40  是上述 image 镜像的名字

 

4、浏览器预览

打开本地浏览器,localhost:8040/WebForm1.aspx

将.net framework 4 部署在 docker 中的全过程(支持 4.0 到 4.8,3.5 应该也可以)

成功

 

如果报错 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 地址对应


来源:https://www.cnblogs.com/hallejuayahaha/p/14153794.html

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...