大家好,我是等天黑。

.NET 又双叒叕出新功能了, 就在前几天,.NET 团队发布博客,宣称在 .NET SDK 中内置了对 .NET 应用容器化的支持。

小试牛刀

在正式介绍它之前,先通过一个简单的例子,看下它是如何使用的。

# 创建一个新项目, 然后进入到文件夹
dotnet new mvc -n my-awesome-container-app
cd my-awesome-container-app # 添加下面的程序包
#(目前需要手动引入, 后续会直接集成到 .NET SDK)
dotnet add package Microsoft.NET.Build.Containers # 发布项目
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer # 在容器中运行应用
docker run -it --rm -p 5010:80 my-awesome-container-app:1.0.0

然后访问 http://localhost:5010, 就已经可以看到这个测试的 .NET MVC 应用了。

注意,这里需要安装 .NET 7 preview 7 或以上版本,并且本机安装并运行了 Docker。

容器化 .NET 应用是不是变得更加简单方便了。

内置容器化支持

可能你已经有了疑问, 这是什么魔法?我们熟悉的 Dockerfile 去哪了? 基础镜像是怎么定义的?镜像标签是什么?

是的,之前我们更熟悉使用 Dockerfile 的形式构建镜像。而现在,可以在 .NET 项目中,配置 MSBuild 属性来做同样的事情,指定基础镜像,标签等等。

要对 .NET 应用进行容器化,只需要在 project.csproj 中配置属性即可,如下

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>my_awesome_container_app</RootNamespace>
</PropertyGroup> <PropertyGroup>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PublishProfile>DefaultContainer</PublishProfile>
<ContainerImageName>my-super-awesome-app</ContainerImageName>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Build.Containers" Version="0.1.8" />
</ItemGroup> </Project>

下面是一些常见的自定义参数介绍

基础镜像

<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:6.0</ContainerBaseImage>

镜像库

默认情况下,会推送到本地的 Docker Daemon,当然也支持推送到远程的镜像库。

<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>

镜像标签

标签可以给应用生成不同的版本,默认情况是读取项目的 Version 属性,你也可以指定 ContainerImageTag 属性,如下

<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>

多个标签用分号隔开

<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>

目前来说,项目还是在初期阶段,不过已经看到了 .NET 团队在这方面的努力,对于其他的一些容器化功能,相信会很快在未来的版本中添加。

更多详细的内容,可以参考下面的文档:

https://github.com/dotnet/sdk-container-builds/blob/main/docs/ContainerCustomization.md

总结

上面的容器化功能,主要是由 sdk-container-builds 这个库实现的。工作原理并不复杂,代码也不多,里面使用到了 .NET 7 新的 Tar API 处理文件,并构建了标准的 OCI 镜像文件,然后通过 Docker Registry HTTP APIDocker Registry 进行交互以及上传镜像。

希望本文对您有用 !

Reference

https://github.com/dotnet/sdk-container-builds

https://docs.docker.com/registry/spec/api/

https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk

.NET 7 SDK 对容器的内置支持的更多相关文章

  1. Spring MVC内置支持的4种内容协商方式【享学Spring MVC】

    每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...

  2. php 内置支持的标签和属性

    内置支持的标签和属性列表如下: 标签名 作用 包含属性 include 包含外部模板文件(闭合) file import 导入资源文件(闭合 包括js css load别名) file,href,ty ...

  3. 迭代器模式的一种应用场景以及C#对于迭代器的内置支持

    迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...

  4. thinkphp中ajax使用实例(thinkphp内置支持ajax)

    thinkphp中ajax使用实例(thinkphp内置支持ajax) 一.总结 1.thinkphp应该是内置支持ajax的,所以请求类型里面才会有是否是ajax // 是否为 Ajax 请求 if ...

  5. 重磅!K8S 1.18版本将内置支持SideCar容器。

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  6. Apache Spark 3.0 将内置支持 GPU 调度

    如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...

  7. Spring Boot 定制与优化内置的Tomcat容器

    1.Spring Boot定制与优化内置Tomcat容器. > 内置的容器有三个分别是Undertow.Jetty.Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口 ...

  8. python__007内置函数

    本文摘自:https://docs.python.org/3/library/functions.html?highlight=built#ascii     内置功能     abs() delat ...

  9. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

随机推荐

  1. SpringBoot2.x整合Prometheus+Grafana【附源码+视频】

    图文并茂,新手入门教程,建议收藏 SpringBoot2.x整合Prometheus+Grafana[附源码+视频] 附源码+视频 目录 工程简介 简介 Prometheus grafana Spri ...

  2. AsList()方法详解

    AsList()方法详解 在Java中,我们应该如何将一个数组array转换为一个List列表并赋初始值?首先想到的肯定是利用List自带的add()方法,先new一个List对象,再使用add()方 ...

  3. 基于MybatisPlus代码生成器(2.0新版本)

    一.模块简介 1.功能亮点 实时读取库表结构元数据信息,比如表名.字段名.字段类型.注释等,选中修改后的表,点击一键生成,代码成即可提现出表结构的变化. 单表快速转化restful风格的API接口并对 ...

  4. Kubebuilder简介与架构

    什么是Kubebuilder Kubebuilder是一个用Go原因构建Kubernetes APIs的框架,通过使用KubeBuilder,用户可以遵循一套简单的编程框架,使用CRD构建API.Co ...

  5. fiddle如何使用代理

    前言 Fiddle作为抓包工具深受程序员的喜爱,可能在代理方面有些会感觉到迷惑的,可以通过本文的学习来掌握一些基本的知识. Fiddle介绍 Fiddler是位于客户端和服务器端的HTTP代理,也是目 ...

  6. 『现学现忘』Docker基础 — 42、补充:save和load命令说明

    目录 1.save命令 2.load命令 1.save命令 将指定的一个或多个镜像保存成.tar格式的文件,进行打包归档. 查看docker save帮助命令,如下: [root@192 ~]# do ...

  7. 入门Python数据分析最好的实战项目(一)分析篇

    数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seaborn,以及机器学习包sklearn. python学习交流群:660193417### import ...

  8. 论HashMap、Hashtable、TreeMap、LinkedHashMap的内部排序

    参考文章 论HashMap.Hashtable.TreeMap.LinkedHashMap的内部排序

  9. docker-compose: 未找到命令,安装docker-compose

    1.安装扩展源 sudo yum -y install epel-release 2.安装python-pip模块 sudo yum install python-pip 3.通过命令进行安装 cd ...

  10. SpringMVC指定配置文件位置和名称,控制Servlet的加载时间

    1. 2.