使用 Docker 运行 SQL Server 2019

请求并运行 SQL Server Linux 容器映像

在开始执行以下步骤之前,请确保已选择首选的 shell(bash、PowerShell 或 cmd)。

对于本文中的 bash 命令,将使用 sudo。 如果不想使用 sudo 来运行 Docker,可以配置 docker 组并将用户添加到该组,详情请参阅 适用于 Linux 的 Docker 安装后步骤

从注册表拉取容器

从 Microsoft 容器注册表中拉取 SQL Server 2019 (15.x) Linux 容器映像。

Bash 命令

bash 复制代码
docker pull mcr.microsoft.com/mssql/server:2019-latest

说明

本快速入门使用 SQL Server 2019 (15.x) 容器。若需其他版本的 Linux 容器,可参考:

  • SQL Server 2025
  • SQL Server 2022
  • SQL Server 2017

上述命令拉取最新的 SQL Server 2019 映像,若需特定版本,需添加标记(如 mcr.microsoft.com/mssql/server:2019-GA-ubuntu)。所有可用映像可查看 Microsoft 工件注册表

运行容器

在 bash shell(或管理员权限的 PowerShell 控制台)中,使用以下命令运行 Linux 容器镜像。

重要
SA_PASSWORD 环境变量已弃用,请改用 MSSQL_SA_PASSWORD

Bash 命令

bash 复制代码
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
   -p 1433:1433 --name sql1 --hostname sql1 \
   -d \
   mcr.microsoft.com/mssql/server:2019-latest

密码要求

密码需遵循 SQL Server 默认密码策略:至少 8 个字符,且包含以下四类字符中的三类(大写字母、小写字母、十进制数字、符号),最长可设 128 个字符。若不满足要求,容器无法初始化 SQL Server 并会停止运行,可通过 docker logs 查看错误日志。

默认情况下,本示例创建的是 SQL Server 开发人员版容器;运行生产版本的流程略有差异,详情请参阅 运行生产容器映像

参数说明

参数 说明
-e "ACCEPT_EULA=Y" 将 ACCEPT_EULA 设为任意值,确认接受最终用户许可协议(必选)。
-e "MSSQL_SA_PASSWORD=<password>" 指定符合密码策略的强密码(必选)。
-e "MSSQL_COLLATION=<SQL_Server_collation>" 自定义 SQL Server 排序规则,默认值为 SQL_Latin1_General_CP1_CI_AS
-p 1433:1433 将主机的 TCP 端口(第一个值)映射到容器的 TCP 端口(第二个值),示例中容器 1433 端口对主机 1433 端口公开。
--name sql1 为容器指定自定义名称(避免随机生成),多个容器不可重复使用同一名称。
--hostname sql1 显式设置容器主机名(默认是随机生成的容器 ID)。
-d 以守护进程模式在后台运行容器。
mcr.microsoft.com/mssql/server:2019-latest 要运行的 SQL Server Linux 容器映像。

查看容器列表

使用 docker ps 命令查看 Docker 容器状态。

Bash 命令

bash 复制代码
docker ps -a

输出示例

复制代码
CONTAINER ID   IMAGE                                        COMMAND                    CREATED         STATUS         PORTS                                       NAMES
d4a1999ef83e   mcr.microsoft.com/mssql/server:2019-latest   "/opt/mssql/bin/perm..."   2 minutes ago   Up 2 minutes   0.0.0.0:1433->1433/tcp, :::1433->1433/tcp   sql1

状态说明

  • STATUS 列显示 Up,表示 SQL Server 已在容器中运行,并侦听 PORTS 列指定的端口;

  • STATUS 列显示 Exited,请参阅 SQL Server Docker 容器故障排除

  • 当 SQL Server 错误日志显示 SQL Server is now ready for client connections. This is an informational message; no user action is required 时,即可连接服务器。可通过以下命令查看日志:

    bash 复制代码
    docker exec -t sql1 cat /var/opt/mssql/log/errorlog | grep connection

补充说明
--hostname 参数会修改容器内部名称,可通过以下 Transact-SQL 查询验证:

sql 复制代码
SELECT @@SERVERNAME,
       SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
       SERVERPROPERTY('MachineName'),
       SERVERPROPERTY('ServerName');

建议将 --hostname--name 设置为相同值,便于识别目标容器。
安全提示

生产环境中需修改 SA 密码(MSSQL_SA_PASSWORD 会出现在 ps -eax 输出和环境变量中)。

连接到 SQL Server

以下步骤在容器内部使用 sqlcmd 命令行工具连接 SQL Server。

1. 进入容器的交互式 Bash Shell

bash 复制代码
docker exec -it sql1 "bash"

sql1 是创建容器时 --name 参数指定的名称)

2. 本地连接 SQL Server

在容器内部通过完整路径调用 sqlcmd

bash 复制代码
/opt/mssql-tools18/bin/sqlcmd -S localhost -U <userid> -P "<password>"

说明

  • 最新版本的 sqlcmd 默认启用加密连接,若连接失败,可添加 -No 选项将加密设为"可选":

    bash 复制代码
    /opt/mssql-tools18/bin/sqlcmd -S localhost -U <userid> -P "<password>" -No
  • 也可省略密码参数,执行后手动输入:

    bash 复制代码
    /opt/mssql-tools18/bin/sqlcmd -S localhost -U <userid>
  • 连接成功后会显示 sqlcmd 提示符:1>

创建和查询数据

以下步骤通过 sqlcmd 和 Transact-SQL 完成新建数据库、插入数据、查询数据的操作。

1. 新建数据库

sqlcmd 提示符中输入以下命令,创建名为 TestDB 的数据库:

sql 复制代码
CREATE DATABASE TestDB;
SELECT name FROM sys.databases;
GO

GO 用于执行前序命令)

2. 插入数据

切换到 TestDB 数据库,创建 Inventory 表并插入数据:

sql 复制代码
USE TestDB;
CREATE TABLE Inventory
(
    id INT,
    name NVARCHAR (50),
    quantity INT
);
INSERT INTO Inventory VALUES (1, 'banana', 150);
INSERT INTO Inventory VALUES (2, 'orange', 154);
GO

3. 选择数据

查询 Inventory 表中数量大于 152 的行:

sql 复制代码
SELECT * FROM Inventory WHERE quantity > 152;
GO

4. 退出 sqlcmd 和容器 Shell

sql 复制代码
QUIT  -- 退出 sqlcmd 会话

在容器的 Bash Shell 中输入:

bash 复制代码
exit  -- 退出交互式 Shell(容器仍在后台运行)

从容器外连接

可从 Linux、Windows 或 macOS 上支持 SQL 连接的外部工具,通过主机 IP 地址连接容器内的 SQL Server。

以下示例使用 sqlcmd 从容器外连接(需提前安装 sqlcmd 工具,其他工具连接逻辑类似):

1. 查找容器主机的 IP 地址

bash 复制代码
ifconfig  # 或 ip addr

2. 使用 sqlcmd 连接

bash 复制代码
sudo sqlcmd -S <ip_address>,1433 -U <userid> -P "<password>"

说明

  • 若使用 sqlcmd 18+ 版本连接失败,添加 -No 选项:

    bash 复制代码
    sudo sqlcmd -S <ip_address>,1433 -U <userid> -P "<password>" -No
  • 密码需遵循前文的密码策略要求;

  • 需在防火墙中开放主机的 1433 入站端口。

3. 执行命令并退出

运行 Transact-SQL 命令后,输入 QUIT 退出 sqlcmd

常用外部连接工具

  • 适用于 Visual Studio Code 的 MSSQL 扩展
  • SQL Server Management Studio (SSMS)
  • mssql-cli(预览版)
  • PowerShell

移除容器

若需删除本教程创建的 SQL Server 容器,执行以下命令:

bash 复制代码
docker stop sql1  # 停止容器
docker rm sql1    # 删除容器

其他版本安装请参考:快速入门:使用 Docker 运行 SQL Server Linux 容器映像

相关推荐
风静雪冷2 小时前
在Ubuntu上安装docker(docker engine)和docker compose
linux·ubuntu·docker
m0_485614672 小时前
Linux-Dockerfile与Docker Compose
linux·运维·docker
G_H_S_3_2 小时前
【网络运维】MySQL组成与常用工具
运维·网络·mysql
点亮一颗LED(从入门到放弃)2 小时前
Linux驱动之中断(9)
linux·运维·单片机
阎*水2 小时前
Ceph 分布式存储完整实践指南
linux·运维·分布式·ceph
优质网络系统领域创作者2 小时前
IS-IS和OSPF路由协议对比以及两个协议双点双向引入
运维·网络
ArrebolJiuZhou2 小时前
arm指令集(一)
linux·运维·arm开发
Azure DevOps3 小时前
Azure DevOps Server 正式版本发布
运维·microsoft·azure·devops
lbb 小魔仙3 小时前
Steam Deck OLED 拆解与评测:Valve 对 Linux 掌机的又一次精进
linux·运维·服务器