基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerization-web-api-core-and-sql-server-linux/

在本文中,我将谈谈web api和sql server linux数据库的容器化

Web API将发布并上线,它需要一个数据库。所以我将容器化Web API和SQL Server数据库:LogCorner.EduSync.Speech.Presentation和LogCorner.EduSync.Speech.Database。将生成2个镜像,这些镜像将推送到容器注册表的存储库并由Azure Kubernete服务使用。

WEB API 容器化

右键单击LogCorner.EduSync.Speech.Presentation项目名称,然后选择容器业务流程协调程序支持

选择Docker Compose并单击OK

将生成以下Dockerfile

构建镜像

出于本演示的目的,我删除了所有容器和镜像,如果不想删除所有镜像,请不要运行此命令

# 停止所有容器
docker stop $(docker ps -a -q)# 删除所有容器
docker rm $(docker ps -a -q)
# 删除所有镜像
docker rmi $(docker images -q)

要构建之前的Dockerfile,请找到CommandInterfaces目录并运行以下命令:它从当前目录构建DockerFile作为构建上下文,并将生成的镜像命名为webapi-image

docker build -t webapi-image -f LogCorner.EduSync.Speech\LogCorner.EduSync.Speech.Presentation\Dockerfile .

运行以下命令列出所有镜像

docker images

docker images –filter “dangling=false”

创建了以下镜像:

  • microsoft/dotnet:2.2-aspnetcore-runtime(来自 Dockerfile)

  • microsoft/dotnet:2.2-sdk(来自 Dockerfile)

  • webapi-image(来自构建命令)

运行容器

运行以下命令:它运行webapi-image镜像,创建容器webapi-container并将容器的80端口映射到容器外的8080端口

docker run -d  -p 8080:80  –name webapi-container webapi-image

以下命令列出所有正在运行的容器

docker ps -a

我们有一个名为webapi-container的正在运行的容器

运行以下命令查看webapi-container日志

docker logs webapi-container

Web api现在正在运行并监听容器内的80端口和容器外的8080端口 所以应该如下访问http://localhost:8080/api/speech

再次运行docker logs webapi-container

docker logs webapi-container

日志说发生错误,因为它无法连接到数据库 让我们在下一步修复它

SQL SERVER LINUX 容器化

在LogCorner.EduSync.Speech.Database项目中,打开项目属性,然后单击Project Settings选项卡,然后选中Create script (.sql file)

它将创建一个用于创建数据库的脚本文件。每当更新数据库时,都会更新此脚本。

单击选项卡Build Events,创建一个Post-build event命令,如下所示:

xcopy “$(ProjectDir)bin\$(Configuration)\LogCorner.EduSync.Speech.Database_Create.sql” “$(ProjectDir)Docker\Restore” /Y

它将上一步生成的sql脚本复制到特定目录(在我的情况下为Docker/Restore) DockerFile将使用此脚本创建数据库镜像

sql server linux Dockerfile

找到SQL Server Dockerfile所在目录,运行以下命令创建带有SA_PASSWORD的database-image

docker build -t database-image . –build-arg SA_PASSWORD=’PassW0rd’

列出所有镜像

docker images –filter “dangling=false”

我们有两个附加镜像:microsoft/mssql-server-linux和database-image

运行容器

运行以下命令,根据database-image创建一个数据库容器(database-container),映射到容器内外的1433端口

docker run -d  -p 1433:1433  –name database-container database-image

列出正在运行的容器

docker ps -a

我们有一个基于数据库镜像的新容器

运行以下命令在数据库容器上附加shell

Docker exec -it database-container "bash"

运行以下命令连接到正在运行的容器的sql server实例

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'PassW0rd'

运行以下命令列出所有数据库

select name from sys.databasesgo

我们可以看到数据库LogCorner.EduSync.Speech.Database是通过Dockerfile上的脚本创建的

运行以下命令以选择该数据库上的[dbo].[Speech]表

use [LogCorner.EduSync.Speech.Database]goselect * from [dbo].[Speech]
go

DOCKER-COMPOSE

Compose是一个用于定义和运行多容器Docker应用程序的工具。要了解有关Compose的更多信息,请参阅以下文档:https://docs.docker.com/compose/overview/

打开docker-compose.yml文件,它已经包含一个logcorner.edusync.speech.presentation服务。更新此服务以使其依赖于数据库服务:logcorner.edusync.speech.presentation.data。

添加logcorner.edusync.speech.presentation.data服务,使用先前创建的SQL Dockerfile和SA_PASSWORD作为参数。

覆盖文件,顾名思义,可以包含现有服务或全新服务的配置覆盖:https://docs.docker.com/compose/extends/

打开docker-compose.override.yml文件,并设置ASPNETCORE_ENVIRONMENT = Docker或其他内容。目标是使用appsettings.Docker.json文件来设置特定于该环境的所有配置参数。

web api服务侦听容器内部的端口80和外部的8080。

数据库服务监听容器内部的1433端口和外部的1433端口。

打开 appsettings.Docker.json文件并添加connectionString以使用SQL Server数据库

Data Source=logcorner.edusync.speech.presentation.data

Initial Catalog=LogCorner.EduSync.Speech.Database

User=sa;Password=PassW0rd

构建镜像

docker-compose builddocker images –filter "dangling=false"

运行容器

docker-compose updocker ps --all --format "table {{.ID}}\t{{.Image}}\t{{.Names}}"

测试

运行容器

docker-compose up

ATTACH SHELL

docker exec -it 1997 “bash”

连接到正在运行的SQL SERVER容器实例

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘PassW0rd’

验证数据库表DBO.SPEECH是否为空

use [LogCorner.EduSync.Speech.Database]
goselect * from [dbo].[Speech]
go

执行Post请求

打开Postman并执行Post请求

验证数据库表DBO.SPEECH是否有一行数据

use [LogCorner.EduSync.Speech.Database]
goselect * from [dbo].[Speech]
go

欢迎关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爆笑!物理书上的照片能不能好好选选啊喂!

全世界只有3.14 % 的人关注了爆炸吧知识在物理书里,有各种物理大佬的照片。他们正襟危坐,他们不苟言笑,他们看起来就很“物理”。但是,知识君想说,谁不是个有血有肉的人啊?!选照片的时候给我好好…

计算机网络体系结构概述

1.Internet结构 2.计算机网络的体系结构 1)网路协议主要由以下三要素组成: 语法,即数据与控制信息的结构或格式; 语义,即需要发出何种控制信息,完成何种动作以及做出何种响应; 同步,…

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

前言工友们, .NET 6 Preview 7 已经在8月10号发布了, 除了众多的功能更新和性能改进之外, 在 preview 7 版本中, 也新增了全新的指标API, System.Diagnostics.Metrics, 为了让应用能有更好的可观测性, 在之前的发布的.NET 5中, 也把 Activity 增强为 ActivitySource, 主要原因还…

42张动图带你走进神奇的物理世界,超震撼!

全世界只有3.14 % 的人关注了爆炸吧知识世界之大,无奇不有。生活中其实有许多神奇的物理化学现象。下面就一起来看看吧!图片加载慢稍加等待即可哦~神 奇 的 物 理 反 应1.锤击被液氮冻上的康乃馨,求康乃馨的心理阴影面积。2.比重比空气还大的…

Linux优化之IO子系统监控与调优

Linux优化之IO子系统作为服务器主机来讲,最大的两个IO类型 :1.磁盘IO 2.网络IO这是我们调整最多的两个部分所在磁盘IO是如何实现的在内存调优中,一直在讲到为了加速性能,linux内核一般情况下都会尝试将磁盘上的慢速设备上的文件缓…

用3年时间破解学界200多年难题,年仅21岁的天才竟因谈了一场恋爱挂掉了.........

全世界只有3.14 % 的人关注了爆炸吧知识俗话说,英雄难过美人关,即便是智商超群的数学天才也毫不例外。破得了百年的世界难题,却解不开一个小小的爱情谜团......没错,这位为情所困的数学天才,便是今天的主人公——伽罗瓦…

投影变换与视口变换

一些说明: 0. 投影变换:描述如何指定视景体(viewing volume)的形状和方向。视口变换:解释如何控制三维模型坐标到屏幕坐标的变换。 1. 无论是透视投影还是平行投影(正交投影),只有在视景体中的物体才可见。…

java 按钮设置图片_Java中如何设置带图片按钮的大小

在java部分需要用到图形界面编程的项目中,经常会使用图片设置对按钮进行美化,但是使用时会出现一个很麻烦的问题, 按照方法:JButton jb1 new JButton();jb1.setBounds(0, 0, 25, 20);ImageIcon ii new ImageIcon("images/x…

JAVA 异常库

为什么80%的码农都做不了架构师?>>> 1.java.lang.NumberFormatException: multiple points已解决 多线程方法中使用了共享变量SimpleDateFormat,报如下错误: java.lang.NumberFormatException: multiple points at sun.misc.Floa…

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换独立观察员 2021 年 8 月 23 日我们平常在 WPF 中进行资源绑定操作,一般就是用 StaticResource 或者 DynamicResource 后面跟上资源的 key 这种形式,能满足大部分需求。但是有的时候&am…

你一直憋着的那个屁,放出来时真的有人知道吗?我先告诉你憋着不放的屁会到哪去……...

全世界只有3.14 % 的人关注了爆炸吧知识制作团队制作人 超模君编剧 恐恐恐插画 杨羊羊友情出演 超模君 想增加更多的奇怪知识?带你入学↓↓↓关注“爆炸吧知识”日增怪知识!

Android中View绘制流程

2019独角兽企业重金招聘Python工程师标准>>> 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的…

从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery…

java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

所谓有权图,就是图中的每一条边上都会有相应的一个或一组值。通常情况下,这个值只是一个数字如:在交通运输网中,边上的权值可能表示的是路程,也可能表示的是运输费用(显然二者都是数字)。不过,边上的权值也…

[原]一步一步自己制作弹出框

说到javascript弹出框的制作,将其实现步骤分开,其实很容易。下面,将拆分页面弹出框的制作步骤。首先,准备编辑工具(废话),其实,您可以使用notepad..嘿嘿。弹出框的组成结构: 1.一个页面遮罩层。 2.一个di…

那些你从未见过的神奇物理化学实验,今天全给你整理了!

全世界只有3.14 % 的人关注了爆炸吧知识1.电荷吸引水流2.比空气重的六氟化硫六氟化硫(SF6),法国两位化学家Moissan和Lebeau于1900年合成的人造惰性气体,具有良好的电气绝缘性能及优异的灭弧性能,是一种优于空气和油之间…

ASP.NET Core使用Middleware有条件地允许访问路由

问题有时,我们可能在Web API中包含一些具有调试功能的请求。比如我们上次的文章中“晕了!这个配置值从哪来的?”使用的获取配置值的功能:endpoints.MapGet("/test2/{key:alpha}", async context > {var key context…

如何用最低的成本教育出最棒的孩子?看完这些公众号你就知道了

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的,其实是我们对事物的见识与内心的格局,见识的深浅决定人生的深浅,格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号,希望能够给你带…

Virtualbox 无缝整合linux和windows双系统

一直以来,为了使用公司规定的内部通信工具RTX, 而不得不在ubuntu上安装一个virtualbox以运行RTX, 但是由于是运行在虚拟机里面,所以经常不能及时的回复同时的消息,而造成沟通的延迟。 所以就想着,能不能及时的在ubuntu上面看到…

聊一聊对外API接口的存活检查可以怎么做

背景 公司内部的API接口一般会分为两大类,一类是直接暴露在公网可以访问的,一类是只能在局域网内访问的。暴露在公网的一般就是业务网关以及一些和第三方公司有着某些合作,从而进行数据交互的接口。检查API接口是否存活,第一反应应…