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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于事件驱动架构构建微服务第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.databases

go

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

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

use [LogCorner.EduSync.Speech.Database]

go

select * 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 build

docker images –filter "dangling=false"

运行容器

docker-compose up

docker 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]
go

select * from [dbo].[Speech]
go

执行Post请求

打开Postman并执行Post请求

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

use [LogCorner.EduSync.Speech.Database]
go

select * from [dbo].[Speech]
go

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

以上是关于基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)的主要内容,如果未能解决你的问题,请参考以下文章

基于事件驱动架构构建微服务第11部分:持续集成

基于事件驱动架构构建微服务第14部分:查询API

基于事件驱动架构构建微服务第7部分:在仓储上实现事件溯源

基于事件驱动架构构建微服务第15部分:SPA前端

基于事件驱动架构构建微服务第4部分:repositories

基于事件驱动架构构建微服务第9部分:处理更新