diff --git a/DockerComposeShells/SQLServer-README.md b/DockerComposeShells/SQLServer-README.md new file mode 100644 index 0000000..b1dc8df --- /dev/null +++ b/DockerComposeShells/SQLServer-README.md @@ -0,0 +1,217 @@ +# SQL Server 2022 Linux Docker Compose 部署指南 + +## 概述 + +这是一个完整的SQL Server 2022 Linux Docker Compose部署方案,包含数据库初始化、用户管理、性能优化等配置。 + +## 文件结构 + +``` +├── docker-compose-sqlserver.yml # Docker Compose 配置文件 +├── sqlserver.env # 环境变量配置文件 +├── sqlserver/ # SQL Server 相关目录 +│ ├── init/ # 初始化脚本目录 +│ │ ├── 01-create-database.sql # 创建数据库和表 +│ │ ├── 02-create-user.sql # 创建用户和权限 +│ │ └── 03-performance-config.sql # 性能优化配置 +│ ├── data/ # 数据文件目录 +│ ├── logs/ # 日志文件目录 +│ ├── backup/ # 备份文件目录 +│ └── web-config/ # Web管理界面配置 +└── SQLServer-README.md # 本说明文档 +``` + +## 快速开始 + +### 1. 配置环境变量 + +复制并修改环境变量文件: + +```bash +cp sqlserver.env .env +``` + +编辑 `.env` 文件,修改以下关键配置: + +```bash +# 修改SA密码(必须) +SQLSERVER_SA_PASSWORD=YourStrong@Password123! + +# 修改端口(可选,避免冲突) +SQLSERVER_PORT=1433 + +# 选择SQL Server版本 +SQLSERVER_EDITION=Developer # 免费开发版本 +``` + +### 2. 启动服务 + +```bash +# 启动SQL Server +docker-compose -f docker-compose-sqlserver.yml --env-file .env up -d + +# 查看服务状态 +docker-compose -f docker-compose-sqlserver.yml ps + +# 查看日志 +docker-compose -f docker-compose-sqlserver.yml logs -f sqlserver +``` + +### 3. 连接数据库 + +#### 使用 sqlcmd 连接 + +```bash +# 进入容器 +docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' + +# 或者直接执行SQL +docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -Q "SELECT name FROM sys.databases" +``` + +#### 使用外部工具连接 + +- **服务器**: `localhost` 或你的服务器IP +- **端口**: `1433`(或你在.env中配置的端口) +- **用户名**: `sa` +- **密码**: 你在.env中配置的密码 +- **数据库**: `SampleDB`(初始化脚本创建的示例数据库) + +## 配置说明 + +### SQL Server 版本选择 + +在 `sqlserver.env` 中配置 `SQLSERVER_EDITION`: + +- `Developer`: 免费开发版本(推荐用于开发环境) +- `Express`: 免费轻量版本 +- `Standard`: 标准版 +- `Enterprise`: 企业版 + +### 资源限制 + +默认配置: +- CPU限制: 4核心 +- 内存限制: 8GB +- 数据目录: `./sqlserver/data` +- 日志目录: `./sqlserver/logs` + +### 网络配置 + +- 默认端口: 1433 +- 网络子网: 172.24.0.0/16 +- 容器间通信: 通过 `sqlserver-net` 网络 + +## 初始化脚本说明 + +### 01-create-database.sql +- 创建 `SampleDB` 示例数据库 +- 创建 `Users` 示例表 +- 插入示例数据 +- 创建 `GetActiveUsers` 存储过程 + +### 02-create-user.sql +- 创建 `appuser` 应用程序用户 +- 配置用户权限 +- 授予必要的数据库权限 + +### 03-performance-config.sql +- 配置最大内存使用量 +- 设置最大并行度 +- 启用查询存储 +- 创建性能监控视图 + +## 常用操作 + +### 备份数据库 + +```bash +# 创建备份 +docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -Q "BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/backup/SampleDB.bak'" +``` + +### 恢复数据库 + +```bash +# 恢复备份 +docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -Q "RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/backup/SampleDB.bak'" +``` + +### 查看性能统计 + +```bash +# 查看性能统计 +docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -d SampleDB -Q "SELECT * FROM PerformanceStats" +``` + +### 停止和清理 + +```bash +# 停止服务 +docker-compose -f docker-compose-sqlserver.yml down + +# 停止并删除数据卷(谨慎使用) +docker-compose -f docker-compose-sqlserver.yml down -v +``` + +## 故障排除 + +### 常见问题 + +1. **容器启动失败** + - 检查密码是否符合复杂度要求 + - 确保端口没有被占用 + - 查看容器日志: `docker-compose logs sqlserver` + +2. **连接失败** + - 确认防火墙设置 + - 检查网络配置 + - 验证用户名和密码 + +3. **性能问题** + - 调整内存限制 + - 检查磁盘空间 + - 查看性能监控视图 + +### 日志查看 + +```bash +# 查看SQL Server日志 +docker-compose -f docker-compose-sqlserver.yml logs sqlserver + +# 查看系统日志 +docker exec -it sqlserver-2022 cat /var/opt/mssql/log/errorlog +``` + +## 安全建议 + +1. **修改默认密码**: 使用强密码 +2. **限制网络访问**: 配置防火墙规则 +3. **定期备份**: 设置自动备份策略 +4. **监控访问**: 启用审计日志 +5. **更新补丁**: 定期更新SQL Server镜像 + +## 扩展功能 + +### 添加更多数据库 + +在 `sqlserver/init/` 目录下创建新的 `.sql` 文件,它们将按文件名顺序执行。 + +### 集成其他服务 + +可以将此SQL Server配置集成到现有的Docker Compose网络中: + +```yaml +networks: + - your-existing-network +``` + +## 许可证 + +SQL Server 2022 Developer Edition 可免费用于开发和测试环境。生产环境请确保使用适当的许可证。 + +## 支持 + +如有问题,请查看: +- [SQL Server 2022 官方文档](https://docs.microsoft.com/en-us/sql/sql-server/) +- [Docker Hub SQL Server 页面](https://hub.docker.com/_/microsoft-mssql-server) diff --git a/DockerComposeShells/docker-compose-sqlserver.yml b/DockerComposeShells/docker-compose-sqlserver.yml new file mode 100644 index 0000000..ae18886 --- /dev/null +++ b/DockerComposeShells/docker-compose-sqlserver.yml @@ -0,0 +1,91 @@ +version: '3.8' + +services: + sqlserver: + image: mcr.microsoft.com/mssql/server:2022-latest + container_name: sqlserver-2022 + hostname: sqlserver-2022 + restart: unless-stopped + privileged: true + ports: + - "${SQLSERVER_PORT}:1433" + environment: + - ACCEPT_EULA=Y + - SA_PASSWORD=${SQLSERVER_SA_PASSWORD} + - MSSQL_PID=${SQLSERVER_EDITION} + - TZ=Asia/Shanghai + volumes: + - sqlserver-data:/var/opt/mssql + - sqlserver-logs:/var/opt/mssql/log + - ./sqlserver/init:/docker-entrypoint-initdb.d + - ./sqlserver/backup:/var/opt/mssql/backup + deploy: + resources: + limits: + cpus: "4.0" + memory: 8g + reservations: + cpus: "2.0" + memory: 4g + networks: + - sqlserver-net + healthcheck: + test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQLSERVER_SA_PASSWORD} -Q 'SELECT 1' || exit 1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s + stdin_open: true + tty: true + + # SQL Server Management Studio (可选,基于Web的管理界面) + sqlserver-web: + image: mcr.microsoft.com/mssql/server:2022-latest + container_name: sqlserver-web + hostname: sqlserver-web + restart: unless-stopped + ports: + - "${SQLSERVER_WEB_PORT}:8080" + environment: + - ACCEPT_EULA=Y + - SA_PASSWORD=${SQLSERVER_SA_PASSWORD} + - MSSQL_PID=${SQLSERVER_EDITION} + - TZ=Asia/Shanghai + volumes: + - ./sqlserver/web-config:/var/opt/mssql/web-config + depends_on: + sqlserver: + condition: service_healthy + networks: + - sqlserver-net + command: > + /bin/bash -c " + # 安装SQL Server Web管理工具 + apt-get update && apt-get install -y curl wget && + # 这里可以添加Web管理界面的安装脚本 + echo 'SQL Server Web management interface ready' && + tail -f /dev/null + " + +networks: + sqlserver-net: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.24.0.0/16 + gateway: 172.24.0.1 + +volumes: + sqlserver-data: + driver: local + driver_opts: + type: none + o: bind + device: ./sqlserver/data + sqlserver-logs: + driver: local + driver_opts: + type: none + o: bind + device: ./sqlserver/logs diff --git a/DockerComposeShells/sqlserver.env b/DockerComposeShells/sqlserver.env new file mode 100644 index 0000000..095ce8a --- /dev/null +++ b/DockerComposeShells/sqlserver.env @@ -0,0 +1,40 @@ +# SQL Server 2022 Linux Docker Compose 环境变量配置 + +# SQL Server 配置 +# 端口配置 +SQLSERVER_PORT=1433 +SQLSERVER_WEB_PORT=8080 + +# 认证配置 +# SA用户密码(请修改为强密码) +SQLSERVER_SA_PASSWORD=YourStrong@Password123! + +# SQL Server 版本配置 +# 可选值: Developer, Express, Standard, Enterprise, EnterpriseCore +# Developer: 免费开发版本 +# Express: 免费轻量版本 +# Standard: 标准版 +# Enterprise: 企业版 +SQLSERVER_EDITION=Developer + +# 时区配置 +TZ=Asia/Shanghai + +# 资源限制配置 +# CPU限制(核心数) +SQLSERVER_CPU_LIMIT=4.0 +SQLSERVER_CPU_RESERVATION=2.0 + +# 内存限制(GB) +SQLSERVER_MEMORY_LIMIT=8g +SQLSERVER_MEMORY_RESERVATION=4g + +# 数据目录配置 +SQLSERVER_DATA_DIR=./sqlserver/data +SQLSERVER_LOG_DIR=./sqlserver/logs +SQLSERVER_BACKUP_DIR=./sqlserver/backup +SQLSERVER_INIT_DIR=./sqlserver/init + +# 网络配置 +SQLSERVER_NETWORK_SUBNET=172.24.0.0/16 +SQLSERVER_NETWORK_GATEWAY=172.24.0.1 diff --git a/DockerComposeShells/sqlserver/init/01-create-database.sql b/DockerComposeShells/sqlserver/init/01-create-database.sql new file mode 100644 index 0000000..0c6a153 --- /dev/null +++ b/DockerComposeShells/sqlserver/init/01-create-database.sql @@ -0,0 +1,75 @@ +-- SQL Server 2022 初始化脚本 +-- 创建示例数据库和用户 + +-- 创建示例数据库 +IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'SampleDB') +BEGIN + CREATE DATABASE SampleDB; + PRINT '数据库 SampleDB 创建成功'; +END +ELSE +BEGIN + PRINT '数据库 SampleDB 已存在'; +END +GO + +-- 使用 SampleDB 数据库 +USE SampleDB; +GO + +-- 创建示例表 +IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='Users' AND xtype='U') +BEGIN + CREATE TABLE Users ( + Id INT IDENTITY(1,1) PRIMARY KEY, + Username NVARCHAR(50) NOT NULL UNIQUE, + Email NVARCHAR(100) NOT NULL, + CreatedDate DATETIME2 DEFAULT GETDATE(), + IsActive BIT DEFAULT 1 + ); + PRINT '表 Users 创建成功'; +END +ELSE +BEGIN + PRINT '表 Users 已存在'; +END +GO + +-- 插入示例数据 +IF NOT EXISTS (SELECT * FROM Users WHERE Username = 'admin') +BEGIN + INSERT INTO Users (Username, Email) VALUES + ('admin', 'admin@example.com'), + ('user1', 'user1@example.com'), + ('user2', 'user2@example.com'); + PRINT '示例数据插入成功'; +END +ELSE +BEGIN + PRINT '示例数据已存在'; +END +GO + +-- 创建存储过程 +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'GetActiveUsers') +BEGIN + EXEC(' + CREATE PROCEDURE GetActiveUsers + AS + BEGIN + SET NOCOUNT ON; + SELECT Id, Username, Email, CreatedDate + FROM Users + WHERE IsActive = 1 + ORDER BY CreatedDate DESC; + END + '); + PRINT '存储过程 GetActiveUsers 创建成功'; +END +ELSE +BEGIN + PRINT '存储过程 GetActiveUsers 已存在'; +END +GO + +PRINT 'SQL Server 初始化完成!'; diff --git a/DockerComposeShells/sqlserver/init/02-create-user.sql b/DockerComposeShells/sqlserver/init/02-create-user.sql new file mode 100644 index 0000000..b6f8234 --- /dev/null +++ b/DockerComposeShells/sqlserver/init/02-create-user.sql @@ -0,0 +1,43 @@ +-- 创建应用程序用户和权限配置 + +-- 创建应用程序用户 +IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = 'appuser') +BEGIN + CREATE LOGIN appuser WITH PASSWORD = 'AppUser@Password123!'; + PRINT '登录用户 appuser 创建成功'; +END +ELSE +BEGIN + PRINT '登录用户 appuser 已存在'; +END +GO + +-- 在 SampleDB 数据库中创建用户 +USE SampleDB; +GO + +IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'appuser') +BEGIN + CREATE USER appuser FOR LOGIN appuser; + PRINT '数据库用户 appuser 创建成功'; +END +ELSE +BEGIN + PRINT '数据库用户 appuser 已存在'; +END +GO + +-- 授予权限 +-- 授予对 Users 表的读写权限 +GRANT SELECT, INSERT, UPDATE, DELETE ON Users TO appuser; +PRINT '授予 Users 表权限成功'; + +-- 授予执行存储过程的权限 +GRANT EXECUTE ON GetActiveUsers TO appuser; +PRINT '授予存储过程执行权限成功'; + +-- 授予创建表的权限(如果需要) +GRANT CREATE TABLE TO appuser; +PRINT '授予创建表权限成功'; + +PRINT '用户权限配置完成!'; diff --git a/DockerComposeShells/sqlserver/init/03-performance-config.sql b/DockerComposeShells/sqlserver/init/03-performance-config.sql new file mode 100644 index 0000000..d16d333 --- /dev/null +++ b/DockerComposeShells/sqlserver/init/03-performance-config.sql @@ -0,0 +1,60 @@ +-- SQL Server 性能优化配置 + +-- 启用即时文件初始化(需要重启服务) +EXEC sp_configure 'show advanced options', 1; +RECONFIGURE; +EXEC sp_configure 'xp_cmdshell', 1; +RECONFIGURE; +PRINT '高级选项已启用'; + +-- 配置最大内存使用量(根据容器内存限制调整) +-- 这里设置为4GB,可以根据实际需要调整 +EXEC sp_configure 'max server memory (MB)', 4096; +RECONFIGURE; +PRINT '最大内存设置为 4GB'; + +-- 配置最大并行度(根据CPU核心数调整) +EXEC sp_configure 'max degree of parallelism', 4; +RECONFIGURE; +PRINT '最大并行度设置为 4'; + +-- 启用查询存储(SQL Server 2016+) +USE SampleDB; +GO + +-- 启用查询存储 +ALTER DATABASE SampleDB SET QUERY_STORE = ON; +ALTER DATABASE SampleDB SET QUERY_STORE ( + OPERATION_MODE = READ_WRITE, + CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), + DATA_FLUSH_INTERVAL_SECONDS = 900, + INTERVAL_LENGTH_MINUTES = 60, + MAX_STORAGE_SIZE_MB = 1000, + QUERY_CAPTURE_MODE = AUTO, + SIZE_BASED_CLEANUP_MODE = AUTO +); +PRINT '查询存储已启用'; + +-- 创建性能监控视图 +USE SampleDB; +GO + +IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'PerformanceStats') +BEGIN + EXEC(' + CREATE VIEW PerformanceStats AS + SELECT + GETDATE() AS CheckTime, + (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS ActiveConnections, + (SELECT COUNT(*) FROM sys.dm_exec_requests WHERE status IN (''running'', ''runnable'', ''suspended'')) AS ActiveRequests, + (SELECT SUM(pages_kb) FROM sys.dm_os_memory_clerks WHERE type = ''MEMORYCLERK_SQLBUFFERPOOL'') / 1024 AS BufferPoolMB + '); + PRINT '性能监控视图创建成功'; +END +ELSE +BEGIN + PRINT '性能监控视图已存在'; +END +GO + +PRINT '性能优化配置完成!'; diff --git a/DockerComposeShells/start-sqlserver.sh b/DockerComposeShells/start-sqlserver.sh new file mode 100644 index 0000000..4dd4750 --- /dev/null +++ b/DockerComposeShells/start-sqlserver.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# SQL Server 2022 Linux Docker Compose 启动脚本 + +echo "==========================================" +echo "SQL Server 2022 Linux Docker Compose 启动脚本" +echo "==========================================" + +# 检查是否存在环境变量文件 +if [ ! -f ".env" ]; then + echo "警告: 未找到 .env 文件" + echo "正在从 sqlserver.env 创建 .env 文件..." + cp sqlserver.env .env + echo "请编辑 .env 文件,特别是修改 SQLSERVER_SA_PASSWORD" + echo "然后重新运行此脚本" + exit 1 +fi + +# 检查Docker是否运行 +if ! docker info > /dev/null 2>&1; then + echo "错误: Docker 未运行,请先启动 Docker" + exit 1 +fi + +# 检查Docker Compose是否可用 +if ! command -v docker-compose &> /dev/null; then + echo "错误: docker-compose 未安装" + exit 1 +fi + +echo "正在启动 SQL Server 2022..." +echo "" + +# 创建必要的目录 +echo "创建目录结构..." +mkdir -p sqlserver/data sqlserver/logs sqlserver/backup sqlserver/web-config + +# 启动服务 +echo "启动 Docker Compose 服务..." +docker-compose -f docker-compose-sqlserver.yml --env-file .env up -d + +# 等待服务启动 +echo "等待 SQL Server 启动..." +sleep 10 + +# 检查服务状态 +echo "" +echo "检查服务状态..." +docker-compose -f docker-compose-sqlserver.yml ps + +echo "" +echo "==========================================" +echo "启动完成!" +echo "==========================================" +echo "" +echo "连接信息:" +echo " 服务器: localhost" +echo " 端口: $(grep SQLSERVER_PORT .env | cut -d'=' -f2)" +echo " 用户名: sa" +echo " 密码: $(grep SQLSERVER_SA_PASSWORD .env | cut -d'=' -f2)" +echo " 示例数据库: SampleDB" +echo "" +echo "常用命令:" +echo " 查看日志: docker-compose -f docker-compose-sqlserver.yml logs -f sqlserver" +echo " 停止服务: docker-compose -f docker-compose-sqlserver.yml down" +echo " 进入容器: docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P '$(grep SQLSERVER_SA_PASSWORD .env | cut -d'=' -f2)'" +echo "" +echo "详细说明请查看 SQLServer-README.md"