目录

介绍

先决条件

最好事先知道

假设

动机

跨平台

快速安装

经济有效

不同版本/多个实例

速度

持久性

找到SQL Server 2017镜像并在本地下载它

在没有卷挂载的情况下在本地执行SQL Server 2017容器

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

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

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

使用卷挂载重新创建SQL Server 2017容器以存储容器外部的数据库和日志文件


介绍

本文将讨论以下内容:

  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. Docker for Windows(Linux容器)
  5. 客户端:Docker Engine——社区
  1. 版本:18.09.2
  2. API版本:1.39
  1. 服务器:Docker Engine——社区
  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

假设

本文假设您具有使用.NET Core 2.1的Docker,SQL Server Management Studio,VS 2017,EF 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

docker 容器里pidfile 放哪里_Docker

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

docker 容器里pidfile 放哪里_Server_02

在没有卷挂载的情况下在本地执行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

docker 容器里pidfile 放哪里_Server_03

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

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

docker 容器里pidfile 放哪里_.NET Core_04

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

docker 容器里pidfile 放哪里_Docker_05

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

docker 容器里pidfile 放哪里_.NET Core_06

一旦我们成功执行了3个脚本文件,我们就可以执行select * from Professors和Students表。请查看下图:

docker 容器里pidfile 放哪里_Web API_07

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

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

docker 容器里pidfile 放哪里_Web API_08

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

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

请参考下图:

docker 容器里pidfile 放哪里_Server_09

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

docker 容器里pidfile 放哪里_Docker_10

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

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

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

docker 容器里pidfile 放哪里_.NET Core_11

执行命令以创建没有卷挂载的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 容器里pidfile 放哪里_Server_12

让我们验证数据库和容器内的日志文件是否丢失。请执行“docker exec -it sqlserver2017withoutmount bash”命令。它应该带我们进入容器。我们可以执行ls来查看目录列表。我们知道,文件的路径是“/var/opt/mssql/data”,让我们导航并验证我们的webapidemodb.mdfwebapidemodb_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 和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

docker 容器里pidfile 放哪里_Docker_13

让我们创建“webapidemodb”数据库并执行SqlScripts文件夹中的所有4个脚本。执行Web API,我们应该在浏览器中看到Professor(s)和Student(s)信息。假设我们创建了相同的数据库名称,就像我们在第一次练习中所做的那样。

docker 容器里pidfile 放哪里_Web API_14