Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

转发请注明此文章作者与路径,请尊重原著,违者必究。

 

 

系列文章:https://www.cnblogs.com/alunchen/p/10121379.html

本篇文章操作系统信息

      Linux:ubuntu 16.04.3 amd64

 

查看NetCore支持的Linux系统

      NetCore不是支持Linux的所有系统,只支持部分,所以在Linux上安装NetCore之前要查看系统与版本是否支持NetCore。

      查看NetCore2.0以上各个版本在Linux支持的系统及版本:

https://github.com/dotnet/core/blob/master/release-notes/2.0/2.0-supported-os.md

https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1-supported-os.md

https://github.com/dotnet/core/blob/master/release-notes/2.2/2.2-supported-os.md

 

安装Docker

      安装docker,参考:https://segmentfault.com/a/1190000014066388

 

开始使用Docker在Linux上运行NetCore

      回想一下我们平常做开发。流程都是使用Windows操作系统,并且使用宇宙最好IDE-VS,来创建项目、发布、运行。

      这篇文章,主要讲述怎么在linux上运用docker来运行net core程序 。也会使用我们一般会使用到的流行方法去运行net nore,一般的步骤如下:

在Windows上创建项目->修改dockerfile文件->复制项目到Linux系统->运行dockerfile并创建镜像->在docker容器中运行镜像。

 

创建项目并且生成Dockerfile                  

      现在,使用VS2017创建一个控制台项目,并添加Docker的支持,需要注意的是,添加Docker支持时需要选择Linux环境。具体怎么添加支持,请查看下面的截图。

      右键项目->添加->容器业务流程协调程序支持->选择【Docker Compose】->选择【Linux】

图一:

1

 

图二:

clipboard

 

图三:

clipboard

 

      创建完成后,可以看到项目的架构多了文件Dockerfile,与docker-compose。

clipboard

 

      主要看Dockerfile,它是描述了整个项目从编译到运行所依赖的环境,怎么去运行此程序。至于docker-compose目录,可以删除。其作用是在告诉VS所要运行docker的入口点,并且可以定义多个不同容器中的依赖关系来运行。这里不讲述docker-compose。

 

修改Dockerfile文件                      

      修改下面的Dockerfile文件,修改了路径,把项目文件夹去掉了。因为运行Dockerfile的时候,是在Dockerfile所在的文件夹内运行。具体每行代表什么,后面会说明。

clipboard

 

      修改完成了Dockfile文件后,下一步就是要把代码放到Linux镜像中了。

 

在Linux使用Docker运行程序的方式                         

      现在想到有3种方式运行在Linux上。第一种可以通过复制当前的项目源代码到Linux中编译并且运行。第二种是上传本地代码,然后在Linux使用git clone运行。第三种是在另外一台Linux成功构建镜像后,上传到线上仓储,最后在目标Linux下载镜像并在仓库中运行。

      第一种与第二种类似,都是需要获取代码,只是获取代码方式不同而已。第三种是通过线上发布再拉取的做法。

下面我们主要讨论第一种。第二、三种在另外一篇文章使用使用到。

 

在Docker中运行Dockfile生成镜像                          

      首先需要把代码copy到linux中。这里通过WinSCP工具复制项目文件到Linux系统中,例如Windows下有下面文件:

clipboard

 

      复制到Linux下,通过putty工具查看文件夹,已经复制成功了。

clipboard

 

      开始构造镜像image:运行命令【sudo docker build -t consoleappdockerlinux2-cmd .

      命令中,【consoleappdockerlinux2-cmd】代码镜像名称,可以修改成自己所需要的名称。也可以为镜像添加tag,修改【consoleappdockerlinux2-cmd】成【consoleappdockerlinux2-cmd:1.0】为镜像打上1.0的tag标签。命令最后面的【.】号是必要的,是dockerfile在当前目录运行docker的意思。详细命令可查看:http://www.runoob.com/docker/docker-build-command.html

      需要说明的是【sudo】命令是用管理员身份运行,所以要输入密码。然后运行docker。

      因为按照配置docker的时候使用了镜像加速,所以下载.net core镜像很快。如果是国外镜像,会timeout超时,所以建议都配上。

clipboard

clipboard

 

配置镜像加速器                     

      关于镜像加速,可以按照阿里云的教程,登录账号:https://cr.console.aliyun.com/cn-shenzhen/mirrors。每个账号的加速地址应该不一样。下面内容截取阿里云的教程:

运行镜像并添加到容器中           

      使用【sudo docker images】查看是否存在我们的镜像 consoleappdockerlinux2-cmd

clipboard

 

      可以看到已经安装镜像成功了,我们现在开始运行我们的镜像吧:【sudo docker run 镜像id

clipboard

      可以看到我们真的成功了!

 

关于容器的说明              

      众所周知,Docker有三大概念:镜像、容器、仓库。镜像是容器与仓库的桥梁,它们都需要用到镜像。上面我们把镜像添加到容器中运行,当使用【docker container ls】时,不会看到任何的容器,因为我们的控制台程序运行结束了。

      所以如果要看到所有的容器,无论是运行中还是停止的,可使用命令【sudo docker ps -a】。

 

详细介绍Dockerfile各行代表的意思          

 

 

 

 

演示更新版本                             

      安装完成程序之后,一般都需要更新版本。这里再简单地演示一次。

      在代码中更新了程序,控制台输出改成 “Hello World! 这是我第一次运行在Docker Linux中。 Version 2”。

      为了演示更直观,首先将镜像 consoleappdockerlinux2-cmd打上tag,1.0版本。【sudo docker tag consoleappdockerlinux2-cmd consoleappdockerlinux2-cmd:1.0

clipboard

 

      将程序代码复制到原本的路径上,然后运行命令构建Docker镜像【sudo docker build -t consoleappdockerlinux2-cmd:2.0 .】。这里指明构建2.0的tag。

成功后,运行【sudo docker images】可以查看到2.0版本的镜像了。

clipboard

 

      使用【docker run 镜像id】添加到容器中运行镜像,下面看到运行成功了,并且Version 2也打印出来了。

clipboard

 

      在上面,有没有发现问题。部署新代码运行镜像时需要指定镜像id,即使用【docker run 镜像id】的命令。而且每当重新编译新版本程序,都会重新生成一个镜像id,那么就矛盾了,每次都需要找到新版本的镜像id才会把镜像添加到容器中运行?

      有什么解决办法?不指定镜像id是否可以?

      所以docker run提供了运行 镜像名称+标签的命令:【sudo docker run consoleappdockerlinux2-cmd:latest

clipboard

 

      所以你每次运行上面的命令,都是最新版本的代码。

 

 

系列文章

Docker在Linux/Windows上运行NetCore文章系列

 

可以关注本人的公众号,多年经验的原创文章共享给大家。

posted on 2018-12-14 19:51 alun-chen 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/alunchen/p/10121434.html

<think>好的,用户想在.NET Core 8.0中搭建MQTT服务,我需要根据提供的引用内容来回答。首先,引用[1]提到了使用MQTTnet库创建简易的MQTT服务器Demo,这应该是关键。用户需要的是步骤指南,所以要按照创建项目、引用库、编写代码的结构来组织。 首先,确定需要创建个.NET Core项目。用户可能对项目创建不太熟悉,所以需要明确步骤,比如使用命令行或者IDE。接下来,引用MQTTnet库,这个库是主要的工具,要说明如何通过NuGet安装,可能还需要注意版本兼容性,但用户提到的是8.0,应该没问题。 然后,编写服务器代码。根据示例,可能需要控制台应用,初始化MqttServer,配置选项如端口、证书等。引用[1]中的代码示例可以作为参考,但需要调整以适应.NET Core 8.0。需要注意配置Builder,设置端口,比如使用1883默认端口,或者让用户自定义。同时,用户是否需要TLS/SSL加密?在示例中可能不需要,但可以提到选项,供用户选择。 客户端连接部分,需要说明如何测试,比如使用MQTTnet客户端或者其他工具如MQTT.fx。代码中的事件处理,如客户端连接和断开,可以添加日志输出,方便用户调试。 引用[4]提到了application.yml配置文件,但.NET Core通常使用appsettings.json,可能需要说明配置方式的不同,或者根据用户需求选择。不过用户的问题可能不需要复杂配置,所以保持简单,直接在代码中配置。 另外,引用[2]提到SignalR的版本问题,但这里可能不相关,除非用户需要集成其他服务,但问题聚焦在MQTT,所以暂时忽略。引用[3]是关于OpenAI的,可能无关,可以忽略。 最后,生成相关问题,需要考虑用户可能的后续疑问,比如客户端实现、安全认证、性能优化、部署到LinuxDocker,以及与其他服务整合,比如SignalR。这样能帮助用户深入学习和解决问题。 确保回答结构清晰,分步骤说明,代码示例正确,并且引用正确的来源。同时,检查LaTeX格式是否符合要求,虽然这个问题可能不需要数学公式,但如果有变量或代码内联,可能需要使用$...$,但看起来这里不需要。</think>在.NET Core 8.0中搭建MQTT服务可以通过MQTTnet库实现,以下是具体步骤: ### 、创建基础项目 1. 新建控制台应用 ```bash dotnet new console -n MQTTServerDemo cd MQTTServerDemo ``` 2. 添加MQTTnet包引用 ```bash dotnet add package MQTTnet.AspNetCore ``` ### 二、MQTT服务端实现 ```csharp using MQTTnet; using MQTTnet.Server; var builder = new MqttServerOptionsBuilder() .WithDefaultEndpoint() .WithDefaultEndpointPort(1883) .WithConnectionValidator(c => { // 身份验证逻辑 if (c.ClientId.Length < 5) c.ReasonCode = MQTTnet.Protocol.MqttConnectReasonCode.ClientIdentifierNotValid; }); var mqttServer = new MqttFactory().CreateMqttServer(builder.Build()); mqttServer.StartAsync().Wait(); Console.WriteLine("MQTT服务已启动,按任意键退出"); Console.ReadKey(); ``` ### 三、关键配置项说明 1. 端口设置:`.WithDefaultEndpointPort(1883)`指定监听端口 2. TLS加密:`.WithEncryptedEndpoint()`可启用SSL/TLS 3. 认证扩展:支持通过`.WithConnectionValidator()`实现自定义认证逻辑[^1] ### 四、客户端测试 使用MQTT.fx工具连接测试: 1. 主机地址:`localhost` 2. 端口:`1883` 3. 客户端ID:长度需≥5字符(根据验证规则) ### 五、部署建议 ```yaml # Dockerfile示例 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY . . RUN dotnet publish -c release -o /app FROM mcr.microsoft.com/dotnet/runtime:8.0 WORKDIR /app COPY --from=build /app . ENTRYPOINT ["dotnet", "MQTTServerDemo.dll"] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值