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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 上一篇我们自己通过编写Dockerfile来编译部署一个ASP.NET MVC应用程序到阿里云ECS中的Windows Container,这一篇我们来试着将.NET 4.x的镜像推送到Harbor私有镜像仓库 和 阿里云容器镜像仓库。

上一篇我们自己通过编写Dockerfile来编译部署一个ASP.NET MVC应用程序到Windows Container,这一篇我们来试着将.NET 4.x的镜像推送到harbor私有镜像仓库。

1 准备工作

假设有两台服务器,这里我使用的是阿里云ECS:

Node1:Windows Server 2019 with Container,Docker Client

Node2:CentOS 7.5,Harbor

其中,Node1作为客户端,主要用来推送镜像到harbor镜像仓库 和 从harbor拉取镜像运行容器实例。Node2作为服务端,主要用来运行harbor镜像仓库对企业内部提供容器镜像服务。

2 搭建Harbor镜像仓库

Why Harbor?

因为Harbor是目前最流行的企业级私有容器镜像仓库之一,而且它同时支持Linux Container 和 Windows Container 的镜像,使得它比较符合我的需求。

快速搭建过程

我们在Node2(CentOS)上来快速地基于Harbor搭建一个私有镜像仓库。

step1.安装docker compose

# curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose -version

step2.下载并解压harbor离线安装包

# wget https://github.com/vmware/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
# tar xvf harbor-offline-installer-v1.10.1.tgz

step3.修改harbor.yml配置,主要修改hostname 和 admin初始密码,注释掉https的配置(生产环境建议开启https,这里只做快速演示)。

hostname: 47.108.111.236
# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80
# https related config
# https:
  # https port for harbor, default is 443
  # port: 443
  # The path of cert and key files for nginx
  # certificate: /your/certificate/path
  # private_key: /your/private/key/path
# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433
# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: EDC@123456

step4.安装harbor

# ./install.sh

安装完成后,确认没有问题,通过浏览器访问查看harbor管理界面。

使用账号 admin 和你配置的初始密码 即可进入管理面板,这里我们来创建一个项目,这里我们暂且命名为dotnet:

后面的示例,我们就在客户端推送镜像到这个dotnet项目中。

3 推送镜像到Harbor镜像仓库

在Node1,首先,配置一下hosts映射,这里配置了一个Node2的内网地址:

172.10.10.100 reg.edisonzhou.cn

然后,修改一下docker的配置文件,将 reg.edisonzhou.cn 作为可以使用http访问的仓库:

配置文件:C:\ProgramData\docker\config\daemon.json

{ 
    "insecure-registries" : [ "reg.edisonzhou.cn" ] 
}

然后,就是熟悉的push镜像过程了,还是原来的味道:

> docker login reg.edisonzhou.cn
> docker tag reg.edisonzhou.cn/samples:aspnetmvcapp reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp
> docker push reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp

The push refers to repository [reg.edisonzhou.cn/dotnet/samples]
11d8e5abf6ac: Pushed
265452af5f33: Pushed
f9fe54bc871d: Pushed
ddaa4e132ef2: Pushed
0fd048ba07e9: Pushed
df61cb75b354: Pushed
825bd5d0379d: Pushed
0037a968c4d7: Pushed
6420f996a252: Skipped foreign layer
a7ba3db29ebb: Skipped foreign layer
4.8: digest: sha256:7da03aef9a9acb66678d5c14dda85c741268557bdcd55484e6351e373445157f size: 2779

最开始我以为.net 4.x的镜像动不动就7~8个G,即使是内网推送也可能很慢,但是没想到的是在阿里云ECS的内网推送,如此大的镜像也能很快的完成。

此外,建议先将.net 4.x sdk的基础镜像先推送到harbor,后续推送应用程序的镜像会共享基础镜像层的文件,因此速度也会加快很多。

当然,第一次push的过程还是需要耐心等待一下,速度取决于你的服务器的配置和网络环境(如是否内网、带宽等因素)如果出现以下错误:

received unexpected HTTP status: 500 Internal Server Error

你可以对harbor镜像仓库所在的linux服务器关闭SELinux:

setenforce 0

push完成之后再看看harbor中的仓库项目列表:

*.后面我又陆续push了sdk 和 runtime的镜像。

4 拉取Harbor镜像并运行

有了私有镜像仓库,又push了镜像,我们来模拟一下在Node1(Windows Server 2019)中拉取私有仓库中的镜像来运行一下:

>docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 --cpus 1 -m 1024m reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp

成功运行后,通过浏览器访问验证一下:

可以看到,成功运行,完美!

对于如此巨大的容器镜像,我跑了两到三个相同的asp.net mvc sample容器实例,验证发现磁盘空间会每个实例多占用0.2G左右,内存会每个多占用200M左右。当然,这也是因为这个asp.net mvc sample实在太简单,没有任何依赖交互,但是它也侧面反映,看似庞大的asp.net容器镜像,实则不会随着容器实例的增多而重复占用空间,而是共享Windows内核。

5 关于阿里云镜像仓库

阿里云容器镜像服务(简称 ACR)是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。ACR 支持全球同步加速、大规模/大镜像分发加速、多代码源构建加速等全链路提效,与容器服务 ACK 无缝集成,帮助企业降低交付复杂度,打造云原生应用一站式解决方案。

阿里云容器镜像服务有两种类型:

(1)容器镜像服务ACR个人版

容器镜像服务ACR个人版面向个人开发者,提供基础的容器镜像服务,包括应用镜像托管能力、镜像安全扫描功能、稳定的国内外镜像构建服务以及便捷的镜像授权功能,方便用户进行镜像全生命周期管理。

(2)容器镜像服务ACR企业版

容器镜像服务ACR企业版面向企业客户,是企业级云原生应用制品管理平台,提供容器镜像、Helm Chart,符合OCI规范制品的生命周期管理;支持大规模、多地域、多场景下应用制品的高效分发;与容器服务ACK无缝集成,帮助企业降低交付复杂度。

其中,个人版是免费使用的,但命名空间有限额3个,不过对于我们学习调研完全够用了。因此,本篇主要使用个人版实例来进行实验。

个人版具体的功能如下:

  • 多架构镜像托管支持

    支持Linux、Windows、ARM等多架构容器镜像

  • 灵活的地域选择
  • 您可以根据自己的业务需求,选择不同的地域创建和删除镜像仓库。
  • 每个镜像仓库都提供了公网、内网、VPC网络下对应的网络地址。* 镜像安全扫描

可以看到,阿里云容器镜像仓库也同时支持Linux 和 Windows多平台的容器镜像,完美符合我们的需求。

6 配置阿里云镜像仓库

创建命名空间

我们可以先创建几个命名空间,用于区分不同环境的镜像。

创建镜像仓库

我们在指定命名空间下创建几个镜像仓库,后面我们在 Windows Server 端推送镜像到这几个镜像仓库中。

后面的示例,我们就在客户端推送镜像到 dotnet-sdk、dotnet-runtime 以及 dotnet-samples 三个项目中。

7 推送镜像到阿里云镜像仓库

公网环境下

(1)登录阿里云docker registry:

$ docker login --username=**********@***.com registry.cn-chengdu.aliyuncs.com

这里 registry.cn-chengdu.aliyuncs.com 就是阿里云容器镜像服务的公网地址。
(2)将.NET镜像推送到阿里云docker registry:

$ docker tag reg.edisonzhou.cn/dotnet/sdk:framework-4.8 registry.cn-chengdu.aliyuncs.com/edisonzhou-dev/dotnet-sdk:framework-4.8
$ docker push registry.cn-chengdu.aliyuncs.com/edisonzhou-dev/dotnet-sdk:framework-4.8

容器镜像的推送速度取决于网络环境(如带宽)

推送后镜像仓库效果:

(3)在Windows Server从阿里云docker registry拉取镜像:

$ docker pull registry.cn-chengdu.aliyuncs.com/edisonzhou-dev/dotnet-sdk:framework-4.8

内网环境下

如果使用阿里云ECS,可以直接选择阿里云镜像仓库的内网地址,可以大幅度提高传输效率并减少公网流量开销。如果你的阿里云ECS是VPC专有网络,你可以参考下面的shell:

$ docker login --username=********@***.com registry-vpc.cn-chengdu.aliyuncs.com
$ docker push registry-vpc.cn-chengdu.aliyuncs.com/edisonzhou-dev/dotnet-sdk:framework-4.8

如果ECS是经典网络,你可以参考下面的shell:

$ docker login --username=********@***.com registry-internal.cn-chengdu.aliyuncs.com
$ docker push registry-vpc.cn-chengdu.aliyuncs.com/edisonzhou-dev/dotnet-sdk:framework-4.8

推送成功后,测试验证一下:

$ docker run --name aspnet_mvc_sample_1 --rm -it -d -p 8000:80 --cpus 1 -m 1024m registry-vpc.cn-chengdu.aliyuncs.com/edisonzhou-dev/dotnet-samples:framework-4.8-aspnetmvcapp

访问URL效果:

8 总结

本文介绍了如何快速搭建一个harbor私有镜像仓库,并通过在Windows Server客户端推送ASP.NET应用程序的镜像到harbor 和 阿里云镜像仓库,最后在Windows Server客户端拉取Windows Container镜像并成功运行。

事实证明,对于传统.NET Framework 4.x应用程序,从物理机/虚拟机迁移到容器中运行是可行的,并且Windows Server 2019版本做了许多对容器的支持做了许多优化,大家可以尝试使用。

对于传统.NET 4.x应用的容器化迁移,我们也还在探索,相信探索和实践的深入,我会分享更多相关的内容。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
运维 Kubernetes Java
阿里云容器计算服务ACS ,更普惠易用、更柔性、更弹性的容器算力
ACS是阿里云容器服务团队推出的一款面向Serverless场景的子产品,基于K8s界面提供符合容器规范的CPU及GPU算力资源。ACS采用Serverless形态,用户无需关注底层节点及集群运维,按需申请使用,秒级按量付费。该服务旨在打造更普惠易用、更柔性、更弹性的新一代容器算力,简化企业上云门槛,加速业务创新。ACS支持多种业务场景,提供通用型、性能型及BestEffort算力质量,帮助客户更从容应对流量变化,降低综合成本。
|
3天前
|
人工智能 JSON Linux
利用阿里云GPU加速服务器实现pdf转换为markdown格式
随着AI模型的发展,GPU需求日益增长,尤其是个人学习和研究。直接购置硬件成本高且更新快,建议选择阿里云等提供的GPU加速型服务器。
利用阿里云GPU加速服务器实现pdf转换为markdown格式
|
2天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
17天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
3天前
|
开发框架 缓存 .NET
阿里云轻量应用服务器、经济型e、通用算力型u1实例怎么选?区别及选择参考
在阿里云目前的活动中,价格比较优惠的云服务器有轻量应用服务器2核2G3M带宽68元1年,经济型e实例2核2G3M带宽99元1年,通用算力型u1实例2核4G5M带宽199元1年,这几个云服务器是用户关注度最高的。有的新手用户由于是初次使用阿里云服务器,对于轻量应用服务器、经济型e、通用算力型u1实例的相关性能并不是很清楚,本文为大家做个简单的介绍和对比,以供参考。
|
11天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS的区别及选择指南
轻量应用服务器和云服务器ECS(Elastic Compute Service)是两款颇受欢迎的产品。本文将对这两者进行详细的对比,帮助用户更好地理解它们之间的区别,并根据自身需求做出明智的选择。
|
17天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
12天前
|
SQL 弹性计算 安全
阿里云上云优选与飞天加速计划活动区别及购买云服务器后续必做功课参考
对于很多用户来说,购买云服务器通常都是通过阿里云当下的各种活动来购买,这就有必要了解这些活动的区别,同时由于活动内的云服务器购买之后还需要单独购买并挂载数据盘,还需要设置远程密码以及安全组等操作之后才能正常使用云服务器。本文就为大家介绍一下目前比较热门的上云优选与飞天加速计划两个活动的区别,以及通过活动来购买云服务器之后的一些必做功课,确保云服务器可以正常使用,以供参考。
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
42 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
17天前
|
人工智能 Kubernetes Cloud Native
阿里云容器服务,智算时代云原生操作系统
2024云栖大会,阿里巴巴研究员易立分享了阿里云容器服务的最新进展。容器技术已成为云原生操作系统的基石,支持多样化的应用场景,如自动驾驶、AI训练等。阿里云容器服务覆盖公共云、边缘云、IDC,提供统一的基础设施,助力客户实现数字化转型和技术创新。今年,阿里云在弹性计算、网络优化、存储解决方案等方面进行了多项重要升级,进一步提升了性能和可靠性。