Docker 部署 Microsoft SQL Server 指南

文章目录

  • 部署方案对比
  • [一、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
  • 常见启动失败原因:
    1. 密码不符合复杂性要求

    2. 没有设置 ACCEPT_EULA=Y

    3. 宿主机端口已被占用(更改 -p 参数即可)

    4. 配置的挂载目录没有访问权限

      bash 复制代码
      sudo 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自动管理