windows container 踩坑记
windows container 踩坑记
Intro
我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署在 windows container 下,折腾的有点恶心,记录一下。
Windows Container 介绍
Windows Container 是微软在 Windows 上的虚拟化实践,它可以提供操作系统级别的虚拟化。通过我们说的容器化大多是指 Linux Container,基于 linux 的 container 实践,除此之外还有 windows container,如果你使用的是 windows 且使用过 Docker for Desktop,你也许会注意到 docker 右键的时候会有一个 “Switch to windows container” 的选项。
Windows container 架构:
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/
windows container 踩坑记相关推荐
- Typora+PicGo-core+SMMS图床踩坑记
Typora+PicGo-core+SMMS图床踩坑记 一.安装PicGo-Core 二.安装smms v2 API插件 三.配置PicGo-Core 四.最终效果 五.总结 最近把Typora更新后 ...
- 7代cpu能装虚拟xp系统吗_Intel 10代PC/笔记本安装Win7踩坑记 amp; 驱动分享
免责声明:本文只是从技术角度进行讨论,主要因我自己的兴趣而引发测试.只代表个人观点,与任何组织机构无关. 目录 - 从赛扬G5900"亮机"CPU说起 - 10代Core Wi ...
- 安装sql server踩坑记【sql2000程序安装配置服务器失败】
安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...
- 口罩、安全帽识别比赛踩坑记(二) 比赛流程及 SSD / YOLO V3 两版本实现
本篇文章主要对比赛流程中的各个环节进行展开说明,并对笔者践行过的代码及更改的地方进行记录.如哪里有侵权请联系笔者进行删除.另外在这里对比赛举办方表示感谢 ~ ~ 其中开源代码会在整理后放在github ...
- 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想
前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...
- linux mint 无法联网_linux mint踩坑记
linux mint踩坑记 linux 简介 1.linux mint 是基于debian的一个发行版,以友好的界面素称,开始菜单很像windows,风格以清新为主! 2.linux mint 分为两 ...
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
<>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...
- 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题
❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...
- Spring @Transactional踩坑记
@Transactional踩坑记 总述 Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...
最新文章
- Pytorch两种模型保存方式
- iOS 地图定位 定位
- leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
- mini2440:最简单的嵌入式linux驱动程序模块,mini2440:最简单的嵌入式Linux驱动程序模块 解决找不到mini2440……sample...
- 1-2:网络初识之了解OSI和TCP/IP及网络分层(物理层,数据链路层,网路层,传输层,应用层)
- Netty工作笔记0029---NIO 网络编程应用--群聊系统4--客户端编写2
- 如何创建隐藏用户帐号
- 关于类型的存储时间和链接
- php服务器启动错误,服务器意外重启之后PHP-FPM不能启动
- 图片右侧加文字html完整代码,怎么用css在图片右下方添加文字
- pop3邮箱怎么设置收发服务器端口,pop3设置(如何设置邮箱服务器?IMAP、POP3有何区别?)...
- 苹果Mac安装win10双系统
- 微信小程序一个按钮同时获取用户信息和手机号码
- MCNP5 粒子输运 常见问题汇总与踩坑记录(导火索:死循环)
- 浅谈getaddrinfo
- 『深度学习项目四』基于ResNet101人脸特征点检测
- 大型网站技术架构 读书笔记3 架构师
- 陕西师范大学计算机科学学院保研院校,陕西师范大学计算机科学学院(专业学位)计算机技术保研细则...
- git fatal: branch ‘master‘ does not exist
- 形态学在图像处理中的应用
热门文章
- LuckyDraw bot有幸被提名为微软2019的People's Choice app
- 如何将世界时钟和时区小部件添加到您的iPhone
- Zoom Host可以真正看到您的所有私人消息吗?
- api游戏编程鼠标选择拖动_如何选择合适的游戏鼠标
- 免费的数字图书馆_不仅是书籍:您当地图书馆可能提供的所有免费数字资料
- GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
- 201521123070 《JAVA程序设计》第13周学习总结
- 机器学习-tensorflow
- Bitcoin比特币与BlockChain区块链技术
- HTML meta refresh 刷新与跳转(重定向)页面