文章目录
- 部署方案对比
- [一、Docker 命令行方式](#一、Docker 命令行方式)
-
- [1. 拉取官方镜像](#1. 拉取官方镜像)
- [2. 创建本地数据目录(用于持久化)](#2. 创建本地数据目录(用于持久化))
- [3. 运行容器命令(最关键的步骤)](#3. 运行容器命令(最关键的步骤))
-
- [3.1 参数说明表](#3.1 参数说明表)
- [3.2 密码复杂度要求](#3.2 密码复杂度要求)
- [4. 检查容器状态](#4. 检查容器状态)
- [5. 查看日志以排查问题](#5. 查看日志以排查问题)
- [6. 连接测试](#6. 连接测试)
- [二、Docker Compose 方式](#二、Docker Compose 方式)
-
- [1. 创建项目目录和文件](#1. 创建项目目录和文件)
- [2. 创建 docker-compose.yml 文件](#2. 创建 docker-compose.yml 文件)
- [3. 启动容器](#3. 启动容器)
- 总结
部署方案对比
特性 | Docker 命令行方式 | Docker Compose 方式 |
---|---|---|
适用场景 | 快速测试、简单部署、临时使用 | 正式部署、复杂应用、多环境配置、需要版本控制 |
配置管理 | 单行命令,难以复用 | 声明式 YAML 文件,易于管理和版本控制 |
持久化 | 需手动指定主机绝对路径 | 支持命名卷和相对路径,管理更方便 |
安全性 | 密码在命令历史中可见 | 可通过 .env 文件隔离敏感信息 |
管理复杂度 | 简单 | 需要编写 YAML 文件 |
扩展性 | 较差 | 极佳,可轻松定义多服务应用 |
一、Docker 命令行方式
这种方式直接使用 docker run
命令,适合快速测试和简单部署
1. 拉取官方镜像
从 Microsoft Container Registry 拉取 SQL Server 2022 的最新 Linux 镜像
bash
docker pull mcr.microsoft.com/mssql/server:2022-latest

- 注意 :如需其他版本(如 2019),将标签改为
:2019-latest
2. 创建本地数据目录(用于持久化)
为了避免容器删除后数据丢失,需要在宿主机上创建一个目录来映射容器内的数据存储位置
bash
mkdir -p /usr/local/docker/sqlserver/data
3. 运行容器命令(最关键的步骤)
bash
docker run -d \
--name sql-server \
-e "ACCEPT_EULA=Y" \
-e "MSSQL_SA_PASSWORD=sqlserver@7740" \
-e "MSSQL_PID=Developer" \
-p 1433:1433 \
-v /usr/local/docker/sqlserver/data:/var/opt/mssql \
--memory="4g" \
--restart unless-stopped \
--user root \
mcr.microsoft.com/mssql/server:2019-latest

3.1 参数说明表
参数 | 说明 | 必要性 |
---|---|---|
-d |
后台运行容器(守护模式) | 可选 |
--name sql-server |
指定容器名称 | 可选 |
-e "ACCEPT_EULA=Y" |
接受最终用户许可协议 | 必须 |
-e "MSSQL_SA_PASSWORD=..." |
设置sa用户密码(需符合复杂度要求) | 必须 |
-e "MSSQL_PID=Developer" |
指定版本(Developer/Express/Standard/Enterprise) | 可选 |
-p 1433:1433 |
端口映射(主机端口:容器端口) | 必须 |
-v /host/path:/var/opt/mssql |
数据持久化挂载(主机路径:容器路径) | 推荐 |
--memory="4g" |
限制容器最大内存使用 | 推荐 |
--restart unless-stopped |
设置自动重启策略(除非手动停止) | 推荐 |
3.2 密码复杂度要求
- 长度至少8个字符
- 包含以下字符类型中的至少三种:
- 大写字母(A-Z)
- 小写字母(a-z)
- 数字(0-9)
- 特殊符号(如!@#$%^&*)
4. 检查容器状态
运行后,使用以下命令查看容器是否成功启动:
bash
docker ps

- 如果状态(STATUS)显示为
Up ...
,则表示运行成功。如果显示为Exited
,说明启动失败,需要查看日志
5. 查看日志以排查问题
- 错误示例
bash
docker logs sql-server
- 常见启动失败原因:
-
密码不符合复杂性要求
-
没有设置
ACCEPT_EULA=Y
-
宿主机端口已被占用(更改
-p
参数即可) -
配置的挂载目录没有访问权限
bashsudo chmod -R 777 /usr/local/docker/sqlserver/data
-
6. 连接测试
容器运行后,你可以使用任何客户端工具连接
- 服务器 :
ip
- 身份验证: SQL Server 身份验证
- 登录名 :
sa
- 密码 : 你在
MSSQL_SA_PASSWORD
中设置的密码 - 端口 : 如果你映射的是
1433
,直接使用即可
常用管理命令:
bash
* 停止容器: docker stop sql-server
* 启动容器: docker start sql-server
* 重启容器: docker restart sql-server
* 进入容器内部bash: docker exec -it sql-server bash
* 删除容器 (⚠️ **会丢失未持久化的数据**): docker rm -f sql-server
二、Docker Compose 方式
这种方式使用一个 docker-compose.yml
文件来声明所有配置,更清晰、易于版本控制和复用,特别适合复杂应用和多环境部署
1. 创建项目目录和文件
bash
cd /usr/local
sudo mkdir -p /docker/sql-server && cd /docker/sql-server
mkdir data && sudo chmod -R 777 data
2. 创建 docker-compose.yml 文件
需要提前创建
docker
网络:docker network create fc
使用文本编辑器创建该文件,并填入以下内容:
yaml
services:
mssql:
image: mcr.microsoft.com/mssql/server:2019-latest
container_name: sqlserver
environment:
- ACCEPT_EULA=Y
- MSSQL_PID=Developer
- MSSQL_SA_PASSWORD=sqlserver@7740
ports:
- "1433:1433"
volumes:
- mssql_data:/var/opt/mssql # 使用命名卷
restart: unless-stopped
mem_limit: 4g
mem_reservation: 2g
cpus: 2.0
networks:
- fc
volumes:
mssql_data: # 定义命名卷
networks:
fc:
external: true
配置项说明表
配置项 | 说明 | 示例值 |
---|---|---|
image |
使用的Docker镜像 | mcr.microsoft.com/mssql/server:2022-latest |
environment |
环境变量配置 | ACCEPT_EULA=Y , MSSQL_SA_PASSWORD=... |
ports |
端口映射配置 | "1433:1433" |
volumes |
数据卷映射 | mssql_data:/var/opt/mssql |
mem_limit |
内存限制 | 4g |
networks |
网络配置 | 自定义桥接网络 |
(可选)创建 .env
文件管理敏感信息
为了避免将密码硬编码在 YAML 文件中,可以创建一个 .env
文件(与 docker-compose.yml
同目录):
ini
# .env file
MSSQL_SA_PASSWORD=sqlserver@7740
然后修改 docker-compose.yml
中的 MSSQL_SA_PASSWORD
一行:
yaml
- MSSQL_SA_PASSWORD=${MSSQL_SA_PASSWORD}
或者
bash
env_file:
- .env # 将密码移出docker-compose文件

Docker Compose 会自动读取同目录下的 .env
文件并注入变量
3. 启动容器
启动容器前,注意开放防火墙端口:
bash
# 如果使用 firewalld
sudo firewall-cmd --add-port=1433/tcp --permanent
sudo firewall-cmd --reload

然后在包含 docker-compose.yml
文件的目录下,执行:
bash
docker compose up -d

-d
同样表示在后台运行- 这个命令会自动拉取镜像(如果本地没有)、创建定义的卷、网络,并启动所有服务
总结
特性 | Docker 命令行方式 | Docker Compose 方式 |
---|---|---|
适用场景 | 快速测试、单次运行、简单任务 | 正式部署、复杂应用、多环境、需要版本控制 |
配置管理 | 长长的命令,难以记录和复用 | 清晰的 YAML 文件,易于阅读、版本管理和共享 |
持久化 | 需手动指定主机绝对路径 | 可使用相对路径(如 ./data ),管理更方便 |
安全性 | 密码在命令历史中可见 | 可通过 .env 文件隔离敏感信息,更安全 |
管理命令 | docker start/stop/rm <name> |
docker-compose up/down/start/stop (基于项目) |
资源限制 | 在 run 命令中直接指定 |
在 YAML 文件中声明 |
扩展性 | 差,运行多个相关容器很麻烦 | 极佳,可以轻松定义多服务应用(如 App + DB) |
PS:如果遇到数据卷挂载权限问题,可以选择使用
user:root
或者直接创建数据卷由docker
自动管理