部署并连接到 SQL Server Docker 容器

适用于:yesSQL Server (所有受支持的版本) -Linux

本文介绍如何部署和连接到 SQL Server Docker 容器。

有关其他部署方案,请参阅:

注意

本文专门介绍如何使用 mssql-server-linux 映像。 Windows 容器中的 SQL Server 部署不在支持范围内。 对于开发和测试,你可以创建自己的自定义容器映像,以便在 Windows 容器中与 SQL Server 配合使用。 可在 GitHub 上找到示例文件。 示例文件仅供参考。

重要

在选择运行 SQL Server 容器以用于生产用例之前,请查看 SQL Server 容器的支持策略,以确保在支持的配置上运行。

本视频时长 6 分钟,介绍了如何在容器上运行 SQL Server:

拉取并运行容器映像

若要拉取并运行 SQL Server 2017 的 Docker 容器映像 (4.x) 和 SQL Server 2019 () ,请遵循以下快速入门中的先决条件和步骤:

本配置文章在以下部分中提供其他使用方案。

连接和查询

可从容器外部或内部对容器中的 SQL Server 进行连接和查询。 以下部分介绍这两种方案。

容器外的工具

可从支持 SQL 连接的任何 Linux、Windows 或 macOS 外部工具连接到 Docker 计算机上的 SQL Server 实例。 一些常用工具包括:

以下示例使用 sqlcmd 连接到在 Docker 容器中运行的 SQL Server。 连接字符串中的 IP 地址为运行容器的主机的 IP 地址。

sqlcmd -S 10.3.2.4 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"

如果映射的主机端口不是默认的 1433,请将该端口添加到连接字符串。 例如,如果在命令中 docker run 指定 -p 1400:1433 了,则通过显式指定端口1400进行连接。

sqlcmd -S 10.3.2.4,1400 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"

容器内的工具

从 SQL Server 2017 (4.x) 开始, SQL Server 命令行工具包含在容器映像中。 如果使用交互式命令提示符附加至此映像,则可在本地运行工具。

  1. 使用 docker exec -it 命令在运行的容器内部启动交互式 Bash Shell。 在以下示例中,e69e056c702d 是容器 ID。

    docker exec -it e69e056c702d "bash"
    

    提示

    并非始终需要指定完整的容器 ID。 只需指定能够唯一标识它的足够字符即可。 因此,在本示例中,使用 e6e69 足矣,无需使用完整 ID。 若要查找容器 ID,请运行命令 docker ps -a

  2. 在容器内部,使用 sqlcmd 以本地方式连接到其完整路径。

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    
  3. 使用 sqlcmd 完成操作后,键入 exit

  4. 使用交互式命令提示符完成操作后,键入 exit。 退出交互式 Bash Shell 后,容器将继续运行。

检查容器版本

如果想要了解正在运行的 Docker 容器中的 SQL Server 版本,请运行以下命令将其显示。 将 <Container ID or name> 替换为目标容器 ID 或名称。 将替换 <YourStrong!Passw0rd> 为系统管理员 (SA) 帐户的 SQL Server 密码。

sudo docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P '<YourStrong!Passw0rd>' \
-Q 'SELECT @@VERSION'
docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd `
-S localhost -U SA -P "<YourStrong!Passw0rd>" `
-Q "SELECT @@VERSION"
docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd ^
-S localhost -U SA -P "<YourStrong!Passw0rd>" ^
-Q "SELECT @@VERSION"

还可以确定目标 Docker 容器映像的 SQL Server 版本和内部版本号。 以下命令显示映像的 SQL Server 版本和生成信息 mcr.microsoft.com/mssql/server:2019-latest 。 它通过运行具有环境变量 PAL_PROGRAM_INFO=1 的新容器来实现此目的。 生成的容器会立即退出,且 docker rm 命令会将其删除。

sudo docker run -e PAL_PROGRAM_INFO=1 --name sqlver \
-ti mcr.microsoft.com/mssql/server:2019-latest && \
sudo docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver `
-ti mcr.microsoft.com/mssql/server:2019-latest; `
docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver ^
-ti mcr.microsoft.com/mssql/server:2019-latest && ^
docker rm sqlver

上一个命令显示类似以下输出的版本信息:

sqlservr
  Version 15.0.4198.2
  Build ID 52e9e8d493d41fd93627371c4c7d3e2a6b52a65f47f07c8c737931a208c45824
  Build Type release
  Git Version d6f11919
  Built at Sat Jan 22 05:09:51 GMT 2022

PAL
  Build ID 2d0b057b139c49b6933e896f56af464a2893fd9aa3da2e2a709d5fc220cb0225
  Build Type release
  Git Version 52a534725
  Built at Sat Jan 22 05:07:25 GMT 2022

Packages
  system.security                         6.2.9200.11,52a534725+hls-win4-20220122044858,
  system.certificates                     6.2.9200.11,52a534725+hls-win4-20220122044858,
  secforwarderxplat                       15.0.4198.2
  sqlservr                                15.0.4198.2
  system.common                           10.0.17134.2145.202104262
  system.netfx                            4.7.0.0.202104262
  system                                  6.2.9200.11,52a534725+hls-win4-20220122044858,
  sqlagent                                15.0.4198.2

运行特定 SQL Server 容器映像

注意

在某些情况下,可能不希望使用最新的 SQL Server 容器映像。 若要运行特定 SQL Server 容器映像,请使用以下步骤:

  1. 确定想要使用的版本的 Docker 标记。 若要查看可用标记,请参阅 mssql-server-linux Docker Hub 页

  2. 使用标记拉取 SQL Server 容器映像。 例如,若要拉取2019-CU15-20.04映像,请将以下命令中的替换 为。 2019-CU15-ubuntu-20.04

    docker pull mcr.microsoft.com/mssql/server:<image_tag>
    
  3. 若要使用该映像运行新容器,请在 docker run 命令中指定标记名称。 在以下命令中,将 <image_tag> 替换为想要运行的版本。

    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    

这些步骤也可用于降级现有容器。 例如,你可能想要回滚或降级正在运行的容器,以便进行故障排除或测试。 若要降级正在运行的容器,必须对数据文件夹使用持久性技术。 按照升级部分所述的相同步骤进行操作,但在运行新容器时指定早期版本的标记名称。

运行基于 RHEL 的容器映像

SQL Server Linux 容器映像的文档指向基于 Ubuntu 的容器。 从 SQL Server 2019 (开始) ,可以使用基于 Red Hat Enterprise Linux (RHEL) 的容器。 RHEL 映像的示例如下所示。

例如,下面的命令将使用 RHEL 8 (SQL Server 2019 的累积更新15拉) 容器:

sudo docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8.4

运行生产容器映像

上一部分中的快速入门从 Docker Hub 运行免费的 SQL Server Developer Edition。 如果想要运行生产容器映像(例如 Enterprise、Standard 或 Web Edition),大部分信息仍然适用。 但是,存在一些差异,此处将其列出。

  • 如果拥有有效的许可证,则只能在生产环境中使用 SQL Server。 可在此处获取免费的 SQL Server Express 生产许可证。 SQL Server Standard 和 Enterprise Edition 许可证可通过 Microsoft 批量许可获得。

  • Developer 容器映像也可以配置为运行生产版本。 使用以下步骤运行生产版本:

查看快速入门中的要求并运行过程。 必须使用 MSSQL_PID 环境变量指定生产版本。 下面的示例演示如何为 Enterprise Edition 运行 2019 (SQL Server 最新的) 容器映像:

docker run --name sqlenterprise \
-e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
-e 'MSSQL_PID=Enterprise' -p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run --name sqlenterprise `
-e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong!Passw0rd>" `
-e "MSSQL_PID=Enterprise" -p 1433:1433 `
-d "mcr.microsoft.com/mssql/server:2019-latest"
docker run --name sqlenterprise `
-e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong!Passw0rd>" ^
-e "MSSQL_PID=Enterprise" -p 1433:1433 ^
-d "mcr.microsoft.com/mssql/server:2019-latest"

重要

通过将值 Y 传递给环境变量 ACCEPT_EULA 并将版本值传递给 MSSQL_PID,你表明自己拥有打算使用的 SQL Server 版本的现行有效有许可证。 你还同意自己对在 Docker 容器映像中运行的 SQL Server 软件的使用将受 SQL Server 许可条款的约束。

注意

有关 MSSQL_PID 的可能值的完整列表,请参阅在 Linux 上使用环境变量配置 SQL Server 设置

运行多个 SQL Server 容器

Docker 支持在同一主机上运行多个 SQL Server 容器。 对要求在同一主机上运行多个 SQL Server 实例的方案使用此解决办法。 每个容器必须在不同的端口上公开自己。

以下示例创建两个 SQL Server 2017 (14.x) 容器,并映射到主机上的端口 14011402

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest

以下示例创建两个 2019 SQL Server 2019 (15.x) 容器,并映射到主机上的端口 14011402

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest

现在,两个 SQL Server 实例在单独的容器内运行。 客户端可通过使用 Docker 主机的 IP 地址和容器的端口号连接到每个 SQL Server 实例。

sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1402 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"

升级容器中的 SQL Server

若要使用 Docker 升级容器映像,请先确定升级版本的标记。 使用 docker pull 命令从注册表中拉取此版本:

docker pull mcr.microsoft.com/mssql/server:<image_tag>

这会更新SQL Server新容器的映像,但不更新任何SQL Server容器中的容器。 为此,必须使用最新的 SQL Server 容器映像创建新容器,并将数据迁移到该新容器。

  1. 确保为现有 SQL Server 容器使用一种数据持久性技术。 这样便可以启动具有相同数据的新容器。

  2. 使用 docker stop 命令停止 SQL Server 容器。

  3. 使用 docker run 创建新的 SQL Server 容器,并指定映射主机目录或数据卷容器。 确保使用特定标记进行 SQL Server 升级。 新容器现在使用新版 SQL Server 和现有 SQL Server 数据。

    重要

    目前仅支持在 RC1、RC2 和 GA 之间升级。

  4. 在新容器中验证数据库和数据。

  5. 使用 docker rm 删除旧容器(可选)。

后续步骤

  • 通过快速入门SQL Server Docker (2017) 14.x 容器映像入门
  • 通过快速入门SQL Server Docker (15.x) 容器映像 2019 入门