使用 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 容器映像

相关推荐
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn862 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦2 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875242 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant