windows container 踩坑记

windows container 踩坑记

Intro

我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署在 windows container 下,折腾的有点恶心,记录一下。

Windows Container 介绍


640?wx_fmt=jpeg

Windows Container 是微软在 Windows 上的虚拟化实践,它可以提供操作系统级别的虚拟化。通过我们说的容器化大多是指 Linux Container,基于 linux 的 container 实践,除此之外还有 windows container,如果你使用的是 windows 且使用过 Docker for Desktop,你也许会注意到 docker 右键的时候会有一个 “Switch to windows container” 的选项。

640?wx_fmt=png

Windows container 架构:

640?wx_fmt=other

Windows container 分为两大部分:windows container on windows(下文简称 Windows Container), linux container on windows(下文简称 Linux Container), 我们今天将要用到的是 Windows container.

上图所示的两种方式对应着 Docker for Desktop 里 Windows Container 和 Linux Container 两种 docker 容器化运行时,两种运行时不能同时使用,可以切换,切换过程中数据是不会丢失的,你不可以在 windows container 环境下操作 linux container 的镜像与容器,更不能在 linux container 环境 下操作 windows container 的镜像和容器,两者架构上不一致。

windows container 是相当于 docker 在 linux 下的原生实现,linux container 是通过 Hyper-V 托管了一个小型虚拟机以实现 linux 环境。

Windows 容器类型

你应该知道, 有两个不同的容器类型 (也称为运行时)。

Windows Server 容器通过进程和命名空间隔离技术提供应用程序隔离, 这就是这些容器也称为进程隔离的容器的原因。Windows Server 容器与容器主机和该主机上运行的所有容器共享内核。这些进程隔离的容器不提供敌意安全边界, 不应用于隔离不受信任的代码。由于共享内核空间,这些容器要求具有相同的内核版本和配置。

Hyper-v 隔离通过在高度优化的虚拟机中运行每个容器来扩展 Windows Server 容器提供的隔离。在此配置中, 容器主机不与同一主机上的其他容器共享其内核。这些容器旨在托管敌对多租户,并且具有与虚拟机相同的安全保证。由于这些容器不与主机上的主机或其他容器共享内核, 因此它们可以运行具有不同版本和配置 (受支持版本内) 的内核。例如, Windows 10 上的所有 Windows 容器都使用 Hyper-v 隔离来利用 Windows Server 内核版本和配置

尽管两者在技术架构上有差异,但是 docker 的基本操作都是适用的,如果你的磁盘不够大网速不够好,不建议直接在自己电脑上尝试 windows container,windows container 大部分是基于 windows-sever 的镜像,动则十几个G,下载镜像都不一定能下载成功。

GetStarted

部署一个简单的 dotnet framework 应用到 windows 容器

docker pull microsoft/iis 拉一个 iis 的 docker 镜像

docker run --rm -p 8080:80 --name=iis microsoft/iis:latest	
docker run --it iis powershell

看着上面的命令是不是感觉很熟悉啊,下面再看一个 Dockerfile 这是一个 asp.net 的应用的 dockerfile,来自微软的官方示例

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build	
WORKDIR /app	
# copy csproj and restore as distinct layers	
COPY *.sln .	
COPY aspnetapp/*.csproj ./aspnetapp/	
COPY aspnetapp/*.config ./aspnetapp/	
RUN nuget restore	
# copy everything else and build app	
COPY aspnetapp/. ./aspnetapp/	
WORKDIR /app/aspnetapp	
RUN msbuild /p:Configuration=Release	
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime	
WORKDIR /inetpub/wwwroot	
COPY --from=build /app/aspnetapp/. ./

踩的坑

项目是 AspNetCore 只是项目是 dotnet framework471 的,并且有引用几个 netstandard2.0 的项目,


1. 在 msbuild 的时候出错,尚未找到解决方法,提了一个 issue 还没回复https://github.com/microsoft/dotnet-framework-docker/issues/315看到有人说要引用 “Microsoft.Net.Compilers” 这个包,在项目里加上了这个包的引用还是有问题,这个问题很神奇,本地 dotnet build/ msbuild 都是正常的

msbuild 有问题之后便想用 dotnet build 来编译,最初尝试安装 dotnet core 后来发现这个 framework 镜像里已经安装 dotnet core sdk,太好了不用再自己装了,后来用 dotnet build 代替了 msbuild

2. host 应用


  • dotnet 不能执行 dotnet framework 生成的 exe,原本想着像在 linux 下面跑 dotnet core 一样,直接 dotnet<xxx.dll>使用 kestrel 来托管,然而并不能直接运行,起初按错误提示以为要手动加一个 runtimeconfig.json 来指定框架类型及版本,后来才知道 runtimeconfig.json 只支持 dotnetcore,详见https://github.com/dotnet/core-setup/issues/7149

  • 后来还是放到 iis 下面,当时使用的是 microsoft/iis 这个镜像,发现放上去之后不能运行,报 500 错误,后来又装 dotnetcore-windows-hosting ,还是不行最终在 Event-Log 中发现没有framework471 ...

  • 后来使用 mcr.microsoft.com/dotnet/framework/aspnet:4.7.1 这个镜像,然后在安装 dotnetcore-windows-hosting 的时候又是一波多折。。最后先安装了 chocolatey , chocolatey 是 windows 上的一个包管理器,像管理nuget包一样管理你PC上的软件,然后使用 choco install dotnetcore-windowshosting-y 来安装 dotnetcore-windowshosting 模块。

Solution

最终使用的 Dockerfile 如下:

FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.1 AS build	
WORKDIR /app	
# copy csproj and restore as distinct layers	
COPY Projects/*.csproj ./Projects/	
COPY nuget.config ./	
RUN dotnet restore ./Projects/Projects.csproj	
# copy everything else and build app	
COPY . .	
WORKDIR /app/Projects	
RUN dotnet publish -c Release -o out	
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.1	
WORKDIR /inetpub/wwwroot	
# install choco	
RUN Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))	
# install dotnetcore-windowshosting	
RUN choco install dotnetcore-windowshosting -y	
RUN powershell -NoProfile -Command Remove-Item -Recurse C:\inetpub\wwwroot\*	
COPY --from=build /app/Projects/out/ ./

Memo

折腾起来真是麻烦,可以直接上 dotnetcore 还是直接上 dotnetcore 吧

Tips

windows container 里 RUN 是相当于在 powershell 中执行命令

Reference

  • https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/quick-start/quick-start-windows-10

  • https://chocolatey.org/install

  • https://github.com/microsoft/dotnet-framework-docker

  • https://github.com/microsoft/dotnet-framework-docker/tree/master/samples

  • https://docs.microsoft.com/en-us/virtualization/windowscontainers/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白开学Asp.Net Core 《七》

小白开学Asp.Net Core 《七》— — 探究中间件&#xff08;MiddleWare&#xff09;1、何为中间件&#xff1f;中间件是组装到应用程序管道中以处理请求和响应的家伙&#xff0c;管道中的每个组件都要满足以下两个条件选择是否将请求传递给管道中的下一个组件可以在调用管道中的…

aspnetcore 实现简单的伪静态化

aspnetcore 实现简单的伪静态化Intro在我的活动室预约项目中&#xff0c;有一个公告模块&#xff0c;类似于新闻发布&#xff0c;个人感觉像新闻这种网页基本就是发布的时候编辑一次之后就再也不会改了&#xff0c;最适合静态化了&#xff0c; 静态化之后用户请求的就是静态文件…

#530. 「LibreOJ β Round #5」最小倍数 二分 + 数论

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 本来想刷数位dpdpdp&#xff0c;无意间碰到了这个题来水水。 我们知道n!n!n!中质因子ppp的个数为∑i1npi\sum_{i1} \frac{n}{p^i}∑i1​pin​&#xff0c;所以我们就可以二分nnn&#xff0…

《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文

写在开始三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击,现在可以致敬伟大的.NET斗士甲骨文了  (JDK8以上都需要收费,Android弃用java作为第一语言,别高兴:OpenJDK是甲骨文的).《ASP.NET Core 高性能系列》是一套如何编…

Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们知道如果所有数的和summodk!0sum\bmod k!0summodk!0那么此时无解&#xff0c;否则我们设needsum/kneedsum/kneedsum/k。 看到kkk这么小&#xff0c;自然的想到是否能状压&#xff…

资深开发者们是如何读书的?---线下读书会记录

读了多少书&#xff1f;怎么读书&#xff1f;——请问大家最近读书了吗&#xff1f;一年大概读了多少本书。有超过20本&#xff0c;超过30本&#xff0c;超过50本吗&#xff1f;在7月14日由长沙互联网活动基地和长沙.NET技术社区组织的小型社区活动&#xff0c;《开发者爱读书•…

架构杂谈《三》

一致性问题前面的《架构杂谈一》和《架构杂谈二》 杂谈了从服务化到微服务架构的演进&#xff0c;并肯定了服务化和微服务架构是一脉相承的。微服务在服务化架构的基础上&#xff0c;对服务化的细节和方案进行了优化和细化&#xff0c;重点突出了无中心化管理的微服务架构&…

腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数

在之前的文章中&#xff0c;我们提到了亚马逊、谷歌、IBM 等大厂都上了 Visual Studio Code 的船。阿里巴巴也在近日发布了 Aliyun Serverless VS Code 插件。近期&#xff0c;腾讯也上了 VS Code 的船&#xff0c;发布了基于 VS Code 的 Tencent SCF Toolkit 插件&#xff0c;…

端到端测试实践:Jenkins集成TestCafe

上一篇《对产品质量的一点思考》中说到自动化测试的重要性&#xff0c;本文简单介绍下怎样在实际项目中实现端到端测试的自动化&#xff0c;在这里我们使用的端到端测试工具是TestCafe。环境Jenkisn&#xff1a;2.183TestCafe&#xff1a;1.3.0为什么采用TestCafe做自动化测试要…

再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

Gitlab runner 快速搭建CICD pipeline背景日常开发中&#xff0c;相信大家已经做了很多的自动化运维环境&#xff0c;用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包&#xff0c;部署全流水线Jenkins在devops担任了很重要的角色&#xff0c;但是另一方面…

.NET Core 3.0之深入源码理解Kestrel的集成与应用(二)

前言前一篇文章主要介绍了.NET Core继承Kestrel的目的、运行方式以及相关的使用&#xff0c;接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容&#xff0c;该部分内容&#xff0c;我们无需掌握&#xff0c;依然可以用好Kestrel&#xff0c;本文只是将一些内部…

译 | 使用Roslyn分析器高效编写更好的代码

原文&#xff1a;Mika Dumont翻译&#xff1a;汪宇杰Roslyn 是 .NET 编译器平台&#xff0c;即使在运行代码之前&#xff0c;它也能帮助您捕获 Bug。例如内置于 Visual Studio 中的Roslyn 拼写检查分析器。假设您正在创建一个静态方法&#xff0c;并将 static 单词拼错为 statc…

Codeforces Round #724 (Div. 2) F. Omkar and Akmar 组合数学 + 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们先来研究一下这个游戏&#xff0c;手画几个会惊奇的发现&#xff0c;后手这个b怎么怎么画都赢啊&#xff1f;&#xff1f;&#xff1f;对&#xff0c;没错&#xff0c;就是怎么画都…

Visual Studio 支持 Java?谣言止于智者

在去年的某一段时间内&#xff0c;我们经常会看到标题类似为“宇宙第一 IDE Visual Studio 支持 Java 了&#xff01;”的文章。当时&#xff0c;韩老师看到这篇文章也是一脸懵逼。公司里做 Java 的开发童鞋们就坐在韩老师附近&#xff08;嗯&#xff0c;不超过五米的距离&…

Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 最小生成树 + 虚拟点

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 看错题导致误入歧途&#xff0c;如果能早点看见翻译也不至于一天多也没想出来。 求联通的最小代价&#xff0c;自然的想到了能不能建边跑最小生成树。 对于两点之间比较好弄&#xff0c;直…

小白开学Asp.Net Core 《八》

小白开学Asp.Net Core 《八》— — .Net Core 数据保护组件1、背景我在搞&#xff08;https://github.com/AjuPrince/Aju.Carefree&#xff09;这个开源项目的时候&#xff0c;想做一些防止恶意攻击的小功能&#xff08;如果 我通过页面 /Dome/GetData?id123&#xff0c;那是不…

你必须知道的Docker镜像仓库的搭建

近期工作中发现用到的容器镜像越来越多&#xff08;不多的时候没考虑过镜像仓库的问题&#xff09;&#xff0c;同一个容器镜像也存在多个版本&#xff0c;那么镜像仓库的搭建需求就涌现出来&#xff0c;本文就目前的几个常用镜像仓库的搭建进行介绍&#xff0c;我们可以根据需…

nowcoder 河 我 车 题 错 天 乐 赛 倍增处理

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 倍增经典题了&#xff0c;考虑维护一个前缀和sum[i]sum[i]sum[i]&#xff0c;对于iii位置我们肯定是贪心的选能到的最远位置&#xff0c;即第一个>sum[i−1]k>sum[i-1]k>sum[i−1…

ASP.NET Core Web Api之JWT(一)

最近沉寂了一段&#xff0c;主要是上半年相当于休息和调整了一段时间&#xff0c;接下来我将开始陆续学习一些新的技能&#xff0c;比如Docker、Jenkins等&#xff0c;都会以生活实例从零开始讲解起&#xff0c;到时一并和大家分享和交流。接下来几节课的内容将会讲解JWT&#…

Codeforces Round #658 (Div. 2) D. Unmerge 思维 + 背包

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们可以假设有两个桶&#xff0c;让后向里面放数&#xff0c;可以发现&#xff0c;如果向其中放入了aia_iai​&#xff0c;那么紧跟在他后面的所有<ai<a_i<ai​的数都必须跟在ai…