Docker 部署 SQL Server 2022:本地装不上?用它绕开
背景与目标
不少课程作业要求在 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,表仍在。
实操贴图
容器运行

连接数据库


小结与参考
用 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

