借助阿里云ECS实现传统.NET应用容器化(上)

简介: 我们都知道.NET Core应用可以跑在Docker上,那.NET Framework 4.x应用呢?借助阿里云ECS主机(Windows Server 2019 with Container版本),一切变得So Easy!

我们都知道.NET Core应用可以跑在Docker上,那.NET Framework 4.x应用呢?借助阿里云ECS主机(Windows Server 2019 with Container版本),一切变得So Easy!

1 关于Windows Container

自从Windows Server 2016版开始,原生Docker就得到了支持,在这之前,想要在Windows系统上运行Docker(包括Windows 10),都得先装一个Hyber-V的虚拟机,然后在虚拟机上跑Docker,完全无法发挥Docker在进程隔离级别的优势。

下图展示了两种模式的区别:

可以确定的是,无论是哪种运行模式,我们都可以使用标准的Docker命令行进行操作,同时容器镜像的格式也和Linux容器镜像保持一致。

画外音:这就意味着Windows Container可以通过docker hub或私有镜像仓库如Harbor进行分发,我们之前在Linux容器上的经验积累也可以平滑迁移到Windows容器上。

但是,Windows Container受限于Windows内核属性,只能跑Windows应用程序,比如和Windows内核强耦合的.NET Framework应用程序。这一点,也是携程等.NET应用大户选择Windows Container的原因。而携程曾经的问题,也正是目前我司所遇到的痛点,即在.NET与Java双技术栈并存的前提下,如何统一运行环境和打包部署机制,成为了一大难题。在.NET 4.x(广大核心业务系统)、.NET 5(部分新兴服务) 与 Java (电商业务)应用共存的异构技术栈背景下,.NET 4.x又无法同时快速升级到.NET 5的历史包袱前提下,统一运行环境 和 编排流程 对于整个技术团队来说是很有必要的,而容器化带来的红利也应该要让.NET Framework 4.x 应用程序享受到

2 关于阿里云ECS与ACK

在现今企业服务器OS市场,Windows依然占据半壁江山,其市场份额达60%之多,把Windows应用搬站上云不仅仅是基础设施的迁移,更重要的是通过Kubernetes等云原生技术让传统的Windows应用架构体系升级,充分利用云上的弹性、敏捷等能力,实现业务应用的快速迭代和交付。

阿里云ECS主机率先提供了 Windows Server 2019 with Container 与 Windows Server Version 1909 with Container 两个OS镜像,满足了.NET应用程序跑在Windows Container上的需求。Windows Version 1909镜像是指运行在服务器核心模式下不含UI版本的系统,Version 1909不含UI没有图形界面,占用服务器资源少。而Windows Server 2019 with Container镜像版本,是指Windows镜像是在原有的镜像基础上增加了Docker容器运行环境,如果在使用过程中需要Docker容器运行环境则可以选择with Container版本镜像。

更令人兴奋的是,阿里云容器服务已正式发布Windows Container支持,用户可通过控制台或Open API创建Windows Kubernetes集群并部署Windows容器。

阿里云容器服务ACK通过Windows容器的支持,帮助企业轻松实现Windows容器应用的部署,其兼容kubernetes标准,支持cpu/memory资源编排,支持deployment/statefulset/job/cronjob等应用部署模型。同时用户可以添加Linux节点,实现Linux/Windows应用混合部署的统一管理

想要进行Windows Server Node + Linux Node混合管理的童鞋,可以考虑一下阿里云ACK服务。

3 快速开始

本篇会主要介绍在借助阿里云ECS(Windows Server 2019 with Container镜像版本)来实现.NET 4.8应用的容器化初步运行。

第一步,选择阿里云ECS主机,在OS镜像区域选择Windows Server 2019 with Container镜像。

第二步,远程登录阿里云ECS主机,查看docker版本与信息。由于该镜像版本已经设置好了Docker运行环境,因此无需再手动安装(如果是Windows Server 2019镜像版本的话则需要手动安装)。

> docker version
Client: Mirantis Container Runtime
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        105e9a6
 Built:             05/17/2021 16:36:02
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Mirantis Container Runtime
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.24)
  Go version:       go1.13.15
  Git commit:       1a7d997053
  Built:            05/17/2021 16:34:40
  OS/Arch:          windows/amd64
  Experimental:     false

此外,阿里云已经提前设置好了镜像加速,因此也无需手动配置daemon.json设置镜像加速源。

> docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker Application (Docker Inc., v0.8.0)
  cluster: Manage Mirantis Container Cloud clusters (Mirantis Inc., v1.9.0)
  registry: Manage Docker registries (Docker Inc., 0.1.0)

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 4
 Server Version: 20.10.5
 Storage Driver: windowsfilter
  Windows:
 Logging Driver: json-file
 Plugins:
  Volume: local
  Network: ics internal l2bridge l2tunnel nat null overlay private transparent
  Log: awslogs etwlogs fluentd gcplogs gelf json-file local logentries splunk syslog
 Swarm: inactive
 Default Isolation: process
 Kernel Version: 10.0 17763 (17763.1.amd64fre.rs5_release.180914-1434)
 Operating System: Windows Server 2019 Datacenter Version 1809 (OS Build 17763.1999)
 OSType: windows
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.92GiB
 Name: yz-jc-poc-ecs
 ID: P7LP:34B5:PQHH:YVKG:ADDM:5KOQ:6ATZ:CWNW:M74Z:D7SM:WAZO:R66T
 Docker Root Dir: C:\ProgramData\docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

第三步,Run一个.net framework控制台示例容器:

docker run --rm mcr.microsoft.com/dotnet/framework/samples:dotnetapp

运行结果如下图所示:

我们也可以看到这个示例镜像的大小,WTF,真的不小!

> docker images
REPOSITORY                                   TAG         IMAGE ID       CREATED       SIZE
mcr.microsoft.com/dotnet/framework/samples   dotnetapp   52c54f01bc20   3 weeks ago   8.03GB

第四步,Run一个asp.net webform示例容器:

docker run --name aspnet_sample --rm -it -d -p 8000:80 mcr.microsoft.com/dotnet/framework/samples:aspnetapp

需要注意的是,这里映射到主机的端口是8000,需要在阿里云ECS控制台的安全组里为其开放入网规则。

在Windows Server 2019中,对容器支持localhost的访问(在2019之前,只能通过容器IP或本机IP地址访问),因此可以在ECS中直接通过浏览器访问:http://localhost:8000

这时,从外部浏览器访问公网IP地址:8000也可以访问到这个ASP.NET应用程序了。

如果你想了解容器的具体IP,你可以使用下面的这个命令:

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" aspnet_sample

 如果你想进入这个示例容器内部看看,你可以使用下面这个命令:

docker exec -it aspnet_sample powershell

进入这个容器的工作目录(这里是/inetpub/wwwroot),你会看到一堆ASP.NET WebForm的Release文件:

> docker exec -it aspnet_sample powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\inetpub\wwwroot> ls

    Directory: C:\inetpub\wwwroot

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         6/9/2021   9:35 AM                App_Start
d-----         6/9/2021   9:47 AM                bin
d-----         6/9/2021   9:35 AM                Content
d-----         6/9/2021   9:35 AM                fonts
d-----         6/9/2021   9:47 AM                obj
d-----         6/9/2021   9:35 AM                Properties
d-----         6/9/2021   9:35 AM                Scripts
......

你也可以在容器内部访问localhost(默认80端口)验证一下:

> iwr -useb http://localhost

StatusCode        : 200
StatusDescription : OK
Content           : ......
ParsedHtml        :
RawContentLength  : 5096

4 总结

本文介绍了Windows Container的基本概念、阿里云ECS与ACK对Windows Container的支持,然后介绍了如何在阿里云ECS(Windows Server 2019)上进行.NET 4.x应用的容器化部署运行。

下一篇,我们会自己通过编写Dockerfile的方式来部署一个ASP.NET MVC应用程序到Docker上来体验一下。

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
653 2
|
供应链 安全 Cloud Native
阿里云飞天企业版获【可信云·容器平台安全能力】先进级认证
阿里云飞天企业版容器系列产品获中国信息通信研究院【可信云·容器平台安全能力】先进级认证,这是飞天企业版容器产品获得《等保四级PaaS平台》和《 云原生安全配置基线规范V2.0》之后,本年度再一次获得行业权威认可,证明飞天企业版的容器解决方案具备符合行业标准的最高等级容器安全能力。
403 8
阿里云飞天企业版获【可信云·容器平台安全能力】先进级认证
|
运维 Kubernetes Java
阿里云容器计算服务ACS ,更普惠易用、更柔性、更弹性的容器算力
ACS是阿里云容器服务团队推出的一款面向Serverless场景的子产品,基于K8s界面提供符合容器规范的CPU及GPU算力资源。ACS采用Serverless形态,用户无需关注底层节点及集群运维,按需申请使用,秒级按量付费。该服务旨在打造更普惠易用、更柔性、更弹性的新一代容器算力,简化企业上云门槛,加速业务创新。ACS支持多种业务场景,提供通用型、性能型及BestEffort算力质量,帮助客户更从容应对流量变化,降低综合成本。
|
9月前
|
Ubuntu 安全 数据安全/隐私保护
在Docker容器中部署GitLab服务器的步骤(面向Ubuntu 16.04)
现在,你已经成功地在Docker上部署了GitLab。这就是我们在星际中的壮举,轻松如同土豆一样简单!星际旅行结束,靠岸,打开舱门,迎接全新的代码时代。Prepare to code, astronaut!
577 12
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
12月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
400 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
弹性计算 人工智能 资源调度
DeepSeek大解读系列公开课上新!阿里云专家主讲云上智能算力、Kubernetes容器服务、DeepSeek私有化部署
智猩猩「DeepSeek大解读」系列公开课第三期即将开讲,聚焦阿里云弹性计算助力大模型训练与部署。三位专家将分别讲解智能算力支撑、Kubernetes容器服务在AI场景的应用实践、以及DeepSeek一键部署和多渠道应用集成,分享云计算如何赋能大模型发展。欲观看直播,可关注【智猩猩GenAI视频号】预约。 (239字符)
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
人工智能 运维 Kubernetes
阿里云容器服务AI助手2.0 - 新一代容器智能运维能力
2024年11月,阿里云容器服务团队进一步深度融合现有运维可观测体系,在场景上覆盖了K8s用户的全生命周期,正式推出升级版AI助手2.0,旨在更好地为用户使用和运维K8S保驾护航。
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
655 23