65.9K
CodeProject 正在变化。 阅读更多。
Home

在.NET Core中使用SQL Server 2017 Docker容器进行本地Web API开发

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2019年7月14日

CPOL

6分钟阅读

viewsIcon

12797

在本文中,我们将探讨如何使用SQL Server 2017 Docker镜像进行本地Web API开发。

引言

本文将讨论以下内容:

  1. 如何定位SQL Server 2017镜像并将其下载到本地
  2. 在本地执行SQL Server 2017 Docker容器
  3. 使用Docker容器中托管的SQL Server 2017进行本地.NET Core Web API开发

先决条件

  1. Windows 10
  2. Visual Studio 2017
  3. Microsoft SQL Server Management Studio 18
  4. 适用于Windows的Docker(Linux容器)
  5. 客户端:Docker Engine - Community
    1. 版本:18.09.2
    2. API版本:1.39
  6. 服务器:Docker Engine - Community
    1. 版本:18.09.2
    2. API版本:1.39(最低版本1.12)

最好具备以下先验知识

  1. Docker (https://www.docker.com/)
  2. EF Core 2.1
  3. 使用.NET Core 2.1的Web API
  4. SQL Server Management Studio 18

假设

本文假设您对Docker、SQL Server Management Studio、VS 2017、EF Core 2.1以及使用.NET Core 2.1的Web API有基本了解。

动机

跨平台

Microsoft SQL Server 2017现已在多个平台可用:Windows、Linux和Docker。

快速安装

获取SQL Server的Docker镜像就像运行`docker image pull`一样简单。

成本效益

容器更便宜。

不同版本/多个实例

我们可以在本地服务器/笔记本电脑上启动任意数量的实例。每个容器都是独立的(全新且干净的),并在完成后将其删除。

速度

Docker和容器化应用程序的速度和效率优势也适用于SQL Server 2017 Docker容器。

持久化

我们可以使用卷挂载来将*.mdf*和*.ldf*文件存储在容器外部。这样,这些*.mdf*和*.ldf*文件将存储在持久性硬盘上。即使容器被移除,这些数据也会因为托管在容器外部而安全。

定位SQL Server 2017镜像并下载到本地

我们可以访问此处来查找我们想要拉取到本地笔记本电脑的镜像。在本文中,我们将使用“mcr.microsoft.com/mssql/server:2017-latest”。

首先,让我们通过在命令行中执行以下命令来验证我们笔记本电脑上可用的镜像列表。

docker images

在命令提示符下,请执行以下命令将SQL Server 2017镜像拉取到本地。我们需要等待几分钟,直到镜像被拉取到本地。

docker pull mcr.microsoft.com/mssql/server:2017-latest

让我们验证SQL Server 2017镜像是否已成功拉取到本地。我们可以看到镜像已被拉取,其大小为1.33 GB。

在本地执行SQL Server 2017容器(不带卷挂载)

我们将在不带卷挂载的情况下执行SQL Server 2017容器。这样做的结果是,无论何时删除容器,SQL Server数据库中存储的所有数据都将丢失。在命令行中执行以下命令。确保端口1433可用。

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Sample123$" -p 1433:1433 
--name sqlserver2017withoutmount -d mcr.microsoft.com/mssql/server:2017-latest
  • -e 'ACCEPT_EULA

    ACCEPT_EULA变量设置为“Y”以确认接受最终用户许可协议。

  • -e 'SA_PASSWORD

    使用sa用户名登录SQL实例的密码。

  • -p 1433:1433

    将主机环境上的TCP端口(第一个值)与容器中的TCP端口(第二个值)映射。在此示例中,SQL Server在容器中监听TCP 1433,并将其暴露给主机上的端口1433。

  • --name

    为容器指定一个名称,而不是随机生成的名称。

此外,执行docker ps -a以验证容器是否已成功创建并正在运行。

docker ps -a

使用SQL Server Management Studio 18连接到容器内运行的SQL Server 2017

如我们所见,SQL Server正在端口1433上执行。请指定服务器名称“localhost,1433”,登录名“sa”和密码“Sample123$”以登录到容器内运行的SQL Server。

成功登录后,右键单击“数据库”->“新建数据库…”。它将显示一个对话框,您需要在其中指定“webapidemodb”。此外,请注意数据库和日志文件正在容器内部的“/var/opt/mssql/data”中创建。请参考下图

打开一个新的查询窗口(右键单击“webapidemodb”->新建查询)。从*SqlScripts*文件夹中,仅执行*1Create_Professors.sql*、*2Create_Students.sql*和*3Insert_Professors.sql*文件。它应该创建两个表并填充Professors表。

成功执行3个脚本文件后,我们可以对ProfessorsStudents表执行select *。请查看下图

让我们验证数据库和日志文件是否存在于容器内部。请执行“docker exec -it sqlserver2017withoutmount bash”命令。它应该将我们带入容器内部。我们可以执行ls(列出)进行目录列表。如我们所知,文件的路径是“/var/opt/mssql/data”,让我们导航并验证我们的*webapidemodb.mdf*和*webapidemodb_log.ldf*是否存在。

docker exec -it sqlserver2017withoutmount bash
cd /var/opt/mssql/data
ls

在Web API中连接到容器内运行的SQL Server 2017中创建的数据库

让我们在Web API解决方案中使用我们在Docker容器中创建的数据库。请在Visual Studio 2017中打开*College.Services.sln*解决方案。请打开*appsettings.json*并修改“ConnectionStrings”中的“CollegeDBConnectionString”。"CollegeDBConnectionString": "Server=tcp:localhost,1433;Database=webapidemodb;User Id=sa;Password=Sample123$;"。

请参考下图

完成后,请执行Web API项目,我们应该能够在浏览器中(在我们的例子中是Chrome)看到3位教授的信息。

验证、删除和重新创建SQL Server 2017容器,以确保我们创建的数据库(webapidemodb)已丢失

验证SQL Server容器是否存在(docker ps -a)。然后,使用docker stop ContainerIddocker rm ContainerId停止并删除容器。此外,验证SQL Server容器是否不可用(docker ps -a)。请参考下图

docker ps -a
docker stop ContainerId
docker rm ContainerId
docker ps -a

执行命令创建不带卷挂载的SQL Server 2017容器,并验证我们的*webapidemodb*文件是否丢失。

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Sample123$" -p 1433:1433 
           --name sqlserver2017withoutmount -d mcr.microsoft.com/mssql/server:2017-latest

请参考下图

让我们验证容器内的数据库和日志文件是否丢失。请执行“docker exec -it sqlserver2017withoutmount bash”命令。它应该将我们带入容器内部。我们可以执行ls进行目录列表。如我们所知,文件的路径是“/var/opt/mssql/data”,让我们导航并验证我们的*webapidemodb.mdf*和*webapidemodb_log.ldf*是否丢失。

docker exec -it sqlserver2017withoutmount bash
cd /var/opt/mssql/data
ls

重新创建带卷挂载的SQL Server 2017容器,以便将数据库和日志文件存储在容器外部

通过上述实验,我们了解到如果我们在不带卷挂载的情况下创建SQL Server容器,并且数据库和日志文件位于容器内部,那么如果删除容器,它们将丢失。现在让我们删除并使用卷挂载重新创建容器。

验证SQL Server容器是否存在(docker ps -a)。然后,使用“docker stop ContainerId and docker rm ContainerId”停止并删除容器。此外,验证SQL Server容器是否不可用(docker ps -a)。

docker ps -a
docker stop ContainerId
docker rm ContainerId
docker ps -a

让我们执行以下命令创建带卷挂载的SQL Server 2017容器。“C:\DockerVolumes\formssql”是我们本地笔记本电脑上的路径,而/var/opt/mssql/data是容器内部的文件夹。这将把数据库和日志文件创建在容器外部(C:\DockerVolumes\formssql)中。请参考下图

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Sample123$" -p 1433:1433 
--name sql1 -v C:\LordKrishna\DockerVolumes\formssql:/var/opt/mssql/data 
-d mcr.microsoft.com/mssql/server:2017-latest

让我们创建“webapidemodb”数据库,并执行*SqlScripts*文件夹中的所有4个脚本。执行Web API,我们应该在浏览器中看到ProfessorStudent的信息。假设我们创建了与第一个练习中相同的数据库名称和表。

摘要

使用SQL Server 2017容器将帮助开发人员快速设置、开发和交付。

历史

  • 2019年7月14日:首次发布
© . All rights reserved.