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 踩坑记相关推荐

  1. Typora+PicGo-core+SMMS图床踩坑记

    Typora+PicGo-core+SMMS图床踩坑记 一.安装PicGo-Core 二.安装smms v2 API插件 三.配置PicGo-Core 四.最终效果 五.总结 最近把Typora更新后 ...

  2. 7代cpu能装虚拟xp系统吗_Intel 10代PC/笔记本安装Win7踩坑记 amp; 驱动分享

    免责声明:本文只是从技术角度进行讨论,主要因我自己的兴趣而引发测试.只代表个人观点,与任何组织机构无关. 目录 -  从赛扬G5900"亮机"CPU说起 -  10代Core Wi ...

  3. 安装sql server踩坑记【sql2000程序安装配置服务器失败】

    安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...

  4. 口罩、安全帽识别比赛踩坑记(二) 比赛流程及 SSD / YOLO V3 两版本实现

    本篇文章主要对比赛流程中的各个环节进行展开说明,并对笔者践行过的代码及更改的地方进行记录.如哪里有侵权请联系笔者进行删除.另外在这里对比赛举办方表示感谢 ~ ~ 其中开源代码会在整理后放在github ...

  5. 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想

    前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...

  6. linux mint 无法联网_linux mint踩坑记

    linux mint踩坑记 linux 简介 1.linux mint 是基于debian的一个发行版,以友好的界面素称,开始菜单很像windows,风格以清新为主! 2.linux mint 分为两 ...

  7. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  8. 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题

    ❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...

  9. Spring @Transactional踩坑记

    @Transactional踩坑记 总述 ​ Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...

最新文章

  1. Pytorch两种模型保存方式
  2. iOS 地图定位 定位
  3. leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
  4. mini2440:最简单的嵌入式linux驱动程序模块,mini2440:最简单的嵌入式Linux驱动程序模块 解决找不到mini2440……sample...
  5. 1-2:网络初识之了解OSI和TCP/IP及网络分层(物理层,数据链路层,网路层,传输层,应用层)
  6. Netty工作笔记0029---NIO 网络编程应用--群聊系统4--客户端编写2
  7. 如何创建隐藏用户帐号
  8. 关于类型的存储时间和链接
  9. php服务器启动错误,服务器意外重启之后PHP-FPM不能启动
  10. 图片右侧加文字html完整代码,怎么用css在图片右下方添加文字
  11. pop3邮箱怎么设置收发服务器端口,pop3设置(如何设置邮箱服务器?IMAP、POP3有何区别?)...
  12. 苹果Mac安装win10双系统
  13. 微信小程序一个按钮同时获取用户信息和手机号码
  14. MCNP5 粒子输运 常见问题汇总与踩坑记录(导火索:死循环)
  15. 浅谈getaddrinfo
  16. 『深度学习项目四』基于ResNet101人脸特征点检测
  17. 大型网站技术架构 读书笔记3 架构师
  18. 陕西师范大学计算机科学学院保研院校,陕西师范大学计算机科学学院(专业学位)计算机技术保研细则...
  19. git fatal: branch ‘master‘ does not exist
  20. 形态学在图像处理中的应用

热门文章

  1. LuckyDraw bot有幸被提名为微软2019的People's Choice app
  2. 如何将世界时钟和时区小部件添加到您的iPhone
  3. Zoom Host可以真正看到您的所有私人消息吗?
  4. api游戏编程鼠标选择拖动_如何选择合适的游戏鼠标
  5. 免费的数字图书馆_不仅是书籍:您当地图书馆可能提供的所有免费数字资料
  6. GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
  7. 201521123070 《JAVA程序设计》第13周学习总结
  8. 机器学习-tensorflow
  9. Bitcoin比特币与BlockChain区块链技术
  10. HTML meta refresh 刷新与跳转(重定向)页面