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

6c6d7d04114594f6c3c68fcaf4836001.png

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

正文

1、在windows上部署docker环境

下载安装这个小鲸鱼d48bda429a59a5dd3ca0f1c51f58ca8e.png,直接可以部署docker环境的可视化工具。desktop docker 仅仅支持win10 pro 或 win10 专业版,并不支持其他windows版本,我使用win10家庭版安装后,发现只能使用linux container,无法切换windows container。这是一个大坑

ee0c4649a0175944c6c55888a61a35c4.png

下载地址:      docker-desktop

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

a67e08bb2b23cd616496452910d598bb.png

 证明以安装成功

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

bf680859565de2721096469006c7d19f.png

 来到发布后的文件夹中

 50dc47eadeb1dfe2962ed49f4f769304.png

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

7777617e12e6ced98fee11a53691ebb2.png

 acce9a477bb4427d4bd0d3fabd916452.png

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

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

打开这里的Dockerfile进行编写

87d54ed263ddbd254ac1bb7a2e6ecf7f.png

 内容如下:

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

a6d1f18dfdcb4c985075b42506faad8c.png

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

516b7e08b24096c4e1888eec6dae0fac.png

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

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

-d 后台运行

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

net40  是上述image镜像的名字

4、浏览器预览

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

91b91b60c3f65e131597a353cea0087e.png

 成功

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
.NET Core 3.1 项目用 Docker 打包并部署的步骤如下: 1. 在项目根目录下创建一个 Dockerfile 文件,文件内容如下: ``` FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env WORKDIR /app # Copy csproj and restore as distinct layers COPY *.csproj ./ RUN dotnet restore # Copy everything else and build COPY . ./ RUN dotnet publish -c Release -o out # Build runtime image FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "YourProject.dll"] ``` 其,第一行指定了基础镜像为 .NET Core SDK 3.1,第二行指定了工作目录为 /app。接下来,将项目的 csproj 文件复制到容器,并执行 dotnet restore 命令安装项目依赖。然后,将整个项目复制到容器,并执行 dotnet publish 命令将项目编译成可执行文件。最后,指定基础镜像为 .NET Core 3.1 运行时,将编译好的可执行文件复制到容器,并指定入口点为 YourProject.dll。 2. 在项目根目录下执行以下命令,将项目打包成 Docker 镜像: ``` docker build -t your-image-name . ``` 其,your-image-name 为自定义的镜像名称。 3. 将镜像上传到 Docker Hub 或私有镜像仓库: ``` docker push your-image-name ``` 4. 在目标服务器上安装 Docker,并从 Docker Hub 或私有镜像仓库拉取镜像: ``` docker pull your-image-name ``` 5. 运行容器: ``` docker run -d -p 80:80 your-image-name ``` 其,-d 表示容器在后台运行,-p 表示将容器的 80 端口映射到主机的 80 端口,your-image-name 为之前打包的镜像名称。 至此,.NET Core 3.1 项目已经成功打包并部署Docker 容器了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值