部署并连接到 SQL Server Linux 容器

适用于:SQL Server - Linux

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

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

注意

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

重要

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

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

拉取并运行容器映像

要拉取并运行 SQL Server 的 Docker 容器映像,请按照以下快速入门中的先决条件和步骤执行操作:

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

连接和查询

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

容器外的工具

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

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

注意

默认情况下,新版本的 sqlcmd(在 mssql-tools18 中)是安全的。 如果使用版本 18 或更高版本,则需要将 No 选项添加到 sqlcmd ,以指定加密是可选的,而不是强制性的。

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 (14.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-tools18/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    

    注意

    默认情况下,较新版本的 sqlcmd 是安全的。 有关连接加密的详细信息,请参阅 sqlcmd 实用工具(对于 Windows)和使用 sqlcmd 进行连接(对于 Linux 和 macOS)。 如果连接不成功,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。

  3. 使用 sqlcmd 完成操作后,键入 exit

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

检查容器版本

如果想要了解正在运行的容器中的 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'

注意

默认情况下,较新版本的 sqlcmd 是安全的。 有关连接加密的详细信息,请参阅 sqlcmd 实用工具(对于 Windows)和使用 sqlcmd 进行连接(对于 Linux 和 macOS)。 如果连接不成功,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。

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

注意

默认情况下,较新版本的 sqlcmd 是安全的。 有关连接加密的详细信息,请参阅 sqlcmd 实用工具(对于 Windows)和使用 sqlcmd 进行连接(对于 Linux 和 macOS)。 如果连接不成功,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。

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

注意

默认情况下,较新版本的 sqlcmd 是安全的。 有关连接加密的详细信息,请参阅 sqlcmd 实用工具(对于 Windows)和使用 sqlcmd 进行连接(对于 Linux 和 macOS)。 如果连接不成功,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。

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

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

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

sqlservr
  Version 16.0.1000.6
  Build ID d81e9b6de06534e649bd57dd609aa3050f5e380f361b7f8a80a80eeb71e7422c
  Build Type release
  Git Version 2aede92f
  Built at Tue Nov 01 06:11:40 GMT 2022

PAL
  Build ID 754097e8f0db68f559e1cbc9d46952ac9fd518b5da9f12964ef40fc9033720e3
  Build Type release
  Git Version d88e3e1130
  Built at Tue Nov 01 06:08:02 GMT 2022

Packages
  system.security                         mssql-16.0.1000.6_26_official-release
  system.certificates                     mssql-16.0.1000.6_26_official-release
  sqlagent                                16.0.1000.6
  system.wmi                              10.0.17763.2061.202107231
  system.netfx                            4.7.0.0.202104262
  system                                  mssql-16.0.1000.6_26_official-release
  system.common                           10.0.17763.2061.202107231
  sqlservr                                16.0.1000.6
  secforwarderxplat                       16.0.1000.6

运行特定 SQL Server 容器映像

注意

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

  1. 确定想要使用的版本的 Docker tag。 若要查看可用的标记,请参阅 Microsoft 工件注册表

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

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

    重要

    SA_PASSWORD 环境变量已弃用。 请改用 MSSQL_SA_PASSWORD

    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 (15.x) 开始,可使用基于 Red Hat Enterprise Linux (RHEL) 的容器。 RHEL 映像的示例类似于 mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8

例如,以下命令拉取使用 RHEL 8 的 SQL Server 2019 (15.x) 容器的累积更新 18:

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

运行生产容器映像

上一部分中的快速入门从 Microsoft 工件注册表运行免费的 SQL Server 开发人员版本。 如果想要运行生产容器映像(例如 Enterprise、Standard 或 Web Edition),大部分信息仍然适用。 但是,存在一些差异,此处将其列出。

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

  • Developer 容器映像也可以配置为运行生产版本。

要运行生产版本,请查看快速入门中的要求和运行过程。 必须使用 MSSQL_PID 环境变量指定生产版本。 以下示例介绍如何运行 Enterprise Core 版本的最新 SQL Server 2022 (16.x) 容器映像。

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

重要

通过将值 Y 传递给环境变量 ACCEPT_EULA 并将版本值传递给 MSSQL_PID,你表明自己拥有打算使用的 SQL Server 版本的现行有效有许可证。 你还同意自己对在容器映像中运行的 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

以下示例创建两个 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 2022 (16.x) 容器,并将它们映射到主机的 14011402 端口。

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

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

注意

默认情况下,新版本的 sqlcmd(在 mssql-tools18 中)是安全的。 如果使用版本 18 或更高版本,则需要将 No 选项添加到 sqlcmd ,以指定加密是可选的,而不是强制性的。

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 删除旧容器(可选)。

  • 通过查看快速入门,开始在 Docker 上使用 SQL Server 2017 (14.x) 容器映像
  • 通过查看快速入门,开始在 Docker 上使用 SQL Server 2019 (15.x) 容器映像
  • 通过查看快速入门,开始在 Docker 上使用 SQL Server 2022 (16.x) 容器映像

参与编辑 SQL 文档

你是否知道你可以自行编辑 SQL 内容? 你如果这样做,不仅可以帮助改进我们的文档,还可以获得页面贡献者的殊荣。

有关详细信息,请参阅如何参与 SQL Server 文档编辑