13
0
0

Docker 部署 SQL Server 2022:本地装不上?用它绕开

2026-10-27
2026-10-30
文章摘要
|

背景与目标

不少课程作业要求在 SQL Server 里完成(比如小红书上老师布置的数据库作业)。但让学生在自己的 Windows 电脑上装 SQL Server,经常踩到一堆系统级问题:服务起不来、权限不足、端口被占、缺运行库、卸载重装也救不回来——最终作业做不了,挫败感极强。

SQL Server 本身是一款"重"软件:要注册系统服务、要管理员权限、对 Windows 版本和运行环境敏感。把这些不确定性整个丢进 Docker 容器,你的本机只需要有 Docker Desktop,剩下的环境问题由官方镜像替你解决。

本文给你一个开箱即用的 docker-compose.yaml,跑起来就是一套干净的 SQL Server,能连 SSMS / 命令行 / 任何客户端,作业随便做。

提示:本文作者宿主是 Windows (Docker Desktop)。macOS(尤其 Apple Silicon)需改用 arm64 版镜像,见"踩坑与解决"第 4 条。

步骤

第 0 步:确认 Docker Desktop 已就绪

打开 Docker Desktop,等图标不再转圈、显示 Engine running。命令行验证:

docker version
docker compose version

两条命令都有输出版本号,说明环境 OK。

第 1 步:准备目录

mkdir sql-server && cd sql-server

第 2 步:写 docker-compose.yaml

在本目录新建 docker-compose.yaml,内容如下(整段复制):

services:
  mssql:
    image: docker.io/apecloud/mssql:2022.0.0
    container_name: mssql
    environment:
      ACCEPT_EULA: "Y"            # 必须为 Y,否则容器直接退出
      MSSQL_SA_PASSWORD: "YourStrong!Passw0rd"   # 至少 8 位,含大写小写数字符号
      MSSQL_PID: "Developer"      # 免费开发版
    ports:
      - "1433:1433"
    volumes:
      - ./mssql-data:/var/opt/mssql/data
    restart: unless-stopped

第 3 步:启动

docker compose up -d

查看日志,等它打印 SQL Server is now ready for client connections:

docker compose logs -f mssql

看到 ready 文字后,容器已就绪。

第 4 步:连接验证

用命令行连一把(Linux/macOS 或正确路径的 sqlcmd),或直接开 SSMS(SQL Server Management Studio)连:

  • 服务器:localhost,1433

  • 登录名:sa

  • 密码:就是你上面设的 MSSQL_SA_PASSWORD

SSMS 看到左侧对象资源管理器展开,说明部署成功,可以建库做作业了。

踩坑与解决

1. 容器一启动就退出,日志说 ACCEPT_EULA 报错

  • 问题:docker compose up 后容器秒退。

  • 复现:docker compose logs mssql 看到类似 must be set to [Yy]。

  • 根因:SQL Server 镜像强制要求接受 EULA,ACCEPT_EULA 未设为 Y(或拼写/值错误)。

  • 解决:确认环境变量写成 ACCEPT_EULA: "Y",并重启 docker compose up -d。

  • 验证:再执行 docker compose logs -f mssql,出现 ready 提示。

2. sa 密码太简单,容器一直重启

  • 问题:容器反复重启,日志报密码强度不满足。

  • 复现:日志含 password does not meet SQL Server password policy requirements。

  • 根因:MSSQL_SA_PASSWORD 必须满足:至少 8 位,且含大写、小写、数字、符号四类中至少三类。

  • 解决:改用如 YourStrong!Passw0rd 这类强密码,重新 docker compose up -d。

  • 验证:日志出现 ready,SSMS 用新密码能连上。

3. 端口 1433 被占,启动失败

  • 问题:docker compose up -d 报端口被占用,容器无法启动。

  • 复现:日志/报错含 port is already allocated 或 address already in use。

  • 根因:本机已有程序占用了 1433(例如之前残留安装的 SQL Server 服务、或 SSMS 相关进程)。

  • 解决:改外部端口,把映射改成 14333:1433(内部仍 1433);连接时用 localhost,14333。若确定旧实例无用,也可在系统里停掉旧 SQL Server 服务再复用 1433。

  • 验证:docker compose up -d 成功,SSMS 连 localhost,14333 正常。

4. (macOS / Apple Silicon 用户)默认镜像跑不起来

  • 问题:没有 Windows 的读者,在 M 芯片 Mac 上跑 apecloud/mssql 默认镜像失败。

  • 复现:启动报 not supported / 架构错误(Apple Silicon 是 ARM,默认镜像是 amd64)。

  • 根因:默认镜像针对 x86_64 架构,ARM 芯片需要 arm64 版本镜像。

  • 解决:macOS 用户改用 arm64 版镜像,image 换成:

    swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apecloud/mssql:2022.0.0-linuxarm64

    其余配置(环境变量、端口、卷)不变。Windows 用户(本教程)不受影响。

  • 验证:架构匹配后容器能正常 ready。

5. 数据丢了?(重启后表消失)

  • 问题:删容器重建后,之前建的数据没了。

  • 复现:docker compose down && docker compose up -d 后 SSMS 里看不到旧库。

  • 根因:没挂数据卷,数据存在容器可写层,容器销毁即丢失。

  • 解决:本教程的 yaml 已挂绑定卷 ./mssql-data:/var/opt/mssql/data。只要用这段 yaml,数据会持久化到你目录下的 mssql-data/ 文件夹里。

  • 验证:建个测试表,docker compose down 再 up,表仍在。

实操贴图

容器运行

ScreenShot_2026-10-29_091002_634.png

连接数据库

ScreenShot_2026-10-29_091115_130.png
ScreenShot_2026-10-29_091152_803.png

小结与参考

  • 用 Docker 部署 SQL Server,把服务注册、权限、系统依赖等重活交给官方镜像,绕开学生本机安装的高失败率。

  • 三个必配环境变量:ACCEPT_EULA=Y、强 MSSQL_SA_PASSWORD、MSSQL_PID=Developer。

  • 记得挂持久化卷(本教程已含 ./mssql-data),否则容器销毁数据就没了。

  • 端口被占时改外部端口即可,内部固定 1433,连接串跟着改。

参考:

  • 镜像(Windows/Linux amd64):docker.io/apecloud/mssql:2022.0.0(作者验证可用)

  • 镜像(macOS arm64):swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apecloud/mssql:2022.0.0-linuxarm64

  • SQL 参考文档:https://www.runoob.com/sql/sql-tutorial.html

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

Docker 部署 SQL Server 2022:本地装不上?用它绕开
/archives/docker-bu-shu-sql-server-2022-ben-di-zhuang-bu-shang-yong-ta-rao-kai
作者
隔壁老陈
发布于
2026-10-27
许可协议
CC BY-NC-SA 4.0

评论