原文链接: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