跳至页脚内容
Iron Academy Logo
学习 C#
学习 C#

其他类别

在Linux上使用Docker运行SQL Server

[[academy-video-youtube({"vid": "-H5mMexO4_I", "start_time": "0", "title": "在Linux上使用Docker中的SQL Server", "creator": "Tim Corey", "length": "18m 20s"})]]

直接在开发机器上安装数据库引擎是一种常见的快捷方式,可能会导致长期问题。 数据库服务器是为专用硬件设计的。 它们消耗大量内存和CPU,当您安装多个版本时,积累配置债务,并在需要针对不同版本测试时增加升级的难度。 Docker容器通过在轻量级、一次性环境中隔离每个数据库实例解决了所有这些问题。

在他的视频"SQL Server in Docker on Linux"中,Tim Corey演示了如何使用一个Docker命令在Linux上启动一个Microsoft SQL Server实例,从VS Code连接到它,并对其执行查询。 他还展示了如何并排运行多个SQL Server版本以及如何在完成后清理。 如果您在遵循C# on Linux系列或想要一种快速、可重复的方式来使SQL Server在开发中运行,此演练涵盖了完整的设置。

为什么选择Docker而不是本地安装

[0:00 - 0:57] Tim以反对本地数据库安装的论点作为开场。 核心论点:数据库引擎是为专用服务器设计的。 本地安装意味着它们无论您是否使用都会消耗资源,并且在同一盒子上管理多个版本(SQL 2019, 2022, 2025)很快就会成为维护负担。

Docker容器颠覆了这种模式。 每个数据库都在自己的隔离环境中运行。 当您需要时启动,不需要时停止。 删除它,并以零剩余配置重新开始。 对于开发和测试,这种方法比传统安装设置更快,维护更干净,且比传统安装方法更灵活。

修复Portainer重启策略

[0:57 - 2:17] 在启动SQL Server之前,Tim意识到Portainer(在前一集中用于Docker容器的GUI管理工具)并未运行。 因为没有设置重启策略,它在上次关机时退出了。

修复有两个命令:

// Set Portainer to restart automatically (unless manually stopped)
docker update --restart unless-stopped portainer

// Start it now
docker start portainer
// Set Portainer to restart automatically (unless manually stopped)
docker update --restart unless-stopped portainer

// Start it now
docker start portainer

unless-stopped 策略意味着Portainer将在重启时自动重启,但如果您显式停止它,它将保持关闭。 启动后,Portainer可以在浏览器中通过 localhost:9000 访问。 Tim推荐这种策略用于您想一直运行的管理工具,同时保持数据库容器在手动启动。

SQL Server的Docker运行命令

[2:17 - 6:09] 整个SQL Server设置归结为一条命令。 Tim使用LocalSend(在之前的支线任务视频中介绍过)从他的Windows机器上转移,然后逐个分解:

// Single command to launch SQL Server 2025 in Docker
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 1433:1433 --name sql2025 mcr.microsoft.com/mssql/server:2025-latest
// Single command to launch SQL Server 2025 in Docker
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 1433:1433 --name sql2025 mcr.microsoft.com/mssql/server:2025-latest

每个标志都有特定的用途。 -e "ACCEPT_EULA=Y" 标志接受微软的许可协议。 -e "SA_PASSWORD=Test12345" 标志以明文设置系统管理员密码,Tim承认这对于本地开发是可以接受的,但绝不应该用于任何面向生产的用途。 -p 1433:1433 标志将容器的内部SQL Server端口映射到主机上的同一端口。--name sql2025 标志给容器一个人类可读的标签。 镜像标签 2025-latest 从微软的容器注册表中拉取最新的SQL Server 2025构建。

运行命令后,Docker下载镜像层,解压它们,并启动服务器。 整个过程需要几分钟,其中大部分时间是初始下载。

在Portainer中验证

[6:09 - 7:04] 回到Portainer,新SQL Server容器出现在容器列表中,显示其状态为正在运行。 Tim在这里做了一个故意的选择:没有为数据持久性挂载卷。 如果容器被删除,里面的数据库也会消失。

这对于开发设置是有意为之。重新开始意味着没有累积的测试数据,没有先前实验产生的架构漂移,也没有旧状态导致的"它在我的机器上工作"问题。 如果您需要在删除容器之前保留数据库,您可以先导出它们,但清除的方式是本地工作的首选流程。

从VS Code进行连接

[7:04 - 8:50] 为了管理数据库,Tim 从 Microsoft 为 VS Code 安装了 SQL Server 扩展。 安装后,侧边栏中会出现一个新的 SQL Server 面板,您可以在其中添加连接。

连接参数是最小的。 服务器名称是 . (点),意为localhost。由于容器映射了1433端口(SQL Server默认端口),无需指定端口号。 用户名是 sa,密码是来自Docker命令的密码,默认数据库是 master。 当提示时,请信任服务器证书。

一旦连接上,VS Code 会在连接旁显示 Docker 图标,确认检测到了容器化环境。 系统数据库(master, model, msdb, tempdb)出现在树中,准备好使用。

创建数据库和运行查询

[8:50 - 12:45] 连接建立后,Tim直接从VS Code侧边栏创建了一个名为 PeopleDB 的新数据库。 在其中,他使用可视化设计器创建了一个 People 表,添加了一个自动递增的 Id 列,一个 FirstName 列和一个 LastName 列(两者均为 NVARCHAR(50),不允许为空)。

然后他打开了一个新的查询窗口并插入了测试数据:

INSERT INTO dbo.People (FirstName, LastName)
VALUES
    ('Tim', 'Corey'),
    ('Sue', 'Storm'),
    ('Dave', 'Corey')
INSERT INTO dbo.People (FirstName, LastName)
VALUES
    ('Tim', 'Corey'),
    ('Sue', 'Storm'),
    ('Dave', 'Corey')

运行 SELECT 确认行已就位:

SELECT * FROM dbo.People
-- Returns: Tim Corey, Sue Storm, Dave Corey

SELECT * FROM dbo.People WHERE LastName = 'Corey'
-- Returns: Tim Corey, Dave Corey
SELECT * FROM dbo.People
-- Returns: Tim Corey, Sue Storm, Dave Corey

SELECT * FROM dbo.People WHERE LastName = 'Corey'
-- Returns: Tim Corey, Dave Corey

整个周期(创建数据库、设计表、插入数据、带过滤器查询)仅需几分钟。 所有操作均在 Docker 容器中运行,通过 VS Code 管理,主机上不安装 SQL Server。

停止、启动和资源管理

[12:45 - 14:20] 当您完成 SQL Server 工作时,在 Portainer 中单击一次或在终端中输入一条命令即可停止它:

docker stop sql2025
docker stop sql2025

停止的容器会释放所有 CPU 和内存资源。 唯一继续占用的是用于镜像和容器文件的磁盘空间,通常比本地安装的 SQL Server 小。

Tim 指出这是比传统安装的核心优势。 本地安装的 SQL Server 作为 Windows 或 Linux 服务运行,始终消耗资源。 Docker 容器只有在启动时才使用资源。

同时运行多个版本

[14:20 - 17:17] Docker 在数据库开发中最实用的功能之一是能够同时运行多个版本。 Tim 通过在现有 2025 容器旁启动 SQL Server 2022 来演示:

// SQL Server 2022 on a different port
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 2022:1433 --name sql2022 mcr.microsoft.com/mssql/server:2022-latest
// SQL Server 2022 on a different port
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Test12345" -p 2022:1433 --name sql2022 mcr.microsoft.com/mssql/server:2022-latest

关键区别在于端口映射:-p 2022:1433 将容器的内部端口1433映射到主机上的端口2022。这避免了与已使用1433的2025实例的端口冲突。下载完成后,两个容器都会出现在Portainer中,并且都同时运行。

当客户端在生产中运行 SQL Server 2022 而团队针对 2025 进行开发时,这很有用。切换版本无需重新安装,只需启动正确的容器。 所有可用的SQL Server镜像(2017、2019、2022、2025)都列在 mcr.microsoft.com,同样的方法可用于MySQL、PostgreSQL、MongoDB和Cosmos DB。

总结:一条命令即可完成完整的数据库环境

[17:17 - 17:47] 演练中展示了一条 Docker 命令替代了过去需要多步骤安装流程的配置向导、服务管理和版本冲突。 容器在几分钟内启动,只有在需要时运行,可以删除而不留下主机系统上的痕迹。

对于在多个项目中工作的开发人员来说,这种模式可以干净地扩展。 每个项目都有自己的容器、自己的版本和自己的独立数据。

结论

[17:47 - 18:20] 总结一下:SQL Server在Linux上的Docker中通过一个命令 docker run 运行。 通过 SQL Server 扩展在 VS Code 中与之连接,通过侧边栏创建数据库和表,并编写查询,就像对其他 SQL Server 实例一样。 完成后,停止容器并回收资源。

通过 Docker 进行数据库管理以及 VS Code 进行查询的组合为您提供完整的 Linux SQL 开发工作流程,无需进行本地数据库安装。

示例提示:如果您需要针对特定SQL Server版本进行测试,请检查 mcr.microsoft.com 以获取所有可用的标签。 通过为每个容器分配不同的主机端口(1433、2019、2022、2025),可以同时运行 2017、2019、2022 和 2025。 以描述性名称命名它们 (sql2019, sql2022),这样Portainer和 docker ps 的输出保持可读性。

在他的 YouTube 视频频道观看完整视频,获取在 Linux 上进行 C# 数据库开发的更多见解。

Hero Worlddot related to 在Linux上使用Docker运行SQL Server
Hero Affiliate related to 在Linux上使用Docker运行SQL Server

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我