教你创建一个带诊断工具的.NET镜像

目录
  • 现阶段的问题
  • 解决方案
  • 常用的工具
  • 总结

现阶段的问题

现在是云原生和容器化时代,.NET Core对于云原生来说有非常好的兼容和亲和性,dotnet社区以及微软为.NET Core提供了非常方便的镜像容器化方案。所以现在大多数的dotnet程序都是部署在各种容器化环境中,比如我们常见的Docker。

微软官方为.NET提供的许多Docker镜像,让我们可以很方便的创建容器化的.NET应用。如下所示就是部分官方提供的不同操作系统的镜像。

其它更详细的内容大家可以点击后面的网址查看:https://hub.docker.com/_/microsoft-dotnet-runtime/

使用VS新建一个项目,微软官方给出的多段构建Dockerfile如下所示:

# 使用aspnet runtime镜像作为基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
WORKDIR /app
EXPOSE 80

# 使用sdk镜像进行编译
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

# 使用build镜像发布
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

# 拷贝编译结果到base镜像,完成镜像打包
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

现在看起来一切都很美好,但是假设我们遇到某一些线上CPU 100%、内存占用率很高或者程序突然停止响应等问题我们需要使用dotnet-tracedotnet-dump等工具时就会发现使用不了。

而且在没有安装.NET SDK的情况下,我们也无法安装dotnet tool。

解决方案

1.直接使用命令安装dotnet sdk,然后再安装dotnet tool,微软在官网给出的非常方便的安装方案,但是这不是我们想要的,毕竟每次还得下载多麻烦。

2.构建最终镜像使用sdk镜像,这样的话我们就可以直接安装好这些工具,这也不是我们想要的,因为sdk镜像太大了,不利于我们分发和下载(自建机房的钞能力除外)。

3.就是我们今天提到的方案,我们可以利用Docker多段构建,使用sdk镜像安装好dotnet tool以后,直接COPY到我们runtime的镜像,然后在runtime的镜像中使用。

# 使用aspnet runtime镜像作为基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
WORKDIR /app
EXPOSE 80

# 使用sdk镜像进行编译
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build
# !!! 在build镜像安装dotnet tools
RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace

# 使用build镜像发布
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

# 拷贝编译结果到base镜像,完成镜像打包
FROM base AS final
WORKDIR /app

# !!! 从build镜像中把dotnet工具COPY出来 并设置为PATH
COPY --from=build /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="$PATH:/root/.dotnet/tools"

COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

其中关键就是这两步,在build中使用dotnet tool来安装好所需要的工具,然后复制到runtime镜像中。

...
# !!! 在build镜像安装dotnet tools
RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace
...
# !!! 从build镜像中把dotnet工具COPY出来 并设置为PATH
COPY --from=build /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="$PATH:/root/.dotnet/tools"

当然我们可以打包一个包含好工具的runtime,供后面使用,就不用每次都安装tool了。我个人比较喜欢使用Ubuntu作为基础镜像,大家也可以用Alpine之类的基础镜像来进一步缩小体积。

# 使用sdk镜像进行编译
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build

# !!! 在build镜像安装dotnet tools
RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace

# 使用aspnet runtime镜像作为基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS base
WORKDIR /app

# !!! 从build镜像中把dotnet工具COPY出来 并设置为PATH
COPY --from=build /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="$PATH:/root/.dotnet/tools"

最终镜像也很小,当然我们可以使用单文件发布和Native AOT让镜像它变得更小,那就是后话了,不在本文中介绍。

常用的工具

因为公司是自建机房,所以对于存储和网络带宽都比较宽裕,我们一般会在生产环境运行的镜像中安装下面这些工具。

RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace \
    && dotnet tool install -g dotnet-counters \
    && dotnet tool install -g dotnet-sos \
    && dotnet tool install -g dotnet-gcdump \
    && dotnet tool install -g dotnet-monitor \
    && dotnet tool install -g dotnet-symbol \
    && dotnet tool install -g JetBrains.dotTrace.GlobalTools

在遇到线上问题的时候,排查起来非常方便,对于一些内存泄漏和CPU满的问题,配合dotTrace很容易就能定位到问题所在。

总结

本文编写的初衷是因为在群里有很多小伙伴遇到生产环境性能问题的时候,.NET的runtime镜像中没有带一些工具,安装和使用起来很麻烦,所以分享一些我们公司内部一些技巧,希望能帮到大家。

到此这篇关于如何创建一个带诊断工具的.NET镜像的文章就介绍到这了,更多相关.NET镜像带诊断工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NETCore Docker实现容器化与私有镜像仓库管理

    一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖.相较于虚拟机而言,Docker共享的是宿主机的硬件资源,使用容器来提供独立的运行环境来运行应用.虚拟机则是基于Supervisor(虚拟机管理程序)使用虚拟化技术来提供隔离的虚拟机,在虚拟机的操作系统上提供运行环境!虽然两者都提供了很好的资源隔离,但很明显Docker的虚拟化开销更低! Docker涉及了三个核心

  • .NET微服务架构CI/CD镜像自动分发

    如何通过Jenkins完成镜像分发?基本做法是:打包镜像→上传镜像到仓库→脚本分发.镜像仓库也有很多,比如docker hub.Harbor等,今天这一篇讲一下基于阿里云镜像仓库的操作. 首先,准备一个阿里云镜像仓库,个人版是免费的. 然后下载这个插件: Publish Over SSH 这个插件主要用来远程登录服务器并执行脚本. 插件安装完毕后,系统设置会多出这一项,戳图里这个按钮: 然后,把服务器的ip.账户.密码填进去: 配置好以后,最好点测试按钮试一下,如果没问题会输出“Success”

  • .NET微服务架构CI/CD自动打包镜像

    目录 准备工作 一.开启docker的tcp 二.Jenkins安装Docker插件 配置Docker 配置工作流 小结 准备工作 一.开启docker的tcp 我的服务器是linux,以端口2376为例,找到docker.service,在ExecStart下新增这段代码即可: -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock 效果图: 然后重载服务列表,重启docker,语句: systemctl daemon-reload syste

  • 教你创建一个带诊断工具的.NET镜像

    目录 现阶段的问题 解决方案 常用的工具 总结 现阶段的问题 现在是云原生和容器化时代,.NET Core对于云原生来说有非常好的兼容和亲和性,dotnet社区以及微软为.NET Core提供了非常方便的镜像容器化方案.所以现在大多数的dotnet程序都是部署在各种容器化环境中,比如我们常见的Docker. 微软官方为.NET提供的许多Docker镜像,让我们可以很方便的创建容器化的.NET应用.如下所示就是部分官方提供的不同操作系统的镜像. 其它更详细的内容大家可以点击后面的网址查看:http

  • jquery动画3.创建一个带遮罩效果的图片走廊

    复制代码 代码如下: #frame { position: relative; width: 700px; height: 400px; overflow: hidden; z-index: 0; } #frame img { width: 700px; height: 400px; position: absolute; top: 0; left: 0; z-index: 1; } #frame img.visible { z-index: 2; } #frame a { display: b

  • 使用命令行工具npm新创建一个vue项目的方法

    Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程. 只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于生产环境的构建配置的项目: # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project $ vue init webpack test //输入命令 ? Project

  • 教你如何用Eclipse创建一个Maven项目

    一.Maven的安装与设置环境变量 想要创建一个Maven项目需要先安装Maven,并且设置好环境变量 1.去下载Maven 2.设置环境变量 新建变量MAVEN_HOME,值为Maven的目录X:\XXX\apache-maven-XXX 将%MAVEN_HOME%\bin添加到Path变量下 3.运行CMD,输入mvn -v后可以看到Maven的版本信息等则表示安装成功 二.创建Maven项目和依赖 2.1 创建Maven项目的两种方式 第一种创建方式:使用命令行手动创建 mvn arche

  • 教你用Java Swing做一个定时提醒工具

    前言 因为上下班的时候,老是忘记打卡(其实这不是重点,因为可以补卡嘛),重点是下班走的时候总是忘记关空调(谁最后走忘记关空调,罚100...) 我一开始的做法是,在主机上贴个便签,写上关空调三个大字,坐在电脑旁,只要你眼睛稍微一瞥,就是看到.可是依旧是该忘还得忘,那么明显一个便签贴在那,走的时候死活看不到,我有什么办法! 然后我就想做个弹窗提醒,一到下班的点,就弹窗提醒,然后就关空调,下班就关,总不会忘了吧.刚好那两天因为项目需要,我写了个vbs脚本,用vbs启动jar和exe程序这些.就想用v

  • 基于Python3制作一个带GUI界面的小说爬虫工具

    目录 效果图 开发完成后的界面 采集过程界面 采集后存储 主要功能 用到的第三方模块 打包为 exe 命令 全部源码 效果图 最近帮朋友写个简单爬虫,顺便整理了下,搞成了一个带GUI界面的小说爬虫工具,用来从笔趣阁爬取小说. 开发完成后的界面 采集过程界面 采集后存储 主要功能 1.多线程采集,一个线程采集一本小说 2.支持使用代理,尤其是多线程采集时,不使用代理可能封ip 3.实时输出采集结果 使用 threading.BoundedSemaphore() pool_sema.acquire(

  • 手把手教你利用Python创建一个游戏窗口

    目录 前言 安装Pyagme 检查是否安装Pygame:  一 (检查python是否配置环境变量) 检查是否安装Pygame:  二 (检查pygame是否安装) 未安装Pygame : 一 (检查是否安装pip) 未安装Pygame : 二 (利用pip安装Pygame) 步入正题: 利用Pygame制作一个简单的游戏窗口 总结: 前言 想要利用Python创建一个游戏窗口就需要用到一个强大的第三方功能库: Pygame 那么既然需要用到Pygame这个第三方库 所以在写程序之前需要做一个准

  • 亲手教你怎样创建一个简单的mysql数据库

    目录 一.创建数据库 二.创建数据库 什么是数据库?数据库是存放数据的“仓库”,维基百科对此形象地描述为“电子化文件柜”. 什么是数据库管理系统?数据库管理系统是操纵和管理数据库的软件.我现在学习的数据库管理系统是Mysql,它属于关系型数据库管理系统,目前被普遍使用.关系型数据库是由相互联结的二维表格组成的数据库. 学习java到数据库操作章节后发现没有数据库,折腾了1天总算弄好了学习所需要的数据库,感觉好开心. 一.创建数据库 注:已经安装好mysql. windows下运行cmd进入命令窗

  • 一步步教你用Vue.js创建一个组件(附代码示例)

    目录 前言 到底什么是组件? 为什么你一定要使用组件 在Vue中创建一个组件 模板部分 脚本部分 选项API:旧的方式 合成API:现在和未来 风格部分 总结 前言 Vue.js是一个渐进式框架,旨在以一种非常简单.直接的方式构建用户界面.它被设计成易于使用,并且足够灵活,可以处理各种各样的应用. 在本教程中,我们将向你展示如何用Vue.js创建一个简单的组件.我们还将介绍一些在使用组件时需要知道的基本概念. 我们将介绍在Vue中创建一个组件的基本语法,以及一些关于组件用途的理论.在这篇文章的最

  • IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码详细流程

    推荐教程 idea2021以下最新安装j ihuo 教程 https://www.jb51.net/article/184631.htm https://www.jb51.net/article/178193.htm 正文 IDEA,我使用的是最新版本(2021.1.1) JDK1.8 tomcat-8 详细步骤,用图片代替,关键地方,字幕解释. 到此步骤,是关键重点,请认真看 鼠标右键选择项目(soap-demo)然后请看图片 当改完之后,项目结构,会发生改变 创建-服务端-生成代码 1.请提

随机推荐